【快速说明】如何轮换 MySQL 的 slow.log 文件

你好。


是一名学徒工程师

 

你有没有过这样的经历?

“嗯,我闲着无聊,就试试输入df命令吧。”

“什么?/ 目录的使用率达到了 95%?为什么?!”

“让我想想,还有什么更多呢?”

“这……这到底是什么时候发生的?!怎么会堆积了这么多 MySQL slow.log 文件?!”

“我必须做点什么……但我该做什么呢?!”

在这种情况下,对数旋转是解决办法。

什么是对数旋转?

首先,让我们从这个词的含义开始。

日志...“记录”

轮流……“循环,轮流”

根据以上内容,轮换记录指的是“轮换日志文件”。

man 命令的输出还显示:

Logrotate旨在简化生成大量日志文件的系统的管理。
它可以自动轮换、压缩、删除和发送日志文件。
每个日志文件都会按日、周、月或文件过大时进行处理

换句话说,这是一种防止因压缩或删除大量日志文件而占用过多磁盘空间的方法。

目标

本文将压缩存储 MySQL 慢查询的慢日志。

设置如下:

设置详情 价值
需要保留的日志 /var/lib/mysql/localhost-slow.log
自转周期 日常的
保留的世代数 第七代
慢日志确定时间 1.0(秒)

环境

操作系统/软件包 版本
核心 3.10.0
CentOS 7.2.1
MySQL 8.0.31
对数旋转 3.8.6

具体流程

MySQL慢查询日志输出设置

* 省略了 MySQL 安装。

检查初始设置

登录 MySQL 后,输入以下命令:

显示类似“%slow%”的变量;

○输出结果示例

+--------------------------+-----------------------------------+ | Variable_name | Value | +--------------------------+-----------------------------------+ | log_slow_admin_statements | OFF | | log_slow_extra | OFF | | log_slow_replica_statements | OFF | | log_slow_slave_statements | OFF | | slow_launch_time | 2 | /var/lib/mysql/localhost-slow.log | +-----------------------------+-----------------------------------+ 7 rows in set (0.31 sec)

启用 slow_query_log 后,慢查询日志将输出到 /var/lib/mysql/localhost-slow.log。

 

设置时间以确定查询是否为慢查询

设置全局变量 long_query_time = 1.0;

请使用以下命令验证更改是否已生效:

显示类似 '%query_time%' 的全局变量;

○ 输出结果

+-----------------+----------+ | 变量名 | 值 | +-----------------+----------+ | 查询耗时 | 1.000000 | +-----------------+----------+ 1 行结果 (0.01 秒)

 

启用慢查询日志输出设置

设置全局慢查询日志 = '开启';

如果以下命令的输出与示例输出类似,则说明没有问题。

显示类似 '%slow_query%' 的全局变量;

○输出结果示例

+---------------------+-----------------------------------+ | 变量名 | 值 | +---------------------+-----------------------------------+ | slow_query_log | 开启 |

 

 

为 FLUSH LOG 创建一个用户

创建用户“flush”@“localhost”,密码为“[任意密码]”;

要确认用户是否已创建,请检查以下命令的输出中是否存在该用户,如果登录成功,则说明创建成功。

从 mysql.user 表中选择用户和主机名;

 

 

授予用户清除日志的权限

GRANT RELOAD ON *.* TO 'flush'@'localhost';

要检查创建是否成功,请检查以下命令的输出,看看是否已授予预期的权限。

显示对 'flush'@'localhost' 的授权;

○输出结果示例

+----------------------------------------------------+ | 授予 flush@localhost 权限 | +----------------------------------------------------+ | 授予 `flush`@`localhost` 对 *.* 的 RELOAD 和 PROCESS 权限 | +----------------------------------------------------+ 1 行结果 (耗时 0.04 秒)

当创建的刷新用户登录时,调整权限。

vi /var/lib/mysql/.my.cnf

编辑内容

[客户端] 用户名=刷新密码=[在 4.1.4 中输入的密码。]

 

重新打开日志文件

mysql --defaults-extra-file=/var/lib/mysql/.my.cnf -e "FLUSH SLOW LOGS;"

如果没有输出错误,则表示成功!

日志轮换设置

  1. 编辑 slow.log 轮播配置文件
  2. 测试运行

编辑 slow.log 轮播配置文件

切换到工作目录
cd /etc/logrotate.d/
写入配置文件

*请以 root 用户身份创建
(要求:1)文件所有者/组为 root:root;2)文件权限为 644)

vi mysql

↓描述

/var/lib/mysql/*slow.log { daily rotate 7 dateext missingok notifempty sharedscripts delaycompress copytruncate compress postrotate # 仅当 mysqld 确实在运行时执行 if test -x /usr/bin/mysqladmin /usr/bin/mysqladmin --defaults-extra-file=/var/lib/mysql/.my.cnf ping &> /dev/null then mysql --defaults-extra-file=/var/lib/mysql/.my.cnf -e "FLUSH SLOW LOGS;" fi endscript }

※解释

我们将以上述示例设置为例进行说明。
*还有更多选项,如果您感兴趣,请查看。您可以根据自身需求和实际情况进行调整。

  1. 每日(默认每周) -
    每周轮换
  2. 旋转 [任意数字] *在本例中,7.
    决定要保留的代数。
  3. missingok
    即使日志文件不存在,也继续处理而不会出错
  4. notifempty
    如果日志文件为空,则不要轮换日志文件。
  5. delaycompress *与 compress 配合使用。
    延迟日志压缩,直到下一次日志轮转。与 compress 一起指定。
  6. copytruncate
    复制日志文件并删除源文件的内容。

  7. 使用 gzip压缩
  8. postrotate 和 endscript
    之间编写的命令
    (在本例中,如果与 MySQL 的 ping 通信成功,则会重新加载 slow.log 文件。)

测试运行

现在我们只能祈祷不要出现任何错误。

logrotate -dv /etc/logrotate.d/mysql

执行详情将会输出,只要没有错误信息就没问题。

最后

这次,我们介绍了如何轮换 MySQL slow.log 文件!

服务运行时,日志不可避免地会不断累积。

并非每个人都能无限扩展磁盘容量,所以一定要明智地轮换使用磁盘,过节俭的生活!

如果您觉得这篇文章有帮助,请点赞!
7
加载中...
7 票,平均:1.00 / 17
5,858
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

诚实地

我是一名见习工程师。