如第 7.4 節「MySQL 伺服器日誌」所述,MySQL 伺服器可以建立數個不同的日誌檔案,以協助您查看正在發生的活動。但是,您必須定期清理這些檔案,以確保日誌不會佔用過多的磁碟空間。
當使用啟用日誌記錄的 MySQL 時,您可能需要不時備份和移除舊的日誌檔案,並告知 MySQL 開始記錄到新的檔案。請參閱第 9.2 節「資料庫備份方法」。
在 Linux (Red Hat) 安裝中,您可以使用 mysql-log-rotate
指令碼進行日誌維護。如果您是從 RPM 發行版本安裝 MySQL,則此指令碼應已自動安裝。如果您使用二進位日誌進行複製,請小心使用此指令碼。在確定所有複本都已處理其內容之前,您不應移除二進位日誌。
在其他系統上,您必須自行安裝一個簡短的指令碼,並從 cron (或其對應物) 啟動以處理日誌檔案。
二進位日誌檔案會在伺服器的二進位日誌過期期間之後自動移除。檔案的移除可以在啟動時以及刷新二進位日誌時進行。預設二進位日誌過期期間為 30 天。若要指定替代的過期期間,請使用 binlog_expire_logs_seconds
系統變數。如果您使用複製,則應指定一個過期期間,其不得低於複本可能落後來源的最大時間量。若要依需求移除二進位日誌,請使用 PURGE BINARY LOGS
陳述式 (請參閱第 15.4.1.1 節「PURGE BINARY LOGS 陳述式」)。
若要強制 MySQL 開始使用新的日誌檔案,請刷新日誌。當您執行 FLUSH LOGS
陳述式或 mysqladmin flush-logs、mysqladmin refresh、mysqldump --flush-logs
或 mysqldump --source-data
命令時,會發生日誌刷新。請參閱第 15.7.8.3 節「FLUSH 陳述式」、第 6.5.2 節「mysqladmin — MySQL 伺服器管理程式」和第 6.5.4 節「mysqldump — 資料庫備份程式」。此外,當目前的二進位日誌檔案大小達到 max_binlog_size
系統變數的值時,伺服器會自動刷新二進位日誌。
FLUSH LOGS
支援選用修飾詞,以啟用個別日誌的選擇性刷新 (例如,FLUSH BINARY LOGS
)。請參閱第 15.7.8.3 節「FLUSH 陳述式」。
日誌刷新操作具有下列效果
如果已啟用二進位日誌記錄,伺服器會關閉目前的二進位日誌檔案,並開啟一個具有下一個序號的新日誌檔案。
如果已啟用一般查詢記錄或慢速查詢記錄至日誌檔案,伺服器會關閉並重新開啟日誌檔案。
如果伺服器啟動時使用了
--log-error
選項來讓錯誤日誌寫入檔案,則伺服器會關閉並重新開啟日誌檔案。
執行日誌刷新陳述式或命令需要使用具有 RELOAD
權限的帳戶連線至伺服器。在 Unix 和類似 Unix 的系統上,刷新日誌的另一種方法是向伺服器傳送訊號,這可以由 root
或擁有伺服器程序的帳戶完成。(請參閱第 6.10 節「MySQL 中的 Unix 訊號處理」)。訊號可以讓您在不必連線至伺服器的情況下執行日誌刷新
一個
SIGHUP
信號會刷新所有日誌。然而,SIGHUP
除了刷新日誌外,還有其他可能不希望發生的影響。SIGUSR1
會導致伺服器刷新錯誤日誌、一般查詢日誌和慢查詢日誌。如果您只對刷新這些日誌感興趣,則可以使用SIGUSR1
作為更 “輕量級” 的信號,它不會像SIGHUP
那樣產生與日誌無關的效果。
如前所述,刷新二進制日誌會建立一個新的二進制日誌檔案,而刷新一般查詢日誌、慢查詢日誌或錯誤日誌只會關閉並重新開啟日誌檔案。對於後者這些日誌,若要在 Unix 上建立新的日誌檔案,請先重新命名目前的日誌檔案,然後再刷新它。在刷新時,伺服器會以原始名稱開啟新的日誌檔案。例如,如果一般查詢日誌、慢查詢日誌和錯誤日誌檔案分別命名為 mysql.log
、mysql-slow.log
和 err.log
,您可以從命令列使用像這樣的指令序列
cd mysql-data-directory
mv mysql.log mysql.log.old
mv mysql-slow.log mysql-slow.log.old
mv err.log err.log.old
mysqladmin flush-logs
在 Windows 上,請使用 rename 而不是 mv。
此時,您可以備份 mysql.log.old
、mysql-slow.log.old
和 err.log.old
,然後將它們從磁碟中移除。
若要在執行期間重新命名一般查詢日誌或慢查詢日誌,請先連線到伺服器並停用日誌
SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';
在停用日誌後,從外部重新命名日誌檔案 (例如,從命令列)。然後再次啟用日誌
SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
此方法適用於任何平台,且不需要重新啟動伺服器。
為了讓伺服器在您從外部重新命名檔案後重新建立給定的日誌檔案,伺服器必須具有該檔案位置的寫入權限。情況可能並非總是如此。例如,在 Linux 上,伺服器可能會將錯誤日誌寫入為 /var/log/mysqld.log
,其中 /var/log
由 root
擁有,且 mysqld 沒有寫入權限。在這種情況下,日誌刷新作業將無法建立新的日誌檔案。
若要處理這種情況,您必須在重新命名原始日誌檔案後,手動建立具有正確擁有權的新日誌檔案。例如,以 root
身分執行以下命令
mv /var/log/mysqld.log /var/log/mysqld.log.old
install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log