mysql page校验_MySQL InnoDB离线校验工具innochecksum使用

innochecksum工具可以打印InnoDB文件的校验值,该工具读取InnoDB表空间文件,计算每个页面的校验值,将计算的校验值与存储的校验值进行比较,并报告指示损坏页面的不匹配。它最初是为了加速验证断电后表空间文件的完整性而开发的,也可以在文件复制后使用。由于校验值不匹配导致InnoDB故意关闭正在运行的服务器,因此最好使用此工具而不是等待生产服务器遇到损坏的页面。从MySQL 5.7.2开始,innochecksum支持大于2GB的文件。先前,innochecksum只支持最大2GB的文件。

从MySQL 5.7.2开始,innochecksum支持包含压缩页面的表空间。

但需要注意的是,innochecksum不能用于服务器已经打开的表空间文件。对于这样的文件,你应该使用CHECK TABLE检查表空间内的表。试图在服务器已打开的表空间上运行innochecksum将导致“Unable to lock file”错误。也就是说文件不可以打开 !换句话说,可能需要关闭实例才能使用如下功能!!!

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

innochecksum语法:

$ innochecksum [options] file_name

1

$innochecksum[options]file_name

常用选项:

1. –version, -V

显示版本信息。

2. –count, -c

打印文件中的页数并退出。用法示例:

$ innochecksum --count /var/lib/mysql/sbtest/sbtest1.ibd

Number of pages:15360

1

2

$innochecksum--count/var/lib/mysql/sbtest/sbtest1.ibd

Numberofpages:15360

3. –start-page=num, -s num

指定从某个页面开始校验。用法示例:

$ innochecksum --start-page=600 /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--start-page=600/var/lib/mysql/sbtest/sbtest1.ibd

4. –end-page=num, -e num

指定校验结束于此页面。用法示例:

$ innochecksum --end-page=600 /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--end-page=600/var/lib/mysql/sbtest/sbtest1.ibd

5. –page=num, -p num

只校验某个页面。用法示例:

$ innochecksum --page=701 /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--page=701/var/lib/mysql/sbtest/sbtest1.ibd

6. –strict-check, -C

指定一个严格的校验值算法。选项包括innodb,crc32和none。

如果不指定–strict-check选项,innochecksum验证innodb,crc32和none。如果指定了none选项,则只允许none生成的校验值。如果指定了innodb选项,则只允许innodb生成的校验值。如果指定了crc32选项,则只允许crc32生成的校验值。

7. –no-check, -n

重写校验值时忽略校验和验证,该选项只能与innochecksum –write选项一起使用。如果没有指定–write选项,innochecksum将终止。

在这个例子中,innodb校验值被重写以替换无效的校验值:

$ innochecksum --no-check --write innodb /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--no-check--writeinnodb/var/lib/mysql/sbtest/sbtest1.ibd

8. –allow-mismatches, -a

在innochecksum终止之前允许的校验值不匹配的最大数目,默认设置是0。如果–allow-mismatches=N,N>=0,N允许不匹配和innochecksum终止在N+1。当 –allow-mismatches设置为0时, innochecksum在第一个校验值不匹配时终止。

在这个例子中,–allow-mismatches为1,现有的innodb校验值被重写:

$ innochecksum --allow-mismatches=1 --write innodb /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--allow-mismatches=1--writeinnodb/var/lib/mysql/sbtest/sbtest1.ibd

随着–allow-mismatches设置为1,如果在600页和1000页文件不匹配,另一个在700页,校验为0-599和601-699页进行更新。由于–allow-mismatches设置为1,所以校验值可以容忍第一个不匹配,并在第二个不匹配时终止,从而使页面600和页面700-999保持不变。

当–allow-mismatches设置为1时,如果在文件的600页和700页与1000页之间存在不匹配,则会更新页0-599和601-699的校验值。因为–allow-mismatches设置为1,校验值可容忍第一个不匹配,并在第二个不匹配时终止,使页600和页700-999保持不变。

9. –write=name, -w num

重写页的校验值。通过innochecksum来修改页校验值是非常危险的操作,建议操作前备份。但若遇到页损毁的问题,可以通过该工具重写页的校验值。重写无效校验值时,–no-check选项必须和–write选项一起使用。该–no-check选项告诉innochecksum忽略验证无效的校验值。如果当前校验值有效,则不必指定选项。

使用该–write选项时必须指定一个算法。该–write选项的可能值是:

innodb:使用原始InnoDB算法从软件中计算校验值。

crc32:使用crc32算法计算的校验值,可能用硬件辅助完成。

none:一个常数。

