這片博文主要用來介紹MySQL的備份與恢複:
MySQL的備份形式可以分為如下幾種:
熱備----即不停機備份
冷備----需要關閉MySQL,然後備份其資料檔案。(停機備份一般是直接拷貝其datadir目錄)
溫備----線上備份,對應用影響大,通常加一個讀鎖【會阻塞寫的應用】,意義不大,基本不用。
從導出的備份檔案結構可分為如下幾種:
邏輯備份---備份的資料是導出的SQL語句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)
實體備份--備份的是實體檔案(如xtracebackup)
接下來會詳細介紹這四種指令的通常用法(如果不特别說明,資料庫存儲引擎為INNODB):
mysqldump的用法如下:
備份單張表:

--single-transaction 參數說明
備份單個庫和備份所有的庫
恢複資料的時候直接使用mysql導入即可:
切記在備份INNODB資料庫時一定要加上--single-transaction 參數,為了基于PIT恢複也要加上--master-data參數。
mysqldump的備份過程
上面我們已經看到了mysqldump備份出的資料檔案時對應sql語句,我們檢視一下在執行mysqldump時,MySQL資料庫做了哪些操作!
首先開啟general_log日志,如下:
然後再去使用mysqldump備份一次資料檔案
最後檢視general_log日志,如下:
mysqld的其餘常見參數應用:
-d:隻備份指定資料庫表的結構(也就是建表語句)
-R, --routines :備份時導出存儲過程和自定義函數!
-f, --force Continue even if we get an SQL error.。發生錯誤的時候也繼續備份。
mysqldump還有很多參數,可以在用到的時候檢視!
mysqldump是邏輯備份,單線程備份,單線程恢複,是以會比較慢。特别是恢複的時候,之前恢複過一個800多萬行記錄的資料,結果使用mysql逐條導入sql語句,搞庫幾個小時。
備份與恢複糾錯
1:在使用mysql導入mysqldump的備份資料時,報了如下錯誤:
錯誤原因就是行太長了,但是線上環境修改字段屬性有點不太合适,可以采用如下方法:
導入成功後,如果是線上環境,還需要把參數修改回去!
2:在使用mysqldump備份的時候出現如下問題
我查了一下,這個表大概有1500萬行的記錄,報錯原因如下:
問題的解決方案:增加 net_write_timeout 可以解決上述的問題的。在實踐中發現,在增大 net_write_timeout 後,Server 端會消耗更多的記憶體,有時甚至會導緻 swap 的使用(并不确定是不是修改 net_write_timeout 所至)。建議在mysqldump 之前修改 net_write_timeout 為一個較大的值(如1800),在 mysqldump 結束後,在将這個值修改到預設的60。(備注:net_write_timeout不是mysqldump的配置參數,而是mysql的參數)