Cơ chế đó hoàn toàn khác với syslog của hệ điều hành.
Cài đặt đầu ra nhật ký có thể được đặt thành BẢNG, TẬP_TIN (mặc định) hoặc KHÔNG
nếu bạn sử dụng cái này
[mysqld]
log-output=TABLE
Điều này sẽ khiến việc ghi nhật ký cho nhật ký chung và / hoặc nhật ký chậm chuyển đến tệp CSV. Bạn có thể chuyển đổi CSV đó sang MyISAM như sau:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL general_log = @old_log_state;
Sau đó, bạn có thể để tệp này phát triển rất lớn và bạn sẽ phải thanh lọc bảng thường xuyên. Dưới đây là cách thanh lọc bảng general_log và giữ trong 3 ngày qua:
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
CREATE TABLE mysql.general_log_new LIKE mysql.general_log;
INSERT INTO mysql.general_log_new
SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 3 DAY;
DROP TABLE mysql.general_log;
ALTER TABLE mysql.general_log_new RENAME mysql.general_log;
SET GLOBAL general_log = @old_log_state;
Điều gì về syslog (var / log / message)? Bạn phải tự viết kịch bản đó. Đầu tiên, bạn cần cái này:
[mysqld]
log
log-ouput=TABLE,FILE
general-log-file=/var/log/mysql-general.log
nếu bạn muốn thu thập nhật ký chung ở cả hai định dạng hoặc
[mysqld]
log
general-log-file=/var/log/mysql-general.log
chỉ cho định dạng tập tin.
Bây giờ tạo một tập lệnh để thu thập các thay đổi thành /var/log/general.log. Kịch bản sẽ trông rất giống như thế này:
NEWCOUNT=`wc -l < /var/log/mysql-general.log`
if [ -f /tmp/general-log-lines.txt ]
then
OLDCOUNT=`cat /tmp/general-log-lines.txt`
if [ ${OLDCOUNT} -lt ${NEWCOUNT} ]
then
DIFF=`echo ${NEWCOUNT}-${OLDCOUNT}|bc`
tail -${DIFF} < /var/log/mysql-general.log >> /var/log/messages
echo ${NEWCOUNT} > /tmp/general-log-lines.txt
fi
fi
Chạy kịch bản này mỗi phút. Tôi khuyên bạn nên cắt bớt nhật ký chung mỗi nửa đêm như thế này
echo -n > /var/log/mysql-general.log
Hãy thử một lần !!!