InnoDB: Error: space id and page n:o stored in the page?

gaopengtttt發表於2016-07-05
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):

所用到的工具是自己寫的mysqlblock和bcview,
我放到了百度雲盤

供大家下載和使用

今天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







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2121548/,如需轉載,請註明出處,否則將追究法律責任。

相關文章