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表空间文件结构有一定的帮助作用。