innochecksum 列印 InnoDB 檔案的校驗和。此工具讀取 InnoDB 表空間檔案,計算每個頁面的校驗和,將計算出的校驗和與儲存的校驗和進行比較,並報告不符之處,這表示頁面已損壞。它最初是為了加速在停電後驗證表空間檔案的完整性而開發的,但也可以在檔案複製後使用。由於校驗和不符會導致 InnoDB 有意關閉正在執行的伺服器,因此最好使用此工具,而不是等待生產中的伺服器遇到損壞的頁面。
innochecksum 不能用於伺服器已開啟的表空間檔案。對於此類檔案,您應該使用 CHECK TABLE 來檢查表空間中的資料表。嘗試在伺服器已開啟的表空間上執行 innochecksum 會導致 Unable to lock file 錯誤。
如果發現校驗和不符,請從備份還原表空間,或啟動伺服器並嘗試使用 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=演算法類型 列舉 預設值 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=演算法類型 列舉 預設值 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=名稱類型 字串 預設值 [無]將表空間中每個頁面的頁面類型資訊轉儲到
stderr或stdout。使用範例:innochecksum --page-type-dump=/tmp/a.txt ../data/test/tab1.ibd--log,-l命令列格式 --log=路徑類型 檔案名稱 預設值 [無]用於 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)不支援 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 選項定義系統表空間的三個檔案: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) 不支援 glob 模式展開。在 Windows 系統上,必須為每個系統表空間檔案分別執行 innochecksum。例如:
innochecksum.exe ibdata1
innochecksum.exe ibdata2
innochecksum.exe ibdata3