MySQL innochecksum 工具主要用于MySQL innodb表空间文件数据一致性的校验,通过读取表空间文件,计算页的checksum值,将计算的结果与页内存储的checksum值进行对比,检查对比结果是否一致,如果不一致,说明文件页可能发生了损坏,innochecksum工具同时提供了checksum校验值修复功能,能够将页checksum值不正确的页进行修复。
只能离线校验:
innochecksum只能用来离线校验innodb文件,如果文件已经被mysql server打开,则会报错,报错信息通常如下:
Error: Unable to lock file::/data/mysql/data_5.7.19/ibdata1
fcntl: Resource temporarily unavailable
源码文件:
innochecksum源码文件位于extra/innochecksum.cc,编译生成可执行文件innochecksum。下面将基于MySQL 5.7版本的innochecksum进行介绍。
主要参数:
- –count,-c,返回表空间文件总的页数量
- –start-page=num, -s num,校验的起始页
- –end-page=num, -e num,校验的结束页
- –page=num, -p num,校验指定页
- –strict-check, -C,指定校验算法,只能指定为 innodb, crc32 或 none
- –no-check, -n,忽略checksum值校验,直接重写checksum值,这个参数通常和 –write参数一起使用
- –write=name, -w name,重写有效的checksum值,必须指定校验算法,innodb, crc32 或 none
- –allow-mismatches=num, -a num,允许checksum值校验不匹配的最大次数,超过这个次数,innochecksum终止继续校验
- –page-type-summary, -S,显示不同页类型的数量
- –page-type-dump, -D,把表空间中的页类型信息输出到文件或者标准输出
- –log, -l,指定日志文件,innochecksum执行过程中的日志信息输出到日志文件中
下面是-c和-S参数的示例,如下:
[root@localhost extra]# ./innochecksum -c /data/mysql/data_5.7.19/ibdata1 Number of pages:768 [root@localhost extra]# ./innochecksum -S /data/mysql/data_5.7.19/ibdata1 File::/data/mysql/data_5.7.19/ibdata1 ================PAGE TYPE SUMMARY============== #PAGE_COUNT PAGE_TYPE =============================================== 19 Index page 232 Undo log page 4 Inode page 0 Insert buffer free list page 412 Freshly allocated page 1 Insert buffer bitmap 98 System page 1 Transaction system page 1 File Space Header 0 Extent descriptor page 0 BLOB page 0 Compressed BLOB page 0 Other type of page =============================================== Additional information: Undo page type: 142 insert, 90 update, 0 other Undo page state: 0 active, 179 cached, 2 to_free, 0 to_purge, 0 prepared, 51 other
举个例子,修复页校验值:
第一步,人为制造checksum值不一致:
一个页的前4个字节存储了这个页的校验值,首先人为制造页校验值损坏,把第一个页的前4个字节修改成一个无效的值。比如下面把校验值由0xcc5535c6修改为0x61616161。
第二步,检测chekcsum值不一致:
通过innochecksum计算校验值,发现page 0是无效的。
innochecksum /data/mysql/data_5.7.19/ibdata1
Fail: page 0 invalid
Exceeded the maximum allowed checksum mismatch count::0
第三步,修复checksum值:
再使用innochecksum进行修复。
innochecksum -w crc32 -n /data/mysql/data_5.7.19/ibdata1
修复完成后,再看一下前4个字节的checksum值,已经恢复成了0xcc5535c6。
如下图:
[root@localhost extra]# hexdump -n 4 -C /data/mysql/data_5.7.19/ibdata1 00000000 cc 55 35 c6 |.U5.| 00000004 [root@localhost extra]# hexdump -n 4 -C /data/mysql/data_5.7.19/ibdata1 00000000 61 61 61 61 |aaaa| 00000004 [root@localhost extra]# ./innochecksum /data/mysql/data_5.7.19/ibdata1 Fail: page 0 invalid Exceeded the maximum allowed checksum mismatch count::0 [root@localhost extra]# ./innochecksum -w crc32 -n /data/mysql/data_5.7.19/ibdata1 [root@localhost extra]# ./innochecksum /data/mysql/data_5.7.19/ibdata1 [root@localhost extra]# hexdump -n 4 -C /data/mysql/data_5.7.19/ibdata1 00000000 cc 55 35 c6 |.U5.| 00000004
最后:
innochecksum工具提供了非常简单、实用的方式来检查innodb表空间文件是否有效,同时提供了校验值修复功能,此外也可以通过这个工具,分析表空间文件中各种页类型的数量,对于理解innodb表空间文件结构有一定的帮助作用。