4.6.1 innochecksum —脱机 InnoDB 文件校验和 Util
innochecksum打印InnoDB
文件的校验和。此工具读取InnoDB
table 空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配项,这 table 明页面已损坏。它最初是为了在断电后加快验证 table 空间文件的完整性而开发的,但也可以在文件复制后使用。因为校验和不匹配会导致InnoDB
故意关闭正在运行的服务器,所以最好使用此工具,而不是 await 生产服务器遇到损坏的页面。
innochecksum无法用于服务器已打开的 table 空间文件。对于此类文件,应使用CHECK TABLE来检查 table 空间中的 table。尝试在服务器已打开的 table 空间上运行innochecksum会导致“无法锁定文件”错误。
如果发现校验和不匹配,则通常应从备份中还原 table 空间或启动服务器,然后尝试使用mysqldump对 table 空间中的 table 进行备份。
像这样调用innochecksum:
shell> innochecksum [options] file_name
innochecksum Options
innochecksum支持以下选项。对于引用页码的选项,这些数字从零开始。
- --help,
-?
显示命令行帮助。用法示例:
shell> innochecksum --help
- --info,
-I
--help的同义词。显示命令行帮助。用法示例:
shell> innochecksum --info
- --version,
-V
显示版本信息。用法示例:
shell> innochecksum --version
- --verbose,
-v
详细模式;每五秒钟将进度指示器打印到日志文件中一次。为了打印进度指示器,必须使用--log option
指定日志文件。要打开verbose
模式,请运行:
shell> innochecksum --verbose
要关闭详细模式,请运行:
shell> innochecksum --verbose=FALSE
可以同时指定--verbose
选项和--log
选项。例如:
shell> innochecksum --verbose --log=/var/lib/mysql/test/logtest.txt
要在日志文件中找到进度指示器信息,可以执行以下搜索:
shell> cat ./logtest.txt | grep -i "okay"
日志文件中的进度指示器信息类似于以下内容:
page 1663 okay: 2.863% done
page 8447 okay: 14.537% done
page 13695 okay: 23.568% done
page 18815 okay: 32.379% done
page 23039 okay: 39.648% done
page 28351 okay: 48.789% done
page 33023 okay: 56.828% done
page 37951 okay: 65.308% done
page 44095 okay: 75.881% done
page 49407 okay: 85.022% done
page 54463 okay: 93.722% done
...
- --count,
-c
打印文件中页数的计数并退出。用法示例:
shell> innochecksum --count ../data/test/tab1.ibd
- --start-page=num,
-s num
从此页码开始。用法示例:
shell> innochecksum --start-page=600 ../data/test/tab1.ibd
or:
shell> innochecksum -s 600 ../data/test/tab1.ibd
- --end-page=num,
-e num
在此页码结束。用法示例:
shell> innochecksum --end-page=700 ../data/test/tab1.ibd
or:
shell> innochecksum --p 700 ../data/test/tab1.ibd
- --page=num,
-p num
仅检查此页码。用法示例:
shell> innochecksum --page=701 ../data/test/tab1.ibd
- --strict-check,
-C
指定严格的校验和算法。选项包括innodb
,crc32
和none
。
在此示例中,指定了innodb
校验和算法:
shell> innochecksum --strict-check=innodb ../data/test/tab1.ibd
在此示例中,指定了crc32
校验和算法:
shell> innochecksum -C crc32 ../data/test/tab1.ibd
适用以下条件:
-
如果您未指定--strict-check选项,则innochecksum将针对
innodb
,crc32
和none
进行验证。-
如果指定
none
选项,则仅允许由none
生成的校验和。 -
如果指定
innodb
选项,则仅允许由innodb
生成的校验和。 -
如果指定
crc32
选项,则仅允许由crc32
生成的校验和。
-
-
--no-check,
-n
重写校验和时忽略校验和验证。此选项只能与innochecksum --write选项一起使用。如果未指定--write选项,则innochecksum将终止。
在此示例中,innodb
校验和被重写以替换无效的校验和:
shell> innochecksum --no-check --write innodb ../data/test/tab1.ibd
innochecksum终止之前允许的最大校验和不匹配数。默认设置为 0.如果--allow-mismatches=
* N
,则允许N>=0
, N
*不匹配,并且innochecksum终止于N+1
。当--allow-mismatches
设置为 0 时,innochecksum在第一个校验和不匹配时终止。
在此示例中,现有的innodb
校验和被重写以将--allow-mismatches
设置为 1.
shell> innochecksum --allow-mismatches=1 --write innodb ../data/test/tab1.ibd
将--allow-mismatches
设置为 1,如果在具有 1000 个页面的文件上,第 600 页有不匹配项,而在第 700 页有不匹配项,则校验和将更新为 0-599 页和 601-699 页。因为--allow-mismatches
设置为 1,所以校验和可以容忍第一个不匹配,并终止于第二个不匹配,从而使第 600 页和第 700-999 页保持不变。
- --write=name,
-w num
重写校验和。重写无效的校验和时,必须将--no-check选项与--write
选项一起使用。 --no-check选项告诉innochecksum忽略无效校验和的验证。如果当前校验和有效,则不必指定--no-check选项。
使用--write选项时必须指定算法。 --write
选项的可能值为:
-
innodb
:使用InnoDB
中的原始算法在软件中计算出的校验和。-
crc32
:使用crc32
算法计算出的校验和,可能需要借助硬件来完成。 -
none
:常数。
-
--write
选项将整个页面重写到磁盘。如果新的校验和与现有的校验和相同,则不会将新的校验和写入磁盘以最小化 I/O。
使用--write
选项时,innochecksum获得排他锁。
在此示例中,为crc32
写入了crc32
校验和:
shell> innochecksum -w crc32 ../data/test/tab1.ibd
在此示例中,crc32
校验和被重写以替换无效的crc32
校验和:
shell> innochecksum --no-check --write crc32 ../data/test/tab1.ibd
在 table 空间中显示每种页面类型的计数。用法示例:
shell> innochecksum --page-type-summary ../data/test/tab1.ibd
--page-type-summary
的示例输出:
File::../data/test/tab1.ibd
================PAGE TYPE SUMMARY==============
#PAGE_COUNT PAGE_TYPE
===============================================
2 Index page
0 Undo log page
1 Inode page
0 Insert buffer free list page
2 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
- --page-type-dump,
-D
将 table 空间中每个页面的页面类型信息转储到stderr
或stdout
。用法示例:
shell> innochecksum --page-type-dump=/tmp/a.txt ../data/test/tab1.ibd
- --log,
-l
innochecksum工具的日志输出。必须提供日志文件名。日志输出包含每个 table 空间页的校验和值。对于未压缩的 table,还提供了 LSN 值。 --log替换了--debug
选项,该选项在早期版本中可用。用法示例:
shell> innochecksum --log=/tmp/log.txt ../data/test/tab1.ibd
or:
shell> innochecksum -l /tmp/log.txt ../data/test/tab1.ibd
指定-
选项以从标准 Importing 中读取。如果期望“从标准 Importing 中读取”时缺少-
选项,则innochecksum将输出innochecksum使用信息,指示省略了“-”选项。用法示例:
shell> cat t1.ibd | innochecksum -
在此示例中,innochecksum将crc32
校验和算法写入a.ibd
而不更改原始t1.ibd
文件。
shell> cat t1.ibd | innochecksum --write=crc32 - > a.ibd
在多个用户定义的 table 空间文件上运行 innochecksum
下面的示例演示如何在多个用户定义的 table 空间文件(.ibd
文件)上运行innochecksum。
对“测试”数据库中的所有 table 空间(.ibd
)文件运行innochecksum:
shell> innochecksum ./data/test/*.ibd
对文件名以“ t”开头的所有 table 空间文件(.ibd
个文件)运行innochecksum:
shell> innochecksum ./data/test/t*.ibd
对data
目录中的所有 table 空间文件(.ibd
个文件)运行innochecksum:
shell> innochecksum ./data/*/*.ibd
Note
Windowsos 不支持在多个用户定义的 table 空间文件上运行innochecksum,因为 cmd.exe 之类的 WindowsShell 程序不支持 glob 模式扩展。在 Windows 系统上,必须为每个用户定义的 table 空间文件分别运行innochecksum。例如:
cmd> innochecksum.exe t1.ibd
cmd> innochecksum.exe t2.ibd
cmd> innochecksum.exe t3.ibd
在多个系统 table 空间文件上运行 innochecksum
默认情况下,只有一个InnoDB
系统 table 空间文件(ibdata1
),但是可以使用innodb_data_file_path选项为系统 table 空间定义多个文件。在以下示例中,使用innodb_data_file_path选项定义了系统 table 空间的三个文件:ibdata1
,ibdata2
和ibdata3
。
shell> ./bin/mysqld --no-defaults --innodb-data-file-path="ibdata1:10M;ibdata2:10M;ibdata3:10M:autoextend"
这三个文件(ibdata1
,ibdata2
和ibdata3
)形成一个逻辑系统 table 空间。要在构成一个逻辑系统 table 空间的多个文件上运行innochecksum,innochecksum要求-
选项从标准 Importing 中读取 table 空间文件,这等效于将多个文件串联以创建一个文件。对于上面提供的示例,将使用以下innochecksum命令:
shell> cat ibdata* | innochecksum -
有关“-”选项的更多信息,请参阅innochecksum选项信息。
Note
Windowsos 不支持在同一 table 空间中的多个文件上运行innochecksum,因为 cmd.exe 之类的 Windows Shell 不支持 glob 模式扩展。在 Windows 系统上,必须为每个系统 table 空间文件单独运行innochecksum。例如:
cmd> innochecksum.exe ibdata1
cmd> innochecksum.exe ibdata2
cmd> innochecksum.exe ibdata3