Innochecksum - 离线InnoDB文件校验和工具

来自泡泡学习笔记
跳到导航 跳到搜索

innochecksum打印InnoDB文件的校验和。该工具读取InnoDB表空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配的情况,这些不匹配表示损坏的页面。它最初是为了加快停电后验证表空间文件的完整性而开发的,但也可以在文件复制后使用。由于校验和不匹配会导致InnoDB故意关闭正在运行的服务器,因此可能更可取的是使用此工具而不是等待生产服务器遇到损坏的页面。

innochecksum不能用于服务器已经打开的表空间文件。对于这样的文件,应该使用CHECK TABLE来检查表空间内的表。尝试在服务器已经打开的表空间上运行innochecksum会导致无法锁定文件的错误。

如果发现校验和不匹配,可以从备份中恢复表空间或启动服务器并尝试使用mysqldump对表空间内的表进行备份。


调用innochecksum如下:

innochecksum [options] file_name


在多个用户自定义表空间文件上运行innochecksum

以下示例演示了如何在多个用户自定义表空间文件(.ibd文件)上运行innochecksum。


在“test”数据库中为所有表空间(.ibd)文件运行innochecksum:

innochecksum ./data/test/*.ibd


为以“t”开头的所有表空间文件(.ibd文件)运行innochecksum:

innochecksum ./data/test/t*.ibd


在数据目录中为所有表空间文件(.ibd文件)运行innochecksum:

innochecksum ./data/*/*.ibd

注意

在Windows操作系统上,不支持在多个用户自定义表空间文件上运行innochecksum,因为Windows shells(如cmd.exe)不支持glob模式扩展。在Windows系统上,必须为每个用户自定义表空间文件单独运行innochecksum。例如:

innochecksum.exe t1.ibd
innochecksum.exe t2.ibd
innochecksum.exe t3.ibd


在多个系统表空间文件上运行innochecksum

默认情况下,只有一个InnoDB系统表空间文件(ibdata1),但可以使用innodb_data_file_path选项定义多个系统表空间文件。在以下示例中,使用innodb_data_file_path选项定义了三个系统表空间文件:ibdata1、ibdata2和ibdata3。

./bin/mysqld --no-defaults --innodb-data-file-path="ibdata1:10M;ibdata2:10M;ibdata3:10M:autoextend"


这三个文件(ibdata1、ibdata2和ibdata3)组成了一个逻辑系统表空间。要在形成一个逻辑系统表空间的多个文件中运行innochecksum,innochecksum需要从标准输入读取表空间文件,这相当于将多个文件连接起来创建一个单个文件。对于上面的示例,可以使用以下innochecksum命令:

cat ibdata* | innochecksum -

注意

在相同表空间中的多个文件上运行innochecksum在Windows操作系统上不受支持,因为Windows shells(如cmd.exe)不支持glob模式扩展。在Windows系统上,必须为每个系统表空间文件单独运行innochecksum。例如:

innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3