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-snum命令列格式 --start-page=#類型 數值 預設值 0從此頁碼開始。範例用法
innochecksum --start-page=600 ../data/test/tab1.ibd或
innochecksum -s 600 ../data/test/tab1.ibd--end-page=,num-enum命令列格式 --end-page=#類型 數值 預設值 0最小值 0最大值 18446744073709551615以此頁碼結束。範例用法
innochecksum --end-page=700 ../data/test/tab1.ibd或
innochecksum --p 700 ../data/test/tab1.ibd--page=,num-pnum命令列格式 --page=#類型 整數 預設值 0僅檢查此頁碼。範例用法
innochecksum --page=701 ../data/test/tab1.ibd--strict-check,-C命令列格式 --strict-check=algorithm類型 列舉 預設值 crc32有效值 innodbcrc32none指定嚴格的校驗和演算法。選項包括
innodb、crc32和none。在此範例中,指定了
innodb校驗和演算法innochecksum --strict-check=innodb ../data/test/tab1.ibd在此範例中,指定了
crc32校驗和演算法innochecksum -C crc32 ../data/test/tab1.ibd下列條件適用
如果您未指定
--strict-check選項,innochecksum 會針對innodb、crc32和none進行驗證。如果您指定
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=#類型 整數 預設值 0最小值 0最大值 18446744073709551615在 innochecksum 終止之前允許的最大檢查碼不符次數。預設設定為 0。如果
--allow-mismatches=N,其中,則允許N>=0N次不符,且 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-wnum命令列格式 --write=algorithm類型 列舉 預設值 crc32有效值 innodbcrc32none重寫檢查碼。在重寫無效的檢查碼時,必須將
--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類型 布林值 預設值 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類型 字串 預設值 [無]將表格空間中每個頁面的頁面類型資訊傾印至
stderr或stdout。範例用法: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 -在此範例中,innochecksum 將
crc32檢查碼演算法寫入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 選項定義系統表格空間的三個檔案:ibdata1、ibdata2 和 ibdata3。
./bin/mysqld --no-defaults --innodb-data-file-path="ibdata1:10M;ibdata2:10M;ibdata3:10M:autoextend"這三個檔案(ibdata1、ibdata2 和 ibdata3)構成一個邏輯系統表格空間。若要在構成一個邏輯系統表格空間的多個檔案上執行 innochecksum,innochecksum 需要使用 - 選項從標準輸入讀取表格空間檔案,這相當於串連多個檔案以建立單一檔案。針對上面提供的範例,將使用下列 innochecksum 命令:
cat ibdata* | innochecksum -請參閱 innochecksum 選項資訊,以取得有關 「-」 選項的詳細資訊。
在 Windows 作業系統上,不支援在同一個表格空間中的多個檔案上執行 innochecksum,因為 Windows Shell(例如 cmd.exe)不支援萬用字元模式展開。在 Windows 系統上,必須針對每個系統表格空間檔案分別執行 innochecksum。例如:
innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3