1. 程式人生 > >mysql資料備份的一個坑

mysql資料備份的一個坑

最近在升級程式時,要先對資料庫進行備份。首先使用的是navicat的備份功能,但是資料備份完,我又新建了一個空的資料庫,結果資料還原進去後,發現user表一條記錄也沒有,所以navicat肯定是不能用了。
然後想到mysql自帶一個mysqldump命令,可以用它來備份資料庫,命令如下:

mysqldump -uroot -p xxx > /x/x/bak.sql

其中xxx為要備份的資料庫的名字,後面為備份檔案的路徑。備份完後,看了看bak.sql,裡面是有我的資料的。然後我用新的空庫進行還原,命令如下

mysqldump -uroot -p xxx < /x/x/bak.sql

還原過程中雖然沒報錯,但是資料庫裡沒東西。
網上查了下,可以用mysql連線資料庫,然後使用source命令進行還原。

mysql -uroot -p
use xxx
source /x/x/bak.sql

然後看了下資料庫,還原成功了。這時候我覺得資料庫備份應該沒問題了,但這時坑其實已經開始了。
我先把原庫刪除,然後部署了程式,最後又使用備份檔案還原了資料庫。這時我進入程式中才發現,
我的資料大部分都沒有了
WTF!!!
開啟我的備份檔案,突然發現,有一個表所有記錄,居然是用一條insert語句插入的
到這裡,雖然我不敢百分百肯定,但我知道肯定坑就是在這了。為了提高資料的儲存效率,所以mysql預設使用單條insert語句來執行整張表的資料的,但是對於資料量比較多的表,insert語句就會變得非常長,而mysql它自己又無法生成那麼長insert語句,所以我的部分資料就沒被備份。
查了下,可以使用--skip-extended-insert

--extended-insert=false引數來生成多條的insert語句,例如:

mysqldump -uroot -p --skip-extended-insert xxx > /x/x/bak.sql

經過測試,此方法生成的備份檔案雖然稍大些,但是在還原速度和資料安全上都是沒問題的(最開始生成的備份檔案,還原需要20分鐘,而此方法生成的備份檔案,還原需要20秒鐘)。
以上所有測試都是基於mysql5.5 windows 版本進行測試的,最新版的mysql未進行測試。我還從網上看到有人鼓勵使用單條insert語句來進行資料庫的備份,還進行了測試,說還原時速度快。但我感覺他像在放屁。
謹記。