MySQL8.0-日志管理

432 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

日志筛选器

select @@global.log_error_services;

+----------------------------------------+
| @@global.log_error_services            |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+

表示日志事件首选穿过内置的筛选器组件 log_filter_internal ,然后穿过内置的日志写入组件 log_sink_internal。组件是按照列出顺序执行的

在 log_error_services 的值中,指定的任何可加载(非内置)组件都需要通过 install component进行安装

配置错误日志

错误日志记录由 log_error变量(在启动脚本使用--log-error)控制

如果没有给出--log-error,则默认的目标文件是控制台

如果没有命名文件的情况下给出了--log-error,则默认是目标文件是一个在数据目录中名为host_name.err的文件

如果--log-error被制定来命名一个文件,默认的目标文件就是该文件(如果文件没有后缀,则自动添加一个.err后缀)如果没有用一个绝对路径来指定别的位置,那么这个文件就位于数据目录下

系统变量 log_error_verbsity控制着服务器将错误、警告和注释信息记录到错误日志的冗余情况。可以使用的值有如下:

  • 1:只输出错误
  • 2:输出错误和警告
  • 3:输出错误、警告、注释(默认)

如果需要修改错误日志的位置,则需要修改my.cnf并重启

修改日志目录

创建目录

sudo mkdir /data/logs
# 手动创建一个日志文件
echo "" > logs/mysqld.log
sudo chown -R mysql:mysql /data/logs

修改my.cnf

sudo vi /etc/my.cnf

增加 log-error

[mysqld]
log-error=/data/logs/mysqld.log

重启mysql

sudo /etc/init.d/mysql restart
# 查看日志
cat logs/mysqld.log
# 登陆mysql查看是否修改成功
show variables like 'log_error';

调整冗余信息

log_error_verbsity 可以动态修改,修改后无需重启mysql

set @@global.log_error_verbosity=2;

# 查看修改结果
select @@global.log_error_verbosity;

系统变量 log_error_verbsity控制着服务器将错误、警告和注释信息记录到错误日志的冗余情况。可以使用的值有如下:

  • 1:只输出错误
  • 2:输出错误和警告
  • 3:输出错误、警告、注释(默认)

轮转错误日志

当日志文件过大时,我们需要分离出多个文件

sudo mv /data/logs/mysqld.log /data/logs/mysqld.log.0
mysqladmin -u root -p123456 flush-logs

# 合并执行
sudo mv /data/logs/mysqld.log /data/logs/mysqld.log.0 && mysqladmin -u root -p123456 flush-logs

当执行第二行后,会新建一个mysqld.log文件

在第五行,可以使用cron计划,每天定时执行

通用查询日志 & 慢查询日志

通用查询日志

修改日志文件配置

# 查看日志文件路径
select @@global.general_log_file;
# 修改日志文件路径
set @@global.general_log_file='/data/query_log/query.log';

注意:如果在修改日志文件路径时出错,那么需要将目录权限设为mysql

sudo chown -R mysql:mysql /data/query_log/

开启日志记录

查看日志是否开启(ON是开,OFF是关)

show variables like 'general_log';

开启日志

set global general_log=on;

然后查看 query.log 文件,可以看到每次查询的sql都会在这里记录

cat /data/query_log/query.log

如果我们将日志写入方式修改为 table

查看日志写入方式(文件file和、数据表table)

show variables like 'log_output';

更改日志写入方式

set global log_output='table';

那么现在查看日志的方式就是

查询日志信息

select * from mysql.general_log;

注意:通用查询日志会造成巨大的日志,所以启用需谨慎

慢查询日志

慢查询日志包含了执行时间超过了 long_query_time秒(默认10秒),或者至少扫描了 max_examined_row_limit行(默认0)的SQL语句

修改慢查询日志的最大时间

查询超时时间

select @@global.long_query_time;

修改超时时间

set @@global.long_query_time=1;

修改慢查询日志的日志路径

创建目录 & 文件 略:/data/slow_query/slow_query.log

目录授权

sudo chown -R mysql:mysql /data/slow_query/

查询慢查询日志文件路径

select @@global.slow_query_log_file;

修改日志文件路径

set @@global.slow_query_log_file='/data/slow_query/slow_query.log';

刷新日志

flush logs;

启用慢查询日志

查看是否启用(0未启用1已启用)

select @@global.slow_query_log;

启用慢查询日志

set @@global.slow_query_log=1;

如果将 log_output设置为了table,那么将会在如下表中记录

select * from mysql.slow_log;

切换日志表

如果数据表数量过大,可以创建一个新的表来替代

drop table if exists mysql.general_log_new;
create table mysql.general_log_new like mysql.general_log;
rename table mysql.general_log to mysql.general_log_1, mysql.general_log_new to mysql.general_log;