MySQL logrotate配置

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手机慢查询信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值