4.6.1 innochecksum —脱机 InnoDB 文件校验和 Util

innochecksum打印InnoDB文件的校验和。此工具读取InnoDBtable 空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配项,这 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支持以下选项。对于引用页码的选项,这些数字从零开始。

显示命令行帮助。用法示例:

shell> innochecksum --help

--help的同义词。显示命令行帮助。用法示例:

shell> innochecksum --info

显示版本信息。用法示例:

shell> innochecksum --version

详细模式;每五秒钟将进度指示器打印到日志文件中一次。为了打印进度指示器,必须使用--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
...

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

shell> innochecksum --count ../data/test/tab1.ibd

从此页码开始。用法示例:

shell> innochecksum --start-page=600 ../data/test/tab1.ibd

or:

shell> innochecksum -s 600 ../data/test/tab1.ibd

在此页码结束。用法示例:

shell> innochecksum --end-page=700 ../data/test/tab1.ibd

or:

shell> innochecksum --p 700 ../data/test/tab1.ibd

仅检查此页码。用法示例:

shell> innochecksum --page=701 ../data/test/tab1.ibd

指定严格的校验和算法。选项包括innodbcrc32none

在此示例中,指定了innodb校验和算法:

shell> innochecksum --strict-check=innodb ../data/test/tab1.ibd

在此示例中,指定了crc32校验和算法:

shell> innochecksum -C crc32 ../data/test/tab1.ibd

适用以下条件:

  • 如果您未指定--strict-check选项,则innochecksum将针对innodbcrc32none进行验证。

    • 如果指定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 页保持不变。

重写校验和。重写无效的校验和时,必须将--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

将 table 空间中每个页面的页面类型信息转储到stderrstdout。用法示例:

shell> innochecksum --page-type-dump=/tmp/a.txt ../data/test/tab1.ibd

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 -

在此示例中,innochecksumcrc32校验和算法写入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 空间的三个文件:ibdata1ibdata2ibdata3

shell> ./bin/mysqld --no-defaults --innodb-data-file-path="ibdata1:10M;ibdata2:10M;ibdata3:10M:autoextend"

这三个文件(ibdata1ibdata2ibdata3)形成一个逻辑系统 table 空间。要在构成一个逻辑系统 table 空间的多个文件上运行innochecksuminnochecksum要求-选项从标准 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