Mysql

升級 5.5 -> 5.6 後 mysqldump 的問題

  • July 21, 2019

幾個月前,我將 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.errMySQL根目錄中的文件也沒有。

注意:這個腳本已經在 MySQL 5.5 上執行了好幾年了。當我升級到 5.6 時,這個問題開始發生。

另外:這--flush-logs部分不起作用。自從該系統上線以來,mysql_bin 文件夾從未被清空過。

我還沒有控制一個變數:當作為 CRON 作業執行時,腳本一次分叉 3 個程序。當我在學期會話中測試命令時,我一次只做一個。

有問題的系統:

  • CentOS 6.4
  • x64
  • 64Gb 記憶體

這裡的問題只是一個誤解

–flush-logs與 mysqldump 一起使用只會關閉並打開所有文件句柄,如下所示:

在二進制日誌的情況下,關閉目前二進制日誌並打開一個新的二進制日誌。本質上,它是唯一一個經過數字旋轉的日誌文件。例如,假設您執行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時清理舊日誌。

引用自:https://dba.stackexchange.com/questions/59494