通过日志可以帮助管理员发现曾经发生过的事情

本文学习四种日志:

  • 错误日志
  • 二进制日志
  • 查询日志
  • 慢查询日志

错误日志

错误日志是MySQL最重要的日志之一,记录了MySQL启动和停止,以及服务器在运行过程中发生的严重错误的相关信息。当数据库无法使用时,建议首先看这个日志。

日志默认是开启的,默认目录在/var/log/,默认日志文件名是mysqld.log

我的手动更改了,可以查看一下位置show variables like '%log_error;'

image-20230710165547584

日志查看

tail /data/mysql/mysqld.log

image-20230710165946708

二进制日志

二进制日志(BINLOG)记录了所有的DDL(数据定义语言)和DML(数据操纵语言),但是不包括数据查询(select,show)

作用:①灾难时的数据恢复 ②MySQL的主从复制。

在MySQL8是默认开启的。

二进制日志的参数

show variables like '%log_bin%';

image-20230710170449503

解释

  • log_bin: 开启/关闭二进制日志ON/OFF
  • log_bin_basename:是binlog日志的基本文件名(日志的最终目录)
  • log_bin_index:是binlog文件的素引文件,这个文件管理了所有的binlog文件的目录
  • log_bin_trust_function_creators:限制存储过程,前面我们已经讲过了,这是因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用
  • log_bin_use_v1_row_events此只读系统变量已弃用。ON表示使用版本1二进制日志行,OFF表示使用版本2二进制日志行(MySQL5.6的默认值为2)。
  • sql_log_bin 表示当前会话是否记录 bin log,默认值on
日志格式 含义
STATEMENT 基于SQL语句的日志记录,记录的是SQL语句,对数据进行的修改的SQL都会记录在日志中
ROW 基于行的日志记录,记录的是每一行的变化(默认)
MIXED 混合上面两种模式,默认使用STATEMENT,特殊情况使用ROW

查看MySQL使用的日志格式show variables like '%binlog_format%';

image-20230710172328159

binlog查看

binlog是无法直接查看的,需要使用mysqlbinlog ,具体语法:

1
mysqlbinlog [参数]  logfilename

参数选项:

-d 指定数据库名称,只列出指定数据库相关操作
-o 忽略掉日志中的前n行命令
-v 将行事件重构为SQL语句
-w 将行事件重构为SQL语句,并且注释

image-20230710172316805

例如,查看binlog.0005

1
mysqlbinlog binlog.000005
image-20230710173546759

日志删除

对于业务繁忙的业务系统,每天生成的binlog数据巨大,如果长时间不删除,会占用很大的磁盘空间,下面几种方式删除

指令 含义
reset master 删除全部binlog日志
purge master logs to ‘binlog.XXXXXX’ 删除xxxxxx编号之前的日志
purge master logs before ‘yyyy-mm-dd hh24:mi:ss’ 删除日志为“yyyy-mm-dd hh24:mi:ss”之前产生的所有日志

查询日志

查询日志包含了客户端所有操作语句,而二进制日志是不包括的。

默认情况下是不开启的

查看是否开启show variables like '%general%';

image-20230710174324729

开启这日志

修改MySQL配置文件/etc/my.cnf(默认)

1
2
3
4
# 开启查询日志文件,0关闭,1开启
general_log=1
# 设置日志文件名,不指定默认文件名是host_name.log
general_log_file=mysql_query.log

重启service mysqld restart

查看日志tail -f /data/mysql/mysql_query.log

慢查询日志

慢查询日志记录了所有执行参数超过long_query_time设置值并且扫描记录不小于min_examined_row_limit的所有SQL语句,默认没有开启。long_query_time默认是10S,最小为0,进度可以到微秒。

开启日志

vim /etc/my.cnf

1
2
3
4
5
# 在这里追加
# 开启
slow_query_log=1
# 执行时间参数
ong_query_time=10

重启service mysqld restart

查看日志tail -f /data/mysql/localhost-slow.log

默认不会记录管理语句,也不会记录不使用索引进行查找的查询,可以在my.cnf修改

1
2
3
4
# 记录执行慢的管理语句
log_slow_admin_statements=1
# 记录不使用索引的查找语句
log_queries_not_using_indexs=1