该选项将整个页面重写到磁盘,如果新的校验值与现有的校验值相同,则新的校验值不会被写入到磁盘,以最小化I/O。当–write选项被使用时,innochecksum获得排他锁。

# 重写有效校验值的页;

$ innochecksum -w crc32 /var/lib/mysql/sbtest/sbtest.ibd

# 重写带有无效校验值的页;

$ innochecksum --no-check -w crc32 /var/lib/mysql/sbtest/sbtest.ibd

1

2

3

4

5

# 重写有效校验值的页;

$innochecksum-wcrc32/var/lib/mysql/sbtest/sbtest.ibd

# 重写带有无效校验值的页;

$innochecksum--no-check-wcrc32/var/lib/mysql/sbtest/sbtest.ibd

10. –page-type-summary, -S

在表空间中显示每个页面类型的计数。用法示例:

$ innochecksum --page-type-summary /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--page-type-summary/var/lib/mysql/sbtest/sbtest1.ibd

示例输出为:

File::/var/lib/mysql/sbtest/sbtest1.ibd

================PAGE TYPE SUMMARY==============

#PAGE_COUNT PAGE_TYPE

===============================================

14547 Index page

0 Undo log page

1 Inode page

0 Insert buffer free list page

810 Freshly allocated page

1 Insert buffer bitmap

0 System page

0 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: 0 insert, 0 update, 0 other

Undo page state: 0 active, 0 cached, 0 to_free, 0 to_purge, 0 prepared, 0 other

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

File::/var/lib/mysql/sbtest/sbtest1.ibd

================PAGETYPESUMMARY==============

#PAGE_COUNT     PAGE_TYPE

===============================================

14547Indexpage

0Undologpage

1Inodepage

0Insertbufferfreelistpage

810Freshlyallocatedpage

1Insertbufferbitmap

0Systempage

0Transactionsystempage

1FileSpaceHeader

0Extentdescriptorpage

0BLOBpage

0CompressedBLOBpage

0Othertypeofpage

===============================================

Additionalinformation:

Undopagetype:0insert,0update,0other

Undopagestate:0active,0cached,0to_free,0to_purge,0prepared,0other

11. –page-type-dump, -D

将表空间中的每个页面的页面类型信息转储到stderr或stdout。用法示例:

$ innochecksum --page-type-dump=/tmp/a.txt /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--page-type-dump=/tmp/a.txt/var/lib/mysql/sbtest/sbtest1.ibd

输出信息大概如下:

Filename::/var/lib/mysql/sbtest/sbtest1.ibd

==============================================================================

PAGE_NO | PAGE_TYPE | EXTRA INFO

==============================================================================

#:: 0 | File Space Header | -

#:: 1 | Insert Buffer Bitmap | -

#:: 2 | Inode page | -

#:: 3 | Index page | index id=764, page level=0, No. of records=7, garbage=0, -

#:: 4 | Freshly allocated page | -

#:: 5 | Freshly allocated page | -

1

2

3

4

5

6

7

8

9

10

Filename::/var/lib/mysql/sbtest/sbtest1.ibd

==============================================================================

PAGE_NO|PAGE_TYPE|EXTRAINFO

==============================================================================

#::       0             |               File Space Header               |       -

#::       1             |               Insert Buffer Bitmap            |       -

#::       2             |               Inode page                      |       -

#::       3             |               Index page                      |       index id=764, page level=0, No. of records=7, garbage=0, -

#::       4             |               Freshly allocated page          |       -

#::       5             |               Freshly allocated page          |       -

12. –log, -l

innochecksum工具日志输出,必须提供日志文件名称。日志输出包含每个表空间页面的校验值。对于未压缩的表格,还提供了LSN值。用法示例:

$ innochecksum --log=/tmp/log.txt /var/lib/mysql/sbtest/sbtest1.ibd

1

$innochecksum--log=/tmp/log.txt/var/lib/mysql/sbtest/sbtest1.ibd

PS:有些数据库进行升级时,大部分用户选择的都是原地升级,因此虽然数据库版本升级到了5.6,而页的格式却还是之前的老版本。这不会对数据库产生任何影响,因为InnoDB默认的处理方式就是兼容原来的方式,只是在写入新页时才会用新的crc32算法更新页的校验值。因此,若想要完全升级数据库,享受素有的性能提升优化点,或许还需要更新新页的校验值,并将参数innodb_checksum_algorithm设置为strict_crc32。而这可以通过innochecksum来完成。通过innochecksum来修改页校验值是非常危险的操作,建议操作前备份。但若遇到页损毁的问题,可以通过该工具重写页的校验值。

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值