innochecksum 打印 InnoDB 文件的校验和。该工具读取 InnoDB 表空间文件,计算每页的校验和,比较计算出的校验和与存储的校验和,并报告不匹配项,这些项表明页面损坏。它最初是为了加速验证表空间文件的完整性而开发的,但也可以在文件复制后使用。因为校验和不匹配会导致 InnoDB 故意关闭正在运行的服务器,因此可能更喜欢使用该工具,而不是等待生产服务器遇到损坏的页面。
innochecksum 不能用于服务器已经打开的表空间文件。对于这些文件,您应该使用 CHECK TABLE
来检查表空间中的表。尝试在服务器已经打开的表空间上运行 innochecksum 将导致 无法锁定文件 错误。
如果发现校验和不匹配,恢复表空间从备份或启动服务器并尝试使用 mysqldump 创建表空间中的表的备份。
使用以下方式调用 innochecksum:
innochecksum [options] file_name
innochecksum 选项
innochecksum 支持以下选项。对于引用页号的选项,页号是从零开始的。
-
--help
,-?
Command-Line Format --help
Type 布尔值 Default Value false
显示命令行帮助。示例用法:
innochecksum --help
-
--info
,-I
Command-Line Format --info
Type 布尔值 Default Value false
--help
的同义词。显示命令行帮助。示例用法:innochecksum --info
-
--version
,-V
Command-Line Format --version
Type 布尔值 Default Value false
显示版本信息。示例用法:
innochecksum --version
-
--verbose
,-v
Command-Line Format --verbose
Type 布尔值 Default Value false
详细模式;每五秒钟在日志文件中打印进度指示器。为了打印进度指示器,必须使用
--log 选项
指定日志文件。要启用详细模式,运行:innochecksum --verbose
要禁用详细模式,运行:
innochecksum --verbose=FALSE
可以同时指定
--verbose
选项和--log
选项。例如:innochecksum --verbose --log=/var/lib/mysql/test/logtest.txt
要在日志文件中定位进度指示器信息,可以执行以下搜索:
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
Command-Line Format --count
Type 基本名称 Default Value true
打印文件中的页数并退出。示例用法:
innochecksum --count ../data/test/tab1.ibd
-
--start-page=
,num
-s
num
Command-Line Format --start-page=#
Type 数字 Default Value 0
从这个页面号开始。示例用法:
innochecksum --start-page=600 ../data/test/tab1.ibd
或:
innochecksum -s 600 ../data/test/tab1.ibd
-
--end-page=
,num
-e
num
Command-Line Format --end-page=#
Type 数字 Default Value 0
Minimum Value 0
Maximum Value 18446744073709551615
在这个页面号结束。示例用法:
innochecksum --end-page=700 ../data/test/tab1.ibd
或:
innochecksum --p 700 ../data/test/tab1.ibd
-
--page=
,num
-p
num
Command-Line Format --page=#
Type 整数 Default Value 0
仅检查这个页面号。示例用法:
innochecksum --page=701 ../data/test/tab1.ibd
-
--strict-check
,-C
Command-Line Format --strict-check=algorithm
Type 枚举 Default Value crc32
Valid Values innodb
crc32
none
指定严格的校验算法。选项包括
innodb
、crc32
和none
。在这个示例中,指定了
innodb
校验算法:innochecksum --strict-check=innodb ../data/test/tab1.ibd
在这个示例中,指定了
crc32
校验算法:innochecksum -C crc32 ../data/test/tab1.ibd
以下条件适用:
-
如果您不指定
--strict-check
选项,innochecksum 将验证innodb
、crc32
和none
。 -
如果您指定
none
选项,只允许none
生成的校验。 -
如果您指定
innodb
选项,只允许innodb
生成的校验。 -
如果您指定
crc32
选项,只允许crc32
生成的校验。
-
-
--no-check
,-n
Command-Line Format --no-check
Type 布尔值 Default Value false
忽略校验验证时重写校验。这选项只能与 innochecksum
--write
选项一起使用。如果未指定--write
选项,innochecksum 将终止。在这个示例中,一个
innodb
校验被重写以替换无效的校验:innochecksum --no-check --write innodb ../data/test/tab1.ibd
-
Command-Line Format --allow-mismatches=#
Type 整数 Default Value 0
Minimum Value 0
Maximum Value 18446744073709551615
允许在innochecksum终止之前的最大校验和不匹配数。默认设置为 0。如果
--allow-mismatches=
,其中N
,则允许N
>=0N
个不匹配,并在
处终止。innochecksum 在第一个校验和不匹配时终止。N
+1在这个示例中,现有的
innodb
校验和被重写以设置--allow-mismatches
为 1。innochecksum --allow-mismatches=1 --write innodb ../data/test/tab1.ibd
使用
--allow-mismatches
设置为 1,如果在页面 600 和页面 700 上发现不匹配,并且文件有 1000 页,那么校验和将被更新到页面 0-599 和 601-699。因为--allow-mismatches
设置为 1,因此校验和容忍第一个不匹配,并在第二个不匹配时终止,留下页面 600 和页面 700-999 不变。 -
--write=
,name
-w
num
Command-Line Format --write=algorithm
Type 枚举 Default Value crc32
Valid Values innodb
crc32
none
重写校验和。当重写无效的校验和时,必须使用
--no-check
选项与--write
选项一起。--no-check
选项告诉 innochecksum 忽略无效校验和的验证。如果当前校验和有效,不需要指定--no-check
选项。使用
--write
选项时,必须指定算法。可能的--write
选项值为:-
innodb
:使用InnoDB
原始算法计算的校验和。 -
crc32
:使用crc32
算法计算的校验和,可能使用硬件辅助。 -
none
:一个常数。
使用
--write
选项将整个页面写入磁盘。如果新的校验和与现有的校验和相同,则新的校验和不会被写入磁盘,以最小化 I/O。innochecksum 在使用
--write
选项时获取独占锁。在这个示例中,为
tab1.ibd
写入crc32
校验和:innochecksum -w crc32 ../data/test/tab1.ibd
在这个示例中,将
crc32
校验和重写以替换无效的crc32
校验和:innochecksum --no-check --write crc32 ../data/test/tab1.ibd
-
-
Command-Line Format --page-type-summary
Type 布尔值 Default Value false
显示表空间中的每种页面类型的计数。示例用法:
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
Command-Line Format --page-type-dump=name
Type 字符串 Default Value [none]
将表空间中的每个页面的页面类型信息转储到
stderr
或stdout
。示例用法:innochecksum --page-type-dump=/tmp/a.txt ../data/test/tab1.ibd
-
--log
,-l
Command-Line Format --log=path
Type 文件名 Default Value [无]
日志输出为 innochecksum 工具。必须提供日志文件名。日志输出包含每个表空间页的校验值。对于未压缩的表,LSN 值也将被提供。示例用法:
innochecksum --log=/tmp/log.txt ../data/test/tab1.ibd
或:
innochecksum -l /tmp/log.txt ../data/test/tab1.ibd
-
指定
-
选项以从标准输入读取。如果缺少-
选项时期望“从标准输入读取”,则 innochecksum 将打印 innochecksum 使用信息,指出 “-” 选项被省略。示例用法:cat t1.ibd | innochecksum -
在这个示例中,innochecksum 将
crc32
校验算法写入a.ibd
,而不更改原始t1.ibd
文件。cat t1.ibd | innochecksum --write=crc32 - > a.ibd
在多个用户定义的表空间文件上运行 innochecksum
以下示例演示如何在多个用户定义的表空间文件 (.ibd
文件) 上运行 innochecksum。
运行 innochecksum 对于所有表空间 (.ibd
) 文件在 “test” 数据库中:
innochecksum ./data/test/*.ibd
运行 innochecksum 对于所有表空间文件 (.ibd
文件),其文件名以 “t” 开头:
innochecksum ./data/test/t*.ibd
运行 innochecksum 对于所有表空间文件 (.ibd
文件) 在 data
目录中:
innochecksum ./data/*/*.ibd
在 Windows 操作系统上,不支持在多个用户定义的表空间文件上运行 innochecksum,因为 Windows shells 如 cmd.exe 不支持 glob 模式扩展。在 Windows 系统上,innochecksum 必须单独运行每个用户定义的表空间文件。例如:
innochecksum.exe t1.ibd
innochecksum.exe t2.ibd
innochecksum.exe t3.ibd
在多个系统表空间文件上运行 innochecksum
默认情况下,只有一个 InnoDB
系统表空间文件 (ibdata1
),但可以使用 innodb_data_file_path
选项定义多个文件。例如,使用 innodb_data_file_path
选项定义三个文件:ibdata1
、ibdata2
和 ibdata3
。
./bin/mysqld --no-defaults --innodb-data-file-path="ibdata1:10M;ibdata2:10M;ibdata3:10M:autoextend"
这三个文件 (ibdata1
、ibdata2
和 ibdata3
) 形成一个逻辑系统表空间。要在多个文件上运行 innochecksum,需要使用 -
选项从标准输入读取表空间文件,这相当于将多个文件连接起来创建一个单个文件。对于上面的示例,以下 innochecksum 命令将被使用:
cat ibdata* | innochecksum -
请参阅 innochecksum 选项信息,以获取更多关于 “-” 选项的信息。
在同一个表空间中运行innochecksum多个文件在Windows操作系统上不支持,因为Windows shells如cmd.exe不支持glob模式扩展。在Windows系统上,innochecksum必须为每个系统表空间文件单独运行。例如:
innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3