蝴蝶效應關於一次Mac中mysql非自願升級到8.0的資料找回

Limpid發表於2020-11-03

其實解決方法網上已經有不少,這裡把自己的處理記錄下,完全是作為提示給自己預警

事件起因:

    因為在Mac上用homebrew安裝一個外掛,其關聯的軟體在本機過老,所以自動更新,更新過程中發現關聯的軟體需要兩外的軟體也過老,一併更新,接下來就像瀑布一樣一片更新。好不容更新完成,因為當時mysql5.7還在開啟可以正常使用以致就做後續設計並未注意。等第二天重新開機時發現mysql無法啟動。

開始處理:

    排除埠侵佔等其他原因後,感覺應該是mysql的data資料夾內容是老5.7的,對於8.0不相容。到此其實很簡單隻要初始化mysql的資料資料夾就可以,但要找回之前的資料。

找回資料:

    因為8.0的資料相容性,所以不能用5.7的檔案直接恢復,這裡我採用docker
    /youdir:docker掛載目錄
    /usr/local/var/mysql:原本機5.7資料資料夾
  1. 在一個位置新建一個資料夾作為docker中mysql掛載資料資料夾的位置(此位置需要加入到docker的Resources File sharing中否則會出現掛載失敗)
  2. 下載一個docker映象(最好和本機之前mysql版本相同),啟動執行
    docker run --name mysql-test  -v /yourdir:/var/lib/mysql  -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d  mysql:5.7.32
    這裡把對映埠改到3307,為不佔用主機的埠,也可以為稍後資料匯入8.0做準備
  3. 看到/yourdir這個資料夾下有mysql啟動檔案後,停止docker中的mysql,將mac裡之前/usr/local/var/mysql中的一個資料庫的資料夾複製到/yourdir後啟動docker中mysql,發現複製的資料庫出現,但開啟後不見表結構(由於innodb內部對於每個表結構都有唯一id,而當前庫內表結構和mysql不一致)
  4. 停掉docker中mysql,將/usr/local/var/mysql中的ibdata1(存有innodb的後設資料,包括id計數)複製到/yourdir下,再次啟動docker的mysql,此時發現加入的庫中的表可以正常開啟了。依照第三步把剩下的庫資料夾都複製到/yourdir下。
      到這裡基本是可以對之前資料做匯出備份了,但還要要讓8.0的mysql啟動

    mysql8.0的啟動部分

  • 1.打包備份/usr/local/var/mysql這個資料夾原有資料,清空/usr/local/var/mysql資料夾並確認此資料夾許可權,確保mac內mysql沒有程式在啟動(ps出來直接殺掉),還要檢視一下mac中mysql的my.cnf是8.0(以防萬一)
  • 2.執行 (以下二選一)
    ##初始化過程中會現實root賬戶的初始密碼
    mysqld --initialize
    ##初始一個無密碼的root賬戶
    mysqld --initialize-insecure
    對目錄進行初始化
  • 3.修改root密碼
    #對於root有密碼的賬戶登陸
    mysql -u root -p
    #對於root無密碼賬戶登陸
    mysql -u root --skip-password
    #修改root密碼
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'root-password';
  • 4.從docker中的mysql匯入資料到本機mysql8.0
    由於8.0在內部引擎和欄位調整有些資料格式不再適用(比如MYISAM分割槽),所以在轉移資料時,之前的匯出整庫sql再執行匯入容易出現問題,提前檢查下格式,校驗轉換,也可以少量多次。

對於mysql5.7的root密碼找回方法不適用8.0版本了,我試了幾個方法之後放棄直接從官方文件入手,如果有其他方法也可以提出來
mysqld –initialize這個是初始化資料目錄操作,執行前一定確保資料備份好
到這裡還有些寫在結尾,這次brew及聯更新,導致從nginx,python,php基本都更新了,每個更新完都要從新調整配置,尤其涉及到外掛的,都要重新編譯匯入,所以各位使用homebrew做安裝更新時需要小心。

mysql8文件:dev.mysql.com/doc/refman/8.0/en/de...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章