文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  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 選項指定記錄檔。若要開啟 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 次不符,且 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, -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