1 错误日志
错误日志(Error Log):错误日志记录了MySQL引擎在运行过程中出现的错误和异常情况。这些错误可能包括启动和关闭问题、数据库崩溃、权限问题等。错误日志对于排查和解决MySQL引擎问题非常有帮助。
改日志默认开启,默认存放目录/var/log
,默认日志文件名称`mysqld.log。查看日志文件位置:
show variables like '%log_error%';
mysql> show variables like ‘%log_error%’;
Variable_name | Value |
---|---|
binlog_error_action | ABORT_SERVER |
log_error | stderr |
log_error_services | log_filter_internal; log_sink_internal |
log_error_suppression_list | |
log_error_verbosity | 2 |
- 该mysql为docker容器中安装运行,位置为标准的错误输出。
下面我们通过修改auto.cnf中UUID让mysql启动报错,来演示错误。
/var/lib/mysql/auto.cnf
内容如下所示:
[auto]
server-uuid=1ceab188-df23-11ed-ab6f-0242ac110002
mysql服务器uuid唯一且位数固定,现在我们删去最后一位,再次启动mysql
报错信息显示auto.cnf中UUID非法无效,现在我们改回之前的server-uuid,问题来了,我们的mysql之前未挂载msyql目录,现在mysql容器启动不起来,不能进入容器,修改不了auto.cnf文件了怎么办呢?
首先要记住一点,你看不到不表示它没有。
第二步:把mysql文件夹下载到本地,右键save本地
第三步:修改mysql/auto.cnf为原server-uuid,右键import 在上传至原位置。
2 二进制日志
2.1 简介
二进制日志(BINLOG)记录所有的DDL(数据定义语言)语句和MDL(数据操纵语言)语句,但不包括(SELECT、SHOW)语句。
- 作用:
- 灾难时数据恢复;
- Mysql的主从复制;
二进制日志查看
show variables like '%log_bin%';
Variable_name | Value |
---|---|
log_bin | ON |
log_bin_basename | /var/lib/mysql/binlog |
log_bin_index | /var/lib/mysql/binlog.index |
log_bin_trust_function_creators | OFF |
log_bin_use_v1_row_events | OFF |
sql_log_bin | ON |
- Log_bin:二进制日志开关,mysql8.0默认开启;
- log_bin_basename: 二进制日志文件存放路径和基础文件名binlog;
- log_bin_index:二进制日志文件对应的索引记录
2.2 日志格式
Mysql服务器提供多种格式来记录二进制日志,具体格式及特点如下:
日志格式 | 含义 |
---|---|
STATEMENT | 基于SQL语句的日志记录,记录的是SQL语句,对数据修改的SQL都会记录在日志中。 |
ROW | 基于行的日志记录,记录的是每一行的数据变更。(默认) |
MIXED | 混合STATEMNET和ROW记录,默认采用STATEMENT记录,在某些特殊的情况下自动切换ROW记录。 |
查看日志格式
show variables like '%binlog_format%';
binlog_format | ROW
2.3 日志查看
由于日志以二进制存储,不能直接读取,需要通过二进制日志查询工具mysqlbinlog查看,具体语法
mysqlbinlog [参数选项] logfilename
参数选项:
-d 指定数据库名称,只列出指定数据库相关操作。
-o 忽略掉日志文件中的前n行
-v 将行事件(数据变更)重构为sql语句
-w 将行事件(数据变更)重构为sql语句,并输出注释信息
- 基于行的日志记录
对score表执行如下sql
update score set math = math+1;
查看日志文件binlog.000071,
mysqlbinlog -v binlog.000071
### UPDATE `gaogzhen`.`score`
### WHERE
### @1=1
### @2='Java'
### @3=66
### @4=88
### @5=95
### SET
### @1=1
### @2='Java'
### @3=67
### @4=88
### @5=95
### UPDATE `gaogzhen`.`score`
### WHERE
### @1=2
### @2='Rose'
### @3=90
### @4=66
### @5=99
### SET
### @1=2
### @2='Rose'
### @3=91
### @4=66
### @5=99
### UPDATE `gaogzhen`.`score`
### WHERE
### @1=3
### @2='Java'
### @3=98
### @4=77
### @5=80
### SET
### @1=3
### @2='Java'
### @3=99
### @4=77
### @5=80
-
where 记录是的更新前的数据;set记录更新后的数据。
-
@1表示第一列
-
基于STATEMENT的日志格式
在my.cnf中设置
binlog_format=STATEMENT
重启mysql,生成新的日志文件,执行相同的sql操作,再次查看日志内容
update score set math=math+1
2.4 日志删除
对于比较繁忙的业务系统,每天生成的binlog数量巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理:
指令 | 含义 |
---|---|
reset master | 删除全部binlog日志,删除之后,日志编号,将从binlog.000001开始 |
purge master logs to ‘binlog.*****’ | 删除* 编号之前的日志 |
purge master logs before ‘yyyy-mm-dd hh24:mi:ss’ | 删除指定时间之前的日志 |
也可以在mysql的配置文件中配置二进制日志的过期时间,设置之后,二进制日志过去会自动删除
show variables like '%binlog_expire_logs_seconds%';
binlog_expire_logs_seconds | 2592000 默认30天
3 查询日志
查询日志中记录了客户端的所有操作语句,而二进制日志不包含查询数据的SQL语句。默认情况下,查询日志是未开启的。如果需要开启查询日志,可以开启以下设置。
show variables like '%general%'
Variable_name | Value |
---|---|
general_log | OFF |
general_log_file | /var/lib/mysql/a584ba590640.log |
第一步my.cnf配置查询日志
general_log=ON
general_log_file=/var/lib/mysql/mysql_query.log
第二步执行sql操作,查看配置的查询日志
tail -f mysql_query.log
如下图所示:
在业务繁忙的系统中开启查询日志,查询日志会非常大,如果非不要不建议开启。
4 慢查询日志
慢查询日志记录了所有时间超过参数long_query_time设置值并且扫描记录数不小于
min_examined_row_limit
的所有的SQL语句的日志,默认未开启。long_query_time
默认10s,最小为0,精度可以到微妙。
第一步配置my.cnf中慢查询
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow-log.log
long_query_time=2
slog_query_log
:1开启慢查询日志slow_query_log_file
:设置慢查询日志文件long_query_time
:设置阈值时间
第三步:查看慢查询日志,操作数据库
tail -f slow_log.log
如下图所示:
默认情况下,不会记录管理语句,也不会记录不使用索引进行查询的语句。可以使用
log_slo_admin_statements
和log_queries_not_using_indexes
# 记录执行较慢的管理语句
log_slow_admin_statements=1
# 记录较慢的未使用索引的语句
log_queries_not_using_indexes=1
结语
如果小伙伴什么问题或者指教,欢迎交流。
❓QQ:806797785
参考链接:
[1]MySQL数据库视频[CP/OL].2020-04-16.p153-157.