我的mysql.general_log表太大了吗?

时间:2012-02-18 16:41:01

标签: mysql logging database-performance

我刚刚升级到MySQL 5.1.6,以便利用将常规日志保存到表中的功能 - >即mysql.general_log。一旦我这样做,我立即感到惊讶,实际上有多少查询正在触及我们的系统。从第一个小时开始,我在此常规日志表中有大约40,000行。我还没有在MySQL文档中发现它是否存在一般日志表大小限制。

让这个普通日志以这个速度增长是否存在问题?

如果有尺寸问题,如何处理?

是否有一些公认的做法如何处理尺寸问题?

我是否应该每隔一段时间制作一个事件来清除表并将数据保存到文件中?

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

我为我的日志文件做了类似的事情。我只对保留过去24小时感兴趣,但您可以调整事件以创建存档表等。它不会记录事件运行所需的几秒钟,但我不介意。

CREATE EVENT `prune_general_log` ON SCHEDULE
EVERY 1 DAY STARTS '2013-10-18'
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT 'This will trim the general_log table to contain only the past 24 hours of logs.'
DO BEGIN
  SET GLOBAL general_log = 'OFF';
  RENAME TABLE mysql.general_log TO mysql.general_log2;
  DELETE FROM mysql.general_log2 WHERE event_time <= NOW()-INTERVAL 24 HOUR;
  OPTIMIZE TABLE general_log2;
  RENAME TABLE mysql.general_log2 TO mysql.general_log;
  SET GLOBAL general_log = 'ON';
END

答案 1 :(得分:5)

默认情况下,general_log表使用CSV引擎,它实际上只是驱动器上的一个完整的CSV文件,但可以通过SQL访问。这意味着它的大小限制是文件系统上文件的大小限制。

答案 2 :(得分:1)

您应该使用mysql-log-rotate http://dev.mysql.com/doc/refman/5.0/en/log-file-maintenance.html之类的实用程序来旋转日志文件。

答案 3 :(得分:0)

不确定这是否是最佳做法,但这是我的解决方案:

DATE=$(date +"%Y%m%d%H%M")
mv general_log.CSV general_log.${DATE}.csv  # move the log table file
sudo -u mysql -g mysql touch general_log.CSV  # create a new log table file with correct owner and group
mysql -u root -e "FLUSH TABLE mysql.general_log"  # flush the log table