Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  innochecksum — Offline InnoDB File Checksum Utility

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

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

    指定严格的校验算法。选项包括 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

    Command-Line Format --no-check
    Type 布尔值
    Default Value false

    忽略校验验证时重写校验。这选项只能与 innochecksum --write 选项一起使用。如果未指定 --write 选项,innochecksum 将终止。

    在这个示例中,一个 innodb 校验被重写以替换无效的校验:

    innochecksum --no-check --write innodb ../data/test/tab1.ibd
  • --allow-mismatches, -a

    Command-Line Format --allow-mismatches=#
    Type 整数
    Default Value 0
    Minimum Value 0
    Maximum Value 18446744073709551615

    允许在innochecksum终止之前的最大校验和不匹配数。默认设置为 0。如果 --allow-mismatches=N,其中 N>=0,则允许 N 个不匹配,并在 N+1 处终止。innochecksum 在第一个校验和不匹配时终止。

    在这个示例中,现有的 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
  • --page-type-summary, -S

    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]

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

    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 -

    在这个示例中,innochecksumcrc32 校验算法写入 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
Note

在 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 选项定义三个文件:ibdata1ibdata2ibdata3

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

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

cat ibdata* | innochecksum -

请参阅 innochecksum 选项信息,以获取更多关于 - 选项的信息。

Note

在同一个表空间中运行innochecksum多个文件在Windows操作系统上不支持,因为Windows shells如cmd.exe不支持glob模式扩展。在Windows系统上,innochecksum必须为每个系统表空间文件单独运行。例如:

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