2016-06-08 04:38:11 7fa7ddd86700 InnoDB: Error: space id and page n:o stored in the page
InnoDB: read in are 4294967295:4294967295, should be 22291:4096!
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page 4096.
InnoDB: You may have to recover from a backup.
2016-06-08 04:38:11 7fa7ddd86700 InnoDB: Page dump in ascii and hex (16384 bytes):
今天MYSQL遇到上面的錯誤:
顯然 InnoDB: read in are 4294967295:4294967295, should be 22291:4096!
這里拋出了出錯信息,結合前面的提示翻譯為,
在space id 22291的4096塊上出現了問題,讀到的信息為4294967295:4294967295
顯現SPACE ID 讀到的信息有誤 4294967295
那么這第一個4294967295 是怎么來的呢。
首先我們要找到SPACEID 是22291是什么表
select * from INNODB_SYS_TABLESPACES where space = 22291;
然后取出他的ibd文件如果是單獨的表空間就非常簡單了,目的在于分析原因確定確實是這個表的問題。
然后使用工具查看二進制文件我使用的是自己編寫的bcview工具。
******************************************************************
This Tool Is Uesed For Find The Data In Binary format(Hexadecimal)
Usage:./bcview file blocksize offset cnt-bytes!
file: Is Your File Will To Find Data!
blocksize: Is N kb Block.Eg: 8 Is 8 Kb Blocksize(Oracle)!
Eg: 16 Is 16 Kb Blocksize(Innodb)!
offset:Is Every Block Offset Your Want Start!
cnt-bytes:Is After Offset,How Bytes Your Want Gets!
Edtor QQ:22389860!
Used gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
******************************************************************
usage:./bcview file blocksize offset cnt-bytes!
其實這個4294967295來自于塊的34-37 的4個字節,
如果我們打開2進制文件使用工具bcview(自己編寫的)
./bcview product_info_snapshot.ibd 16 34 4|more
current block:00004096--Offset:00034--cnt bytes:04--data is:ffffffff
我們很清楚看到了這里4個字節全是ffffffff,實際上正常的塊是
current block:00000085--Offset:00034--cnt bytes:04--data is:00005713
那么第二個4294967295也就是塊號來自哪里呢?
其實這個塊號我也占時沒有找到他來自哪里,
但是他為什么能讀取到正確的4096塊呢?
肯能的原意你是每個塊的 4-11 8個字節是當前的塊號和上一個塊的塊號
我們來看看
current block:00004090--Offset:00004--cnt bytes:08--data is:00000ffa00000ff9
current block:00004091--Offset:00004--cnt bytes:08--data is:00000ffb00000ffa
current block:00004092--Offset:00004--cnt bytes:08--data is:00000ffc00000ffb
current block:00004093--Offset:00004--cnt bytes:08--data is:00000ffd00000ffc
current block:00004094--Offset:00004--cnt bytes:08--data is:00000ffe00000ffd
current block:00004095--Offset:00004--cnt bytes:08--data is:00000fff00000ffe
current block:00004096--Offset:00004--cnt bytes:08--data is:0000100000000fff
current block:00004097--Offset:00004--cnt bytes:08--data is:0000100100001000
current block:00004098--Offset:00004--cnt bytes:08--data is:0000100200001001
很明顯的這里看到了0000100000000fff 當前塊號4096 上一個塊是4095
這里就確定了確實是這個塊出現了問題。那么怎么恢復呢?
當然有從庫直接刪除導入即可。
如果沒有從庫沒有備份,那么準備好丟數據的可能。
我們可以create table t_bak as select * from t;
這個肯定報錯 報錯就是讀取到了出問題的塊,但是t_bak出來了,這個時候我們取自增主鍵,試著向后推移一部分
如果報錯在推 比如一次主鍵+10 這個還是和你的行大小有關。如果1K的行一個塊大約也就10來條數據左右,
我們只要跳過了出錯的塊,讀取應該會正常。但是肯定會丟一些數據,丟的就是壞塊的數據。
如果死馬當活馬醫,可以改一下34-37字節為正常的值。再試試。
當然也可以通過mysqlblock工具看一下是否有異常的塊
異常:
[root@bak tmp]# ./mysqlblock product_info_snapshotbak.ibd -t
FILE SIZE IS : 1589641216
Total Block Status :
Total block : 97024,Total size is: 1516.000000 MB
Total undo block : 0,Total size is: 0.000000 MB
Total inode block : 1,Total size is: 0.015625 MB
Total insert buffer free blocks: 0,Total size is: 0.000000 MB
Total data(index pages) block : 92434,Total size is: 1444.281250 MB
Total new allocate blocks : 4540,Total size is: 70.937500 MB
Total insert buf bitmap blocks : 6,Total size is: 0.093750 MB
Total system blocks : 0,Total size is: 0.000000 MB
Total transaction system blocks: 0,Total size is: 0.000000 MB
Total file space header blocks : 1,Total size is: 0.015625 MB
Total extrenl disc blocks : 5,Total size is: 0.078125 MB
Total LOB blocks : 24,Total size is: 0.375000 MB Total Unkown blocks : 13,Total size is: 0.203125 MB
正常:
[root@bak tmp]# ./mysqlblock product_info_snapshot.ibd -t
FILE SIZE IS : 1589641216
Total Block Status :
Total block : 97024,Total size is: 1516.000000 MB
Total undo block : 0,Total size is: 0.000000 MB
Total inode block : 1,Total size is: 0.015625 MB
Total insert buffer free blocks: 0,Total size is: 0.000000 MB
Total data(index pages) block : 92449,Total size is: 1444.515625 MB
Total new allocate blocks : 4538,Total size is: 70.906250 MB
Total insert buf bitmap blocks : 6,Total size is: 0.093750 MB
Total system blocks : 0,Total size is: 0.000000 MB
Total transaction system blocks: 0,Total size is: 0.000000 MB
Total file space header blocks : 1,Total size is: 0.015625 MB
Total extrenl disc blocks : 5,Total size is: 0.078125 MB
Total LOB blocks : 24,Total size is: 0.375000 MB Total Unkown blocks : 0,Total size is: 0.000000 MB