升級 5.5 -> 5.6 後 mysqldump 的問題
幾個月前,我將 MySQL 設置從 5.5 更新到 5.6。從那時起,我一直在使用用於轉儲各種數據庫以便備份它們的腳本遇到問題。
該腳本是一小段 perl,它獲取所有數據庫的列表,然後
mysqldump
按如下方式呼叫每個數據庫:mysqldump -udb_account -pdb_pw -hserver.com --single-transaction --flush-logs --routines --triggers --quick $fn 2> $fn.err | gzip > $fn.mysql.gz
問題:其中許多數據庫都有數百個表(不斷增加)。對於這些較大的數據庫,該
mysqldump
命令通常僅在一個表後退出。如果我從終端會話執行命令,它會正確執行。(通常它作為 cron 作業 1x/wk 執行)該
.err
文件不包含任何消息。server.err
MySQL根目錄中的文件也沒有。注意:這個腳本已經在 MySQL 5.5 上執行了好幾年了。當我升級到 5.6 時,這個問題開始發生。
另外:這
--flush-logs
部分不起作用。自從該系統上線以來,mysql_bin 文件夾從未被清空過。我還沒有控制一個變數:當作為 CRON 作業執行時,腳本一次分叉 3 個程序。當我在學期會話中測試命令時,我一次只做一個。
有問題的系統:
- CentOS 6.4
- x64
- 64Gb 記憶體
這裡的問題只是一個誤解
將–flush-logs與 mysqldump 一起使用只會關閉並打開所有文件句柄,如下所示:
- 錯誤日誌
- 引擎日誌(刷新到磁碟的重做日誌)
- 中繼日誌(如果設置了複製)
- 正常日誌(如果啟用)
- 慢日誌(如果啟用)
- 二進制日誌(如果啟用)
- 請參閱Bulletpoint #3 下的 MySQL 文件($$ log_type $$日誌)
在二進制日誌的情況下,關閉目前二進制日誌並打開一個新的二進制日誌。本質上,它是唯一一個經過數字旋轉的日誌文件。例如,假設您執行
SHOW MASTER STATUS;
並看到二進制日誌文件名mysql-bin.000027
。執行FLUSH LOGS;
或FLUSH BINARY LOGS;
將關閉mysql-bin.000027
(停止將事務記錄到該文件)並打開mysql-bin.000028
(現在記錄傳入事務)。但是,輪換並不意味著自動刪除。
有兩種方法可以清理二進制日誌
刪除所有二進制日誌
如果 DB Server 不用作 MySQL Replication Master,則執行
二進制日誌記錄已啟用
mysql> RESET MASTER;
這將清除所有二進制日誌並從第一個日誌開始(例如
mysql-bin.000001
)二進制日誌記錄未啟用
只需進入作業系統並執行刪除命令(
rm
對於 Linux,del
對於 Windows)清除二進制日誌
如果要保留過去 48 小時的二進制日誌,請執行
mysql> PURGE BINARY LOGS BEFORE NOW() - INTERVAL 48 HOUR;
mysqld 將清除所有超過 48 小時的二進制日誌。
自動清洗
只需在 my.cnf(或 my.ini)中設置以下內容
[mysqld] expire_logs_days=2
然後,重新啟動 mysqld 或執行以下命令
root
mysql> SET GLOBAL expire_logs_days = 2;
這樣,每次手動或自動刷新二進制日誌都會刪除超過 2 天的日誌。
設置expire_logs_days後,mysqldump 將在每次執行 –flush-logs時清理舊日誌。