MySQL logrotate配置
vi /etc/logrotate.d/mysql
/data/log/mysql/mysql-error.log {
# create 600 mysql mysql
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping -S /tmp/mysql.sock &>/dev/null
then
/usr/bin/mysqladmin flush-logs -S /tmp/mysql.sock
#/usr/local/mysql/bin/mysql -e "flush error logs;"
fi
endscript
}
/data/log/mysql/slowlog/mysql-slow.log {
daily
rotate 30
missingok #如果日志文件不存在,继续处理下一个文件而不产生报错信息
delaycompress #推迟要压缩的文件,直到下一轮询周期再执行压缩
copytruncate #见下面注解
postrotate
pt-query-digest --user=anemometer --password=anemometer --review h=node17,D=slow_query_log,t=global_query_review --history h=node17,D=slow_query_log,t=global_query_review_history --no-report --limit=0% --filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\"" /data/log/mysql/slowlog/mysql-slow.log-`date +%Y%m%d`
#/usr/local/mysql/bin/mysql -e "flush slow logs;"
endscript
}
关于copytruncate
问题:如何告诉应用程序重新打开日志文件?
以Nginx为例,是通过postrotate指令发送USR1信号来通知Nginx重新打开日志文件的。但是其他的应用程序不一定遵循这样的约定,比如说MySQL是通过flush-logs来重新打开日志文件的。更有甚者,有些应用程序就压根没有提供类似的方法,此时如果想重新打开日志文件,就必须重启服务,但为了高可用性,这往往不能接受。还好Logrotate提供了一个名为copytruncate的指令,此方法采用的是先拷贝再清空的方式,整个过程中日志文件的操作句柄没有发生改变,所以不需要通知应用程序重新打开日志文件,但是需要注意的是,在拷贝和清空之间有一个时间差,所以可能会丢失部分日志数据。
这里用copy truncate未必好
postrotate/endscript
在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。postrotate/endscript格式就是上面这样,中间是命令
mysql-error.log这里的命令是在rotate完error log后,执行mysqladmin flush-logs,来重新产生error log
flush-logs 对于正在使用的 error log ,slow log, general log没影响, 对于binlog,二进制日志文件的序列号相对于上一个文件增加一
mysql> show BINARY logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000015 | 8426 |
| mysql-bin.000016 | 201 |
| mysql-bin.000017 | 154 |
+------------------+-----------+
3 rows in set (0.00 sec)
[root@uz6535 old]# mysqladmin flush-logs -uroot -pmysql
mysql> show BINARY logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000015 | 8426 |
| mysql-bin.000016 | 201 |
| mysql-bin.000017 | 201 |
| mysql-bin.000018 | 154 |
+------------------+-----------+
查看error log
[root@uz6535 mysql55]# ll | grep uz6535.err
-rw-r----- 1 mysql mysql 101 Jun 6 03:31 uz6535.err
-rw-r----- 1 mysql mysql 597521 May 19 08:37 uz6535.err.bak
执行flush-logs,没影响
[root@uz6535 mysql55]# mysqladmin flush-logs -uroot -pmysql
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@uz6535 mysql55]# ll | grep uz6535.err
-rw-r----- 1 mysql mysql 101 Jun 6 03:31 uz6535.err
-rw-r----- 1 mysql mysql 597521 May 19 08:37 uz6535.err.bak
删除后在flush才会产生新的error log
[root@uz6535 mysql55]# mv uz6535.err uz6535.bak
[root@uz6535 mysql55]# mysqladmin flush-logs -uroot -pmysql
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@uz6535 mysql55]# ll | grep uz6535.err
-rw-r----- 1 mysql mysql 0 Jun 6 03:31 uz6535.err
-rw-r----- 1 mysql mysql 597521 May 19 08:37 uz6535.err.bak
mysql-slow.log 这里的命令是
rotate后slow log会以 mysql-slow.log-date +%Y%m%d 格式命名,因为指定了delaycompress,所以第一次rotate不会压缩,下次rotate才会压缩. 也就是只是给slow log重命名,并创建了新的slow log.之后再用pt-query-digest手机慢查询信息