程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 使用XtraBackup備份MySQL的1個經典錯誤

使用XtraBackup備份MySQL的1個經典錯誤

編輯:關於MYSQL數據庫
前幾天一台MySQL服務器的備份遭遇了一個錯誤,信息如下: innobackupex: Error: Connection to MySQL child process (pid=20080) timedout. (Time limit of 900 seconds exceeded. You may adjust time limit by editing the value of parameter "$MySQL_response_timeout" in this script.) while waiting for reply to MySQL request: 'FLUSH TABLES WITH READ LOCK;' at /home/MySQL/backup/xtrabackup-1.6/innobackupex line 336.

   這是使用XtraBackup容易引起的一個經典錯誤,引起這個錯誤的原因也很簡單,就是XtraBackup在備完innodb表的時候,要獲得對所有表的鎖定來備份MyISAM表和其他文件,來保證數據的一致性,如果在此過程中數據庫不斷的有DML操作,XtraBackup就可能遲遲無法獲得對所有表的鎖定,最後超時。

  要避免這個問題,一個是加大超時的時間限制,但這顯然不是一個好的解決辦法,另外就是在備份的時候加上--no-lock參數,就是在復制MyISAM表和.frm等文件的時候不鎖表,但要保證這時沒有對MyISAM表的DML操作和Innodb表的DDL操作,這一般通過應用端權衡時間是容易辦到的。

  但是要注意的是,如果備份出來的文件要用於主從復制,那麼不鎖表會導致沒有輸出 slave_info文件和binlog_info文件,這對於一些人的應用場景可能會有影響。這時可以加一個--safe-slave-backup參數,使得在從庫上備份的時候停止SQL THRED,這樣即使從庫能從主庫接收binlog文件,但是不會應用,relay log position就不會移動了。但是單純的停掉slave SQL Thread是不會影響binlog position的。

  因為臨時表的原因,--safe-slave-backup需要在SHOW STATUS的輸出中slave_open_temp_tables為0的時候才停止slave SQL Thread,否則會導致復制出問題。因為臨時表是基於用戶session的,因此如果正在操作臨時表的數據的時候停止slave SQL Thread,會導致可能後續的數據不一致,在其他停用slave SQL Thread的場景也要注意這個問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved