為防止數據丟失而造成重大損失,所以需要定期自動備份數據庫。一開始數據庫備份都是成功的,但是現在數據越來越大了,mysqldump備份時出現備份失敗,報錯內容:mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `table_name` at row: 1413048 。
備份失敗的原因:在向NFS上備份的時候,數據的流向是這樣的:MySQL Server 端從數據文件中檢索出數據,然后分批將數據返回給mysqldump 客戶端,然后 mysqldump 將數據寫入到NFS上。一般地,向 NFS 上寫入數據的速度較之Server端檢索發送數據的速度要慢得多,這就會導致 mysqldump 無法及時的接受 Server 端發送過來的數據,Server 端的數據就會積壓在內存中等待發送,這個等待不是無限期的,當 Server 的等待時間超過 net_write_timeout(默認是60秒)時它就失去了耐心,mysqldump 的連接會被斷開,同時拋出錯誤 Got error: 2013: Lost connection。其實該錯誤不是說數據庫文件太多而導致出錯,而是單張表數據量太大導致備份失敗。比如我備份失敗的錯誤信息里報錯的表就有18.1G數據量。
問題的解決方案:增加 net_write_timeout 可以解決上述的問題的。在實踐中發現,在增大 net_write_timeout 后,Server 端會消耗更多的內存,有時甚至會導致 swap 的使用(並不確定是不是修改 net_write_timeout 所至)。建議在mysqldump 之前修改 net_write_timeout 為一個較大的值(如1800),在 mysqldump 結束后,在將這個值修改到默認的60。(備注:net_write_timeout不是mysqldump的配置參數,而是mysql的參數)
參考資料:
1.Mysqldump參數大全:http://www.cnblogs.com/qq78292959/p/3637135.html
2.mysql timeout調研與實測:http://coolnull.com/4010.html
