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
指定嚴格的校驗和演算法。選項包括
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
-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
類型 布林值 預設值 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