• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • innochecksum 脱机InnoDB文件校验和实用程序

    innochecksum打印InnoDB文件的校验和。该工具读取InnoDB表空间文件,计算每个页面的校验和,将计算出的校验和与存储的校验和进行比较,并报告不匹配的情况,这表明页面已损坏。它最初是为加速断电后验证表空间文件的完整性而开发的,但也可以在文件复制后使用。因为校验和不匹配会导致InnoDB故意关闭正在运行的服务器,所以使用此工具而不是等待生产服务器遇到损坏的页面可能是更好的选择。

    innochecksum不能用于服务器已打开的表空间文件。对于此类文件,应使用CHECK TABLE检查表空间中的表。尝试在服务器已经打开的表空间上运行innochecksum,将导致“无法锁定文件”错误。

    如果发现校验和不匹配,通常可以从备份中还原表空间或启动服务器,然后尝试使用mysqldump对表空间中的表进行备份。

    像这样调用innochecksum

    shell>innochecksum [options] file_name
    

    innochecksum支持以下选项。对于引用页码的选项,这些数字从零开始。

    • --help-?

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

      shell>innochecksum --help
      
    • --info-I

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

      shell>innochecksum --info
      
    • --version-V

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

      shell>innochecksum --version
      
    • --verbose-v

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

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

      shell>innochecksum --count ../data/test/tab1.ibd
      
    • --start-page=num-s num

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

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

      要么:

      shell>innochecksum -s 600 ../data/test/tab1.ibd
      
    • --end-page=num-e num

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

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

      要么:

      shell>innochecksum --p 700 ../data/test/tab1.ibd
      
    • --page=num-p num

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

      shell>innochecksum --page=701 ../data/test/tab1.ibd
      
    • --strict-check-C

      指定严格的校验和算法。选项包括innodbcrc32,和none

      在此示例中,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
      
    • --allow-mismatches-

      innochecksum终止之前允许的最大校验和不匹配数。默认设置为0。如果--allow-mismatches=N,其中N>=0N错配被允许和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,如果在600页和1000页文件不匹配另一个在700页,校验为0-599和601-699页进行更新。因为--allow-mismatches设置为1,校验和可以容忍第一个不匹配,并终止于第二个不匹配,从而使第600页和第700-999页保持不变。

    • --write=name-w num

      重写校验和。重写无效的校验和时,该--no-check选项必须与--write选项一起使用。该--no-check选项告诉innochecksum忽略无效校验和的验证。--no-check如果当前校验和有效,则不必指定该选项。

      使用该--write选项时必须指定算法。该--write选项的可能值为:

      • innodb:使用的原始算法,在软件中计算出的校验和InnoDB
      • crc32:使用crc32算法计算出的校验和,可能需要借助硬件来完成。
      • none:一个常数。

      --write选项将整个页面重写到磁盘。如果新的校验和与现有的校验和相同,则不会将新的校验和写入磁盘以最小化I / O。

      --write使用该选项时, innochecksum获得排他锁。

      在这个例子中,crc32校验和写为tab1.ibd

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

      在此示例中,crc32校验和被重写以替换无效的crc32校验和:

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

      在表空间中显示每种页面类型的计数。用法示例:

      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
      
    • --page-type-dump-D

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

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

      innochecksum工具的日志输出。必须提供日志文件名。日志输出包含每个表空间页面的校验和值。对于未压缩的表,还提供了LSN值。在--log替换--debug选项,这是早期版本中提供。用法示例:

      shell>innochecksum --log=/tmp/log.txt ../data/test/tab1.ibd
      

      要么:

      shell>innochecksum -l /tmp/log.txt ../data/test/tab1.ibd
      
    • -选项。

      指定-从标准输入读取的选项。如果期望“从标准中读取”-时缺少该选项,则innochecksum将输出innochecksum使用信息,指示省略了“- ”选项。用法示例:

      shell>cat t1.ibd | innochecksum -
      

      在此示例中,innochecksum写入crc32校验和算法.ibd而不更改原始t1.ibd文件。

      shell>cat t1.ibd | innochecksum --write=crc32 - >  .ibd
      

    在多个用户定义的表空间文件上运行innochecksum

    以下示例演示如何在多个用户定义的表空间文件(个文件)上运行innochecksum.ibd

    对“ test ”数据库中的所有表空间()文件运行innochecksum.ibd

    shell>innochecksum ./data/test/*.ibd
    

    对文件名以“ t ”开头的所有表空间文件(.ibd文件)运行innochecksum

    shell>innochecksum ./data/test/t*.ibd
    

    对目录中的所有表空间文件(文件)运行innochecksum.ibddat

    shell>innochecksum ./data/*/*.ibd
    
    注意

    Windows操作系统不支持在多个用户定义的表空间文件上运行innochecksum,因为Windows外壳(例如cmd.exe)不支持glob模式扩展。在Windows系统上,必须为每个用户定义的表空间文件分别运行innochecksum。例如:

    cmd> innochecksum.exe t1.ibd
    cmd> innochecksum.exe t2.ibd
    cmd> innochecksum.exe t3.ibd
    

    在多个系统表空间文件上运行innochecksum

    默认情况下,只有一个InnoDB系统表空间文件(ibdata1),但是可以使用该innodb_data_file_path选项定义系统表空间的多个文件。在下面的例子中,三个文件系统表空间使用的定义innodb_data_file_path选项:ibdata1ibdata2,和ibdata3

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

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

    shell>cat ibdata* | innochecksum -
    

    有关“- ”选项的更多信息,请参考innochecksum选项信息。

    注意

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

    cmd> innochecksum.exe ibdata1
    cmd> innochecksum.exe ibdata2
    cmd> innochecksum.exe ibdata3