搞死人的MySQL8,差點經營的三年間資料完全毀損…

總之,不知道什麼原因,網頁主機的UBUNTU好像更新了什麼套件和是版本升級。
把我的網頁主機WORDPRESS的MySQL資料庫整個毀損,無法開啟和讀取。
因為農曆過年,想說升級硬碟變成SSD和改RAID 1。
放了幾乎沒重開的伺服主機,因為這樣才發現莫名其妙資料庫整個死掉了。A。…

然後,又發現因為mysql 8.0新格式,整個結構和資料夾和以前5.4版差異很大。
全部只有單一.ibd檔案,沒有目錄結構檔案,所以以前印象的方法刪除重灌,放檔案資料蓋回去,是行不通的…。
一時間又找不到方法怎救,連續在過年連假期間,三天沒睡覺的搞他,在老婆娘家克難的又弄了三天,依然無解。
雖然有備份習慣,但是從去年九月到一月的各份備份檔,都是一樣問題和結果。
甚至,在娛樂機WIN10直接線外一台機器,安裝套件版XAMPP來開資料庫伺服器,仍都打不開。
想生個dump都生不出.SQL檔案。
當下能確定的是只有2020年還是5.4版的MySQL檔案是完全無痛使用的,但…三年資料啊!!!!!

最後,終於在克難的手機小螢幕下,發現有強者幫忙撰寫的工具解碼。
https://github.com/anyongjin/mysql_ibd
说明
这是一个用于从mysql的ibd文件导入数据库表的脚本,针对innodb存储引擎。
如果您的数据表使用的是MyISAM引擎,请移步mysql文档,使用import table from从frm和MYD文件恢复表数据。
对于innodb引擎,在mysql8以前的版本下,每个表在数据目录下有frm文件和ibd文件,前者是表结构,后者是表数据。 从mysql8开始,表的结构信息等元数据通过sdi保存,sdi嵌入到ibd文件里面。所以一个表只对应一个数据文件。
对于mysql8之前版本有frm文件的情况,mysql提供了mysqlfrm工具可以从frm生成建表语句。 但对于mysql8之后版本,只提供了ibd2sdi工具从ibd文件生成sdi文件(JSON形式的表结构),不能直接生成sql语句。
这个项目支持了下面两个功能:
对于mysql8之后版本,支持从ibd生成建表语句
对任意版本mysql,支持表结构恢复后,ibd文件批量导入表数据

一路用他的工具,以及過程中DEBUG和指令導入:
1. mysql error code 1067. invalid default value for timestamp
重建資料結構,會需要把關於DATE的格式可能會因為預設的限制而禁止寫入。
執行一次下面指令後(參考: https://stackoverflow.com/questions/36882149/error-1067-42000-invalid-default-value-for-created-at#comment98366149_44131101),應該就能導入做出來的.SQL檔案寫目錄結構。
SET GLOBAL sql_mode = ”;
2.
完成建立應該要有的資料庫結構表和清單以後,因為內容都是空白檔案。
所以把一開始舊的那些備份好的.idb檔案,都複製這個建立好的資料庫資料夾,並且覆蓋掉新建好的檔案。
最後,啟動MYSQL,可以用下列指令,或是利用adminer或phpMyAdmin網頁方式,執行指令導入新的備檔。
有幾個欄位,就導入幾行和對應名稱。
ALTER TABLE *資料庫名稱* IMPORT TABLESPACE;
理論上,應該就能救回全部的.idb內容到新的伺服器資料庫,或重灌的資料庫系統了。
(參考: https://www.linkedin.com/pulse/how-restore-tables-from-ibd-file-priyanka-chouhan)

經過這次之後,我的自動備份作業也發現一些缺點沒完善。
所以又追加一個shell script,來自動備份mysqldump指令做額外的備份作業了…。
希望不要再遇到這樣的鳥事,快樂的農曆年一半時間都是地獄般的搞電腦,沒辦法安心地陪家人好好玩,很過意不去啊!!
而且也因為這樣,都沒辦法認真的搞雙SSD硬碟的RAID 1系統。
然後就要假期結束了…= =

2 thoughts on “搞死人的MySQL8,差點經營的三年間資料完全毀損…

  1. 5.4接MySQL8也落差太大
    大部分都是5.6 5.7升上去的
    只能說你原本版本就嚴重過時了
    而且為了安全早日升級MySQL8是好事

    1. 感謝。
      單打獨鬥的半熟不新老人一直跟不上時代變化,最近開始能體會那種訂票系統還是用Win3.1或是WinCE。
      能用就不要換,能跑就不更新,是什麼心態了。…冏
      異機備份和危機管理,哪天失修久了才發現都來不及了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

請輸入下列驗證碼計算後阿拉伯數字 (Translate it, if not Taiwanese to post reply) *