MySQL innodb 数据页一致性校验工具 innochecksum

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

发表评论