文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  innochecksum — 离线 InnoDB 文件校验工具

6.6.2 innochecksum — 离线 InnoDB 文件校验工具

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 option 指定日志文件。要开启 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

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

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

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

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

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

    适用以下条件

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

    • 如果您指定了 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, -a

    命令行格式 --allow-mismatches=#
    类型 整数
    默认值 0
    最小值 0
    最大值 18446744073709551615

    innochecksum 终止之前允许的最大校验和不匹配次数。默认设置是 0。如果 --allow-mismatches=N,其中 N>=0,允许 N 次不匹配,并且 innochecksumN+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 会获取一个排他锁。

    在这个示例中,一个 crc32 校验和被写入 tab1.ibd

    innochecksum -w crc32 ../data/test/tab1.ibd

    在这个示例中,一个 crc32 校验和被重写以替换一个无效的 crc32 校验和。

    innochecksum --no-check --write crc32 ../data/test/tab1.ibd
  • --page-type-summary, -S

    命令行格式 --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
    类型 字符串
    默认值 [无]

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

    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 -

    在这个示例中,innochecksumcrc32 校验和算法写入 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,因为 Windows shell(如 cmd.exe)不支持通配符模式扩展。在 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 选项定义了系统表空间的三个文件:ibdata1ibdata2ibdata3

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

这三个文件(ibdata1ibdata2ibdata3)构成一个逻辑系统表空间。要在构成一个逻辑系统表空间的多个文件上运行 innochecksuminnochecksum 需要 - 选项从标准输入读取表空间文件,这等效于连接多个文件以创建一个单一文件。对于上述示例,将使用以下 innochecksum 命令

cat ibdata* | innochecksum -

有关 - 选项的更多信息,请参阅 innochecksum 选项信息。

注意

在 Windows 操作系统上不支持在同一个表空间中的多个文件上运行 innochecksum,因为 Windows shell(如 cmd.exe)不支持通配符模式扩展。在 Windows 系统上,必须针对每个系统表空间文件单独运行 innochecksum。例如

innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3