有關MySQL的日志文件前面章節已簡要討論過了,主要有四種日志文件,分別是常規查詢日志、慢查詢日志、變更查詢日志和二進制變更日志。這些日志文件的創建需在啟動服務器時用選項指定。
Table 4.3. 日志啟動選項
啟動選項 激活日志
--log[=file_name] 常規日志文件
--log-bin[=file_name] 二進制變更日志文件
--log-bin-index=file_name 二進制變更日志文件索引文件
--log-update[=file_name] 變更日志文件
--log-slow-querIEs[=file_name] 慢查詢日志文件
--log-isam[=file_name] ISAM/MyISAM日志文件
--log-long-format 設置慢查詢日志和變更日志的格式
BDB和InnoDB數據表的日志文件會自動創建不用指定選項。但可用以下選項指時日志文件的存放路徑。
Table 4.4. BDB和InnoDB數據表日志選項
啟動選項 用途
--bdb-logdir=dir_name 存放BDB日志文件的位置
--innodb-log_arch_dir=dir_name 存放InnoDB日志文件的歸檔目錄
--innodb_log_group_home_dir=dir_name 存放InnoDB日志文件的位置
MySQL日志文件選項可在mysqld和mysqld_safe腳本中使用,也可在選項文件my.cnf的[MySQLd]中使用。推薦在選項文件中使用,因為每次啟動服務器的日志選項基本上都是一致的。
日志的刷新可用mysqladmin flush-logs命令或flush logs語句實現。另外,對MySQL服務器發送一條SIGHUP信號也會刷新日志。錯誤日志和DBD/InnoDB日志不能用以上方法刷新。
錯誤日志記錄MySQL數據庫系統的論斷和出錯信息,由mysqld_safe腳本創建,文件名默認為hostname.err,也可通過--err-log或選項文件的err-log語句指定另外的名字。如果直接用mysqld程序啟動服務器,錯誤信息會直接輸出到輸出設備,也就是屏幕。但我們可用重定向方法把錯誤信息輸出到其它地方,如把錯誤信息輸出到/var/log/MySQL.err文件中,可以執行以下語句:
% mysqld > /var/log/MySQL.err 2>&1 &
在Windows平台下,MySQL服務器默認把診斷信息寫到數據目錄的mysql.err文件中,並且不允許另外指定錯誤日志文件名。如在啟動MySQL服務器時給出了--console選項,則MySQL會把診斷信息輸出到控制台窗口而不創建錯誤日志。但如MySQL是作為一個服務運行,則--console選項不起作用。
4.5.1. 日志失效處理
在服務器正常運行中,會產生大量的日志文件。我們要對這些日志文件進行失效管理,以節省磁盤空間和方便查詢。進行日志失效處理的方式主要有以下幾種:
日志輪轉。該方法適用於常規查詢日志和慢查詢日志這些文件名固定的日志文件,在日志輪轉時,應進行日志刷新操作(MySQLadmin flush-logs命令或flush logs語句),以確保緩存在內存中的日志信息寫入磁盤;
日志輪轉的操作過程是這樣的:第一次輪轉時,把log更名為log.1,然後服務器再創建一個新的log文件,在第二輪轉時,再把log.1更名為log.2,把log更名為log.1,然後服務器再創建一個新的log文件。如此循環,創建一系列的日志文件。當到達日志輪轉失效位置時,下次輪轉就不再對它進行更名,直接把最後一個日志文件覆蓋掉。例如:如果每天進行一次日志輪轉並想保留最後7天的日志文件,就需要保留log.1--log.7共七個日志文件,等下次輪轉時,用log.6覆蓋原來的log.7成新的log.7,原來的log.7就自然失效。下面是一個失效處理的shell腳本,以供參考:
#!/bin/sh
# shell script --- rotate_log.sh
if [ $# -ne 1 ]; then
echo "Usage: $0 logname" 1>&2
exit 1
if
logfile=$1
mv $logfile.6 $logfile.7
mv $logfile.5 $logfile.6
mv $logfile.4 $logfile.5
mv $logfile.3 $logfile.4
mv $logfile.2 $logfile.3
mv $logfile.1 $logfile.2
mv $logfile $logfile.1
mysqladmin -u flush -pflushpass flush-logs #執行MySQLadmin flush-logs會打開一個日志文件----重新生成一個新的日志文件
該腳本以日志文件名為參數,執行方法如下:
% rotate_log.sh /usr/local/MySQL/data/log
注意,腳本中的MySQLadmin命令是帶有-u和-p參數的,因為我們進行日志刷新時需連接服務器。為確保安全,我們建立一個flush用戶,密碼為flushpass。該用戶只有日志刷新的權限(reload權限)。創建該用戶的語句如下:
GRANT RELOAD ON *.* TO 'flush'@'localhost' IDENTIFIED BY 'fulshpass';
設置好後,我們就可利用系統的自動處理機制定期運行該腳本以生成輪轉日志。在Linux系統上的MySQL發行版中帶有一個用來安裝mysql-log-rotate日志輪轉腳本的logrotate工具,如用RPM安裝,則在/usr/share/mysql目錄,如用二進制方式安裝,則在MySQL安裝目錄的support-files目錄,如用源碼安裝,則在安裝目錄的share/MySQL目錄中。
在Windows平台下,不能在線更名,需停掉服務器,再進行。下面是一個進行日志更名的批處理文件:
@echo off
REM script name : rotate_log.bat
if not "%1" == "" goto ROTATE
@echo Usage: rotate_log logname
goto DONE
:ROTATE
set logfile=%1
erase %logfile%.7
rename %logfile%.6 %logfile%.7
rename %logfile%.5 %logfile%.6
rename %logfile%.4 %logfile%.5
rename %logfile%.3 %logfile%.4
rename %logfile%.2 %logfile%.3
rename %logfile%.1 %logfile%.2
rename %logfile% %logfile%.1
:DONE
該腳本的執行方法如下:
c:\rotate_log c:\MySQL\data\log
以時間為依據對日志進行失效處理。該方法將定期刪除超過給定時間的日志文件,適用於變更日志和二進制日志等文件名用數字編號標識的日志文件。下面是一個用Perl寫成的處理腳本:
#!/usr/bin/perl -w
# script name: expire_log.pl
# Usage: expire_log.pl logfile ...
use strict
dIE "Usage: $0 logfile ...\n" if @ARGV == 0;
my $max_allowed_age = 7; #max allowed age in days
foreach my $file (@ARGV) #chack each argument
{
unlink ($file) if -e $file && -M $file >= $max_allowed_age;
}
exit(0);
該腳本需提供一個將被輪轉的日志文件名作為參數,如:
% expire_log.pl /usr/local/MySQL/data/log.[0-9]*
在給腳本參數時請小心,如給出*為參數,則會刪除目錄中所有更新時間大於7天的文件。
鏡像機制。把日志文件鏡像到所有的從服務器上。要使用鏡像機制,你必須知道主服務器有多少個從服務器,哪些正在運行,並需依次連接每一個從服務器並發出show slave status語句以確定它正處理主服務器的哪個二進制日志文件(語句輸出列表的Master_Log_File項),只有所有的從服務器都不會用到的日志文件才能刪除。刪除方法是在主服務器上發出以下語句:
MySQL> PURGE MASTER LOGS TO 'last_log.xx';
上面語句中的last_log.xx是所有從服務器已處理的最小編號日志文件。