天天看點

MySQL備份與恢複-mysqldump備份與恢複

這片博文主要用來介紹MySQL的備份與恢複:

MySQL的備份形式可以分為如下幾種:

熱備----即不停機備份

冷備----需要關閉MySQL,然後備份其資料檔案。(停機備份一般是直接拷貝其datadir目錄)

溫備----線上備份,對應用影響大,通常加一個讀鎖【會阻塞寫的應用】,意義不大,基本不用。

從導出的備份檔案結構可分為如下幾種:

邏輯備份---備份的資料是導出的SQL語句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)

實體備份--備份的是實體檔案(如xtracebackup)

接下來會詳細介紹這四種指令的通常用法(如果不特别說明,資料庫存儲引擎為INNODB):

mysqldump的用法如下:

備份單張表:

MySQL備份與恢複-mysqldump備份與恢複
MySQL備份與恢複-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的參數)

繼續閱讀