mysql page校验_MySQL InnoDB离线校验工具innochecksum使用
innochecksum工具可以打印InnoDB文件的校驗(yàn)值,該工具讀取InnoDB表空間文件,計(jì)算每個(gè)頁(yè)面的校驗(yàn)值,將計(jì)算的校驗(yàn)值與存儲(chǔ)的校驗(yàn)值進(jìn)行比較,并報(bào)告指示損壞頁(yè)面的不匹配。它最初是為了加速驗(yàn)證斷電后表空間文件的完整性而開(kāi)發(fā)的,也可以在文件復(fù)制后使用。由于校驗(yàn)值不匹配導(dǎo)致InnoDB故意關(guān)閉正在運(yùn)行的服務(wù)器,因此最好使用此工具而不是等待生產(chǎn)服務(wù)器遇到損壞的頁(yè)面。從MySQL 5.7.2開(kāi)始,innochecksum支持大于2GB的文件。先前,innochecksum只支持最大2GB的文件。
從MySQL 5.7.2開(kāi)始,innochecksum支持包含壓縮頁(yè)面的表空間。
但需要注意的是,innochecksum不能用于服務(wù)器已經(jīng)打開(kāi)的表空間文件。對(duì)于這樣的文件,你應(yīng)該使用CHECK TABLE檢查表空間內(nèi)的表。試圖在服務(wù)器已打開(kāi)的表空間上運(yùn)行innochecksum將導(dǎo)致“Unable to lock file”錯(cuò)誤。也就是說(shuō)文件不可以打開(kāi)?!換句話說(shuō),可能需要關(guān)閉實(shí)例才能使用如下功能!!!
如果發(fā)現(xiàn)校驗(yàn)值不匹配,通常會(huì)從備份中恢復(fù)表空間或啟動(dòng)服務(wù)器,并嘗試使用mysqldump對(duì)表空間內(nèi)的表進(jìn)行備份。
innochecksum語(yǔ)法:
$ innochecksum [options] file_name
1
$innochecksum[options]file_name
常用選項(xiàng):
1. –version, -V
顯示版本信息。
2. –count, -c
打印文件中的頁(yè)數(shù)并退出。用法示例:
$ innochecksum --count /var/lib/mysql/sbtest/sbtest1.ibd
Number of pages:15360
1
2
$innochecksum--count/var/lib/mysql/sbtest/sbtest1.ibd
Numberofpages:15360
3. –start-page=num, -s num
指定從某個(gè)頁(yè)面開(kāi)始校驗(yàn)。用法示例:
$ innochecksum --start-page=600 /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--start-page=600/var/lib/mysql/sbtest/sbtest1.ibd
4. –end-page=num, -e num
指定校驗(yàn)結(jié)束于此頁(yè)面。用法示例:
$ innochecksum --end-page=600 /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--end-page=600/var/lib/mysql/sbtest/sbtest1.ibd
5. –page=num, -p num
只校驗(yàn)?zāi)硞€(gè)頁(yè)面。用法示例:
$ innochecksum --page=701 /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--page=701/var/lib/mysql/sbtest/sbtest1.ibd
6. –strict-check, -C
指定一個(gè)嚴(yán)格的校驗(yàn)值算法。選項(xiàng)包括innodb,crc32和none。
如果不指定–strict-check選項(xiàng),innochecksum驗(yàn)證innodb,crc32和none。如果指定了none選項(xiàng),則只允許none生成的校驗(yàn)值。如果指定了innodb選項(xiàng),則只允許innodb生成的校驗(yàn)值。如果指定了crc32選項(xiàng),則只允許crc32生成的校驗(yàn)值。
7. –no-check, -n
重寫校驗(yàn)值時(shí)忽略校驗(yàn)和驗(yàn)證,該選項(xiàng)只能與innochecksum –write選項(xiàng)一起使用。如果沒(méi)有指定–write選項(xiàng),innochecksum將終止。
在這個(gè)例子中,innodb校驗(yàn)值被重寫以替換無(wú)效的校驗(yàn)值:
$ innochecksum --no-check --write innodb /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--no-check--writeinnodb/var/lib/mysql/sbtest/sbtest1.ibd
8. –allow-mismatches, -a
在innochecksum終止之前允許的校驗(yàn)值不匹配的最大數(shù)目,默認(rèn)設(shè)置是0。如果–allow-mismatches=N,N>=0,N允許不匹配和innochecksum終止在N+1。當(dāng) –allow-mismatches設(shè)置為0時(shí), innochecksum在第一個(gè)校驗(yàn)值不匹配時(shí)終止。
在這個(gè)例子中,–allow-mismatches為1,現(xiàn)有的innodb校驗(yàn)值被重寫:
$ innochecksum --allow-mismatches=1 --write innodb /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--allow-mismatches=1--writeinnodb/var/lib/mysql/sbtest/sbtest1.ibd
隨著–allow-mismatches設(shè)置為1,如果在600頁(yè)和1000頁(yè)文件不匹配,另一個(gè)在700頁(yè),校驗(yàn)為0-599和601-699頁(yè)進(jìn)行更新。由于–allow-mismatches設(shè)置為1,所以校驗(yàn)值可以容忍第一個(gè)不匹配,并在第二個(gè)不匹配時(shí)終止,從而使頁(yè)面600和頁(yè)面700-999保持不變。
當(dāng)–allow-mismatches設(shè)置為1時(shí),如果在文件的600頁(yè)和700頁(yè)與1000頁(yè)之間存在不匹配,則會(huì)更新頁(yè)0-599和601-699的校驗(yàn)值。因?yàn)楱Callow-mismatches設(shè)置為1,校驗(yàn)值可容忍第一個(gè)不匹配,并在第二個(gè)不匹配時(shí)終止,使頁(yè)600和頁(yè)700-999保持不變。
9. –write=name, -w num
重寫頁(yè)的校驗(yàn)值。通過(guò)innochecksum來(lái)修改頁(yè)校驗(yàn)值是非常危險(xiǎn)的操作,建議操作前備份。但若遇到頁(yè)損毀的問(wèn)題,可以通過(guò)該工具重寫頁(yè)的校驗(yàn)值。重寫無(wú)效校驗(yàn)值時(shí),–no-check選項(xiàng)必須和–write選項(xiàng)一起使用。該–no-check選項(xiàng)告訴innochecksum忽略驗(yàn)證無(wú)效的校驗(yàn)值。如果當(dāng)前校驗(yàn)值有效,則不必指定選項(xiàng)。
使用該–write選項(xiàng)時(shí)必須指定一個(gè)算法。該–write選項(xiàng)的可能值是:
innodb:使用原始InnoDB算法從軟件中計(jì)算校驗(yàn)值。
crc32:使用crc32算法計(jì)算的校驗(yàn)值,可能用硬件輔助完成。
none:一個(gè)常數(shù)。
該選項(xiàng)將整個(gè)頁(yè)面重寫到磁盤,如果新的校驗(yàn)值與現(xiàn)有的校驗(yàn)值相同,則新的校驗(yàn)值不會(huì)被寫入到磁盤,以最小化I/O。當(dāng)–write選項(xiàng)被使用時(shí),innochecksum獲得排他鎖。
# 重寫有效校驗(yàn)值的頁(yè);
$ innochecksum -w crc32 /var/lib/mysql/sbtest/sbtest.ibd
# 重寫帶有無(wú)效校驗(yàn)值的頁(yè);
$ innochecksum --no-check -w crc32 /var/lib/mysql/sbtest/sbtest.ibd
1
2
3
4
5
# 重寫有效校驗(yàn)值的頁(yè);
$innochecksum-wcrc32/var/lib/mysql/sbtest/sbtest.ibd
# 重寫帶有無(wú)效校驗(yàn)值的頁(yè);
$innochecksum--no-check-wcrc32/var/lib/mysql/sbtest/sbtest.ibd
10. –page-type-summary, -S
在表空間中顯示每個(gè)頁(yè)面類型的計(jì)數(shù)。用法示例:
$ innochecksum --page-type-summary /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--page-type-summary/var/lib/mysql/sbtest/sbtest1.ibd
示例輸出為:
File::/var/lib/mysql/sbtest/sbtest1.ibd
================PAGE TYPE SUMMARY==============
#PAGE_COUNT PAGE_TYPE
===============================================
14547 Index page
0 Undo log page
1 Inode page
0 Insert buffer free list page
810 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
File::/var/lib/mysql/sbtest/sbtest1.ibd
================PAGETYPESUMMARY==============
#PAGE_COUNT???? PAGE_TYPE
===============================================
14547Indexpage
0Undologpage
1Inodepage
0Insertbufferfreelistpage
810Freshlyallocatedpage
1Insertbufferbitmap
0Systempage
0Transactionsystempage
1FileSpaceHeader
0Extentdescriptorpage
0BLOBpage
0CompressedBLOBpage
0Othertypeofpage
===============================================
Additionalinformation:
Undopagetype:0insert,0update,0other
Undopagestate:0active,0cached,0to_free,0to_purge,0prepared,0other
11. –page-type-dump, -D
將表空間中的每個(gè)頁(yè)面的頁(yè)面類型信息轉(zhuǎn)儲(chǔ)到stderr或stdout。用法示例:
$ innochecksum --page-type-dump=/tmp/a.txt /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--page-type-dump=/tmp/a.txt/var/lib/mysql/sbtest/sbtest1.ibd
輸出信息大概如下:
Filename::/var/lib/mysql/sbtest/sbtest1.ibd
==============================================================================
PAGE_NO | PAGE_TYPE | EXTRA INFO
==============================================================================
#:: 0 | File Space Header | -
#:: 1 | Insert Buffer Bitmap | -
#:: 2 | Inode page | -
#:: 3 | Index page | index id=764, page level=0, No. of records=7, garbage=0, -
#:: 4 | Freshly allocated page | -
#:: 5 | Freshly allocated page | -
1
2
3
4
5
6
7
8
9
10
Filename::/var/lib/mysql/sbtest/sbtest1.ibd
==============================================================================
PAGE_NO|PAGE_TYPE|EXTRAINFO
==============================================================================
#::?????? 0???????????? |?????????????? File Space Header?????????????? |?????? -
#::?????? 1???????????? |?????????????? Insert Buffer Bitmap????????????|?????? -
#::?????? 2???????????? |?????????????? Inode page??????????????????????|?????? -
#::?????? 3???????????? |?????????????? Index page??????????????????????|?????? index id=764, page level=0, No. of records=7, garbage=0, -
#::?????? 4???????????? |?????????????? Freshly allocated page??????????|?????? -
#::?????? 5???????????? |?????????????? Freshly allocated page??????????|?????? -
12. –log, -l
innochecksum工具日志輸出,必須提供日志文件名稱。日志輸出包含每個(gè)表空間頁(yè)面的校驗(yàn)值。對(duì)于未壓縮的表格,還提供了LSN值。用法示例:
$ innochecksum --log=/tmp/log.txt /var/lib/mysql/sbtest/sbtest1.ibd
1
$innochecksum--log=/tmp/log.txt/var/lib/mysql/sbtest/sbtest1.ibd
PS:有些數(shù)據(jù)庫(kù)進(jìn)行升級(jí)時(shí),大部分用戶選擇的都是原地升級(jí),因此雖然數(shù)據(jù)庫(kù)版本升級(jí)到了5.6,而頁(yè)的格式卻還是之前的老版本。這不會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生任何影響,因?yàn)镮nnoDB默認(rèn)的處理方式就是兼容原來(lái)的方式,只是在寫入新頁(yè)時(shí)才會(huì)用新的crc32算法更新頁(yè)的校驗(yàn)值。因此,若想要完全升級(jí)數(shù)據(jù)庫(kù),享受素有的性能提升優(yōu)化點(diǎn),或許還需要更新新頁(yè)的校驗(yàn)值,并將參數(shù)innodb_checksum_algorithm設(shè)置為strict_crc32。而這可以通過(guò)innochecksum來(lái)完成。通過(guò)innochecksum來(lái)修改頁(yè)校驗(yàn)值是非常危險(xiǎn)的操作,建議操作前備份。但若遇到頁(yè)損毀的問(wèn)題,可以通過(guò)該工具重寫頁(yè)的校驗(yàn)值。
如果您覺(jué)得本站對(duì)你有幫助,那么可以支付寶掃碼捐助以幫助本站更好地發(fā)展,在此謝過(guò)。
總結(jié)
以上是生活随笔為你收集整理的mysql page校验_MySQL InnoDB离线校验工具innochecksum使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql 类型解释_MySQL 数据类
- 下一篇: mysql 字符串不限长度,mysql中