MySQL logrotate配置

来源:互联网 发布:sql内连接的意义 编辑:程序博客网 时间:2024/05/22 02:18

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 -pmysqlmysql> 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 -pmysqlmysqladmin: [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 -pmysqlmysqladmin: [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手机慢查询信息

原创粉丝点击