通過mysql的my.cnf文件可以設置mysql的日志。而日志文件如果長期不進行清理或回收,勢必會造成日志文件越來越大,進而影響到mysql的性能。而利用rpm 包安裝方式的自帶有mysql日志的輪詢刷新,通過源碼包安裝的一樣能實現該功能。該功能的實現要通過flush命令和mysql自帶腳本的修改來完成。(當然,二進制日志文件除外,因為系統自帶了expire_logs_days和max-binlog-size參數進行設置,並且二進制文件為系統數據恢復時的重要文件,不建議使用該方式進行配置,如果有其他備份策略也可以使用該方式進行輪詢)
Flush命令的用法如下:
mysql> help flush;
Name: 'FLUSH'
Description:
Syntax:
FLUSH [NO_WRITE_TO_BINLOG | LOCAL]
flush_option [, flush_option] ...
…………
The RESET statement is similar to FLUSH. See [HELP RESET], for
information about using the RESET statement with replication.
URL: http://dev.mysql.com/doc/refman/5.5/en/flush.html
從上面的英文幫助文檔中可以查看mysql的flush命令和日志相關的用法。
BINARY closes and reopens the binary log files.
ENGINE closes and reopens any flushable logs for installed storage engines. Currently, this causes InnoDB to flush its logs to disk and perform a checkpoint.
ERROR closes and reopens the error log file.
GENERAL closes and reopens the general query log file.
RELAY closes and reopens the relay log files.
SLOW closes and reopens the slow query log file.
The log_type options were added in MySQL 5.5.3.
關於flush其他方面的用法,我不想直接翻譯了,直接拿個網上別人現成的吧!如下:
MySQL的FLUSH句法(清除或者重新加載內部緩存) FLUSH flush_option [,flush_option],如果你想要清除一些MySQL使用內部緩存,你應該使用FLUSH命令。為了執行FLUSH,你必須有reload權限。
flush_option 可以是下列任何東西:
HOSTS 這個用的最多,經常碰見。主要是用來清空主機緩存表。如果你的某些主機改變IP數字,或如果你得到錯誤消息Host ... isblocked,你應該清空主機表。當在連接MySQL服務器時,對一台給定的主機有多於 max_connect_errors個錯誤連續不斷地發生,MySQL為了安全的需要將會阻止該主機進一步的連接請求。清空主機表允許主機再嘗試連接。
LOGS 關閉當前的二進制日志文件並創建一個新文件,新的二進制日志文件的名字在當前的二進制文件的編號上加1。
PRIVILEGES 這個也是經常使用的,每當重新賦權後,為了以防萬一,讓新權限立即生效,一般都執行一把,目地是從數據庫授權表中重新裝載權限到緩存中。
TABLES 關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。
FLUSH TABLES WITH READ LOCK 關閉所有打開的表,同時對於所有數據庫中的表都加一個讀鎖,直到顯示地執行unlock tables,該操作常常用於數據備份的時候。
STATUS 重置大多數狀態變量到0。
MASTER 刪除所有的二進制日志索引文件中的二進制日志文件,重置二進制日志文件的索引文件為空,創建一個新的二進制日志文件,不過這個已經不推薦使用,改成reset master 了。可以想象,以前自己是多土啊,本來一條簡單的命令就可以搞定的,卻要好幾條命令來,以前的做法是先查出來當前的二進制日志文件名,再用purge 操作。
QUERY CACHE 重整查詢緩存,消除其中的碎片,提高性能,但是並不影響查詢緩存中現有的數據,這點和Flush table 和Reset Query Cache(將會清空查詢緩存的內容)不一樣的。
SLAVE 類似於重置復制吧,讓從數據庫忘記主數據庫的復制位置,同時也會刪除已經下載下來的relay log,與Master一樣,已經不推薦使用,改成Reset Slave了。這個也很有用的。
一般來講,Flush操作都會記錄在二進制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不會記錄,因此上述操作如果記錄在二進制日志文件中話,會對從數據庫造成影響。注意:Reset操作其實扮演的是一個Flush操作的增強版的角色。
Mysql自的帶的日志輪詢腳本位於源碼包的support-files目錄中——mysql-log-rotate.sh文件。
具體操作如下(query日志為例):
先將query_log.log文件mv
[root@localhost logs]# ll
total 32
-rw-rw---- 1 mysql mysql 1 Mar 12 14:28 mysql.err
-rw-rw---- 1 mysql mysql 6 Mar 5 15:44 mysql.pid
-rw-rw---- 1 mysql mysql 1015 Mar 12 15:32 query_log.log
-rw-rw---- 1 mysql mysql 704 Mar 5 15:44 slow.log
[root@localhost logs]# mv query_log.log query_log.log.1
登陸mysql命令界面下,執行如下操作
mysql> flush general logs;
Query OK, 0 rows affected (0.06 sec)
注:這一步分關鍵,也容易錯,我之前進行flush general操作老是出錯,後來看了官方的文檔後,才發現後面少了logs。
下面再看下日志文件
[root@localhost logs]# ll
total 40
-rw-rw---- 1 mysql mysql 1 Mar 12 14:28 mysql.err
-rw-rw---- 1 mysql mysql 6 Mar 5 15:44 mysql.pid
-rw-rw---- 1 mysql mysql 176 Mar 12 15:38 query_log.log
-rw-rw---- 1 mysql mysql 1285 Mar 12 15:38 query_log.log.1
-rw-rw---- 1 mysql mysql 704 Mar 5 15:44 slow.log
[root@localhost logs]# cat query_log.log
/usr/local/mysql/bin/mysqld, Version: 5.5.21-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysqld.sock
Time Id Command Argument
關於使用輪詢腳本時的注意點:
/data/mysql/mysqld.log {
# create 600 mysql mysql
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/local/mysql/bin/mysqladmin &&
/usr/local/mysql/bin/mysqladmin ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin flush-logs
fi
endscript
}
上面腳本中的二處在設置密碼後進運行時會報錯的,因為其要使用密碼的直持。具體為:
/usr/local/mysql/bin/mysqladmin –uroot-ptest ping (其中用戶名為root,密碼為test)
/usr/local/mysql/bin/mysql -uroot -ptest -e "flush general logs"
設置完成後將該腳本放到/etc/logrotate.d目錄就行了。