innochecksum 打印 InnoDB
文件的校验和。此工具读取 InnoDB
表空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配,这表示页面已损坏。它最初是为了在断电后加快验证表空间文件的完整性而开发的,但也可以在文件复制后使用。因为校验和不匹配会导致 InnoDB
故意关闭正在运行的服务器,所以使用此工具可能比等待生产服务器遇到损坏的页面更可取。
innochecksum 不能用于服务器已打开的表空间文件。对于此类文件,您应该使用 CHECK TABLE
检查表空间内的表。尝试在服务器已打开的表空间上运行 innochecksum 会导致 无法锁定文件 错误。
如果发现校验和不匹配,请从备份恢复表空间或启动服务器并尝试使用 mysqldump 创建表空间内表的备份。
像这样调用 innochecksum
innochecksum [options] file_name
innochecksum 选项
innochecksum 支持以下选项。对于引用页码的选项,页码从零开始。
--help
,-?
命令行格式 --help
类型 布尔值 默认值 false
显示命令行帮助。用法示例
innochecksum --help
--info
,-I
命令行格式 --info
类型 布尔值 默认值 false
--help
的同义词。显示命令行帮助。用法示例innochecksum --info
--version
,-V
命令行格式 --version
类型 布尔值 默认值 false
显示版本信息。用法示例
innochecksum --version
--verbose
,-v
命令行格式 --verbose
类型 布尔值 默认值 false
详细模式;每五秒向日志文件打印一个进度指示器。为了打印进度指示器,必须使用
--log 选项
指定日志文件。要开启verbose
模式,请运行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
命令行格式 --count
类型 基本名称 默认值 true
打印文件中页数的计数并退出。用法示例
innochecksum --count ../data/test/tab1.ibd
--start-page=
,num
-s
num
命令行格式 --start-page=#
类型 数字 默认值 0
从此页码开始。用法示例
innochecksum --start-page=600 ../data/test/tab1.ibd
或者
innochecksum -s 600 ../data/test/tab1.ibd
--end-page=
,num
-e
num
命令行格式 --end-page=#
类型 数字 默认值 0
最小值 0
最大值 18446744073709551615
在此页码结束。用法示例
innochecksum --end-page=700 ../data/test/tab1.ibd
或者
innochecksum --p 700 ../data/test/tab1.ibd
--page=
,num
-p
num
命令行格式 --page=#
类型 整数 默认值 0
仅检查此页码。用法示例
innochecksum --page=701 ../data/test/tab1.ibd
--strict-check
,-C
命令行格式 --strict-check=algorithm
类型 枚举 默认值 crc32
有效值 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
命令行格式 --no-check
类型 布尔值 默认值 false
在重写校验和时,忽略校验和验证。此选项只能与 innochecksum
--write
选项一起使用。 如果未指定--write
选项,innochecksum 将终止。在此示例中,将重写
innodb
校验和以替换无效校验和innochecksum --no-check --write innodb ../data/test/tab1.ibd
-
命令行格式 --allow-mismatches=#
类型 整数 默认值 0
最小值 0
最大值 18446744073709551615
在 innochecksum 终止之前允许的校验和不匹配的最大数量。 默认设置为 0。如果
--allow-mismatches=
N
,其中
,则允许N
>=0N
个不匹配,并且 innochecksum 将在出现
个不匹配时终止。将N
+1--allow-mismatches
设置为 0 时,innochecksum 将在出现第一个校验和不匹配时终止。在此示例中,将重写现有的
innodb
校验和,以将--allow-mismatches
设置为 1。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
命令行格式 --write=algorithm
类型 枚举 默认值 crc32
有效值 innodb
crc32
none
重写校验和。 重写无效校验和时,必须将
--no-check
选项与--write
选项一起使用。--no-check
选项指示 innochecksum 忽略对无效校验和的验证。如果当前校验和有效,则无需指定--no-check
选项。使用
--write
选项时,必须指定算法。--write
选项的可能值为innodb
:使用InnoDB
中的原始算法,在软件中计算出的校验和。crc32
:使用crc32
算法计算出的校验和,可以使用硬件辅助计算。none
:常数。
--write
选项会将整个页面重写到磁盘。如果新校验和与现有校验和相同,则不会将新校验和写入磁盘,以最大程度地减少 I/O。使用
--write
选项时,innochecksum 将获取排他锁。在此示例中,将为
tab1.ibd
写入crc32
校验和innochecksum -w crc32 ../data/test/tab1.ibd
在此示例中,将重写
crc32
校验和以替换无效的crc32
校验和innochecksum --no-check --write crc32 ../data/test/tab1.ibd
-
命令行格式 --page-type-summary
类型 布尔值 默认值 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
命令行格式 --page-type-dump=name
类型 字符串 默认值 [无]
将表空间中每个页面的页面类型信息转储到
stderr
或stdout
。 使用示例innochecksum --page-type-dump=/tmp/a.txt ../data/test/tab1.ibd
--log
,-l
命令行格式 --log=path
类型 文件名 默认值 [无]
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。
为 “test” 数据库中的所有表空间(.ibd
)文件运行 innochecksum
innochecksum ./data/test/*.ibd
为文件名以 “t” 开头的所有表空间文件(.ibd
文件)运行 innochecksum
innochecksum ./data/test/t*.ibd
为 data
目录中的所有表空间文件(.ibd
文件)运行 innochecksum
innochecksum ./data/*/*.ibd
Windows 操作系统不支持对多个用户定义的表空间文件运行 innochecksum,因为 cmd.exe 等 Windows shell 不支持 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 需要使用 -
选项从标准输入读取表空间文件,这等效于连接多个文件以创建一个文件。 对于上面提供的示例,将使用以下 innochecksum 命令
cat ibdata* | innochecksum -
有关 “-” 选项的更多信息,请参阅 innochecksum 选项信息。
Windows 操作系统不支持对同一表空间中的多个文件运行 innochecksum,因为 cmd.exe 等 Windows shell 不支持 glob 模式扩展。 在 Windows 系统上,必须为每个系统表空间文件单独运行 innochecksum。 例如
innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3