携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
什么是mysql日志
MySQL 日志是用来记录 MySQL 数据库的客户端连接情况、SQL 语句执行情况以及错误信息的。例如,MySQL 服务器在某个时间突然停止了,相关信息就会记录到日志文件中。
MySQL 中常用的日志有多种,我们在这里着重介绍二进制日志的作用。
二进制日志(binary log)又叫作变更日志(update log),主要用于记录数据库的变化情况,不记录查询语句。通过二进制日志可以查看 MySQL 数据库进行了哪些改变。
启动与查看二进制文件
二进制日志中记录了对 MySQL 数据库的所有写操作,并且记录了语句发生时间、执行时长、操作数据等其它额外信息,但是它不记录 SELECT、SHOW 等对数据库的读操作。二进制日志主要用于数据库恢复、主从同步、审计(audit)和性能优化。该功能默认情况下是关闭的,可以使用 SHOW variables LIKE 'log_bin%' 命令查看二进制日志的状态:
SHOW variables LIKE 'log_bin%';
输出结果:
其中 log_bin 如果为 OFF 则表示二进制日志功能是关闭状态,log_bin_basename 表示的是二进制日志文件的存储位置。
我们可以修改日志的存放路径,可以在 [mysqld] 组下修改 log-bin 参数,方法如下:
log-bin [=DIR\filename]
其中,DIR 指定二进制日志文件存放路径,filename 指定二进制日志文件名前缀。日志文件名是前缀加数字后缀:filename.number,number 为 000001、000002 等自动生成的数字。另外,还有一个名为 filename.index 的文件会被自动生成,其内容是二进制日志文件清单。每次重启 MySQL 服务后,都会生成一个新的二进制日志文件,这些日志文件的 number 会不断递增。如果 log-bin 不设置参数,二进制文件默认存储在数据库的数据目录下。默认的文件名为 hostname-bin.number,其中 hostname 为主机名。
二进制日志文件可以用于还原数据库,所以二进制日志文件的存放位置有个小技巧,那就是不要和数据文件放同一块硬盘上,或者将其存储在云端。这样,即使数据文件损坏了也可以通过二进制日志文件进行恢复。
例如,指定二进制文件名为 mysql-bin:
sudo vim /etc/mysql/my.cnf
在[mysqld]末尾插入以下数据:
[mysqld]
server-id=1
log-bin=mysql-bin
启动 MySQL 以便进行后续实验
-
查看当前二进制日志文件信息,其命令如下:
SHOW master status;输出结果:
-
查看当前所有的二进制日志文件,其命令如下:
SHOW binary logs;输出结果:
也可以使用
SHOW master logs命令,结果一样。 -
查看二进制日志文件内容
用二进制格式存储日志信息,可以使日志写入更高效,但是不能直接查看其内容。需要使用 mysqlbinlog 命令查看二进制日志,例如:
mysqlbinlog --no-defaults binlog.000001
删除二进制文件的两种方式
二进制日志文件的删除分两种情况,手动删除和自动清理。
手动删除,可使用 purge 命令和 reset 命令。
-
purge 命令使用格式:
PURGE BINARY LOGS TO '日志名'其含义是删除某个日志之前的所有二进制日志文件。
PURGE BINARY LOGS BEFORE '2020-09-03 09:00:00';表示清除指定时间节点以前的所有日志文件。
-
reset 命令使用格式如下:
RESET MASTER上述命令为删除所有的二进制日志,注意全部清除后,MySQL 服务器会自动再生成一个 000001 编号的二进制日志文件。
设置自动清除
在 MySQL 先前版本中对日志控制使用的是 expire_logs_days 参数,而在 MySQL8 中替换成了 binlog_expire_logs_seconds 参数,从原先以天为单位,到现在以秒为单位,来达到更灵活的控制过期时间。
当其值为 0 时,表示不启动自动删除日志功能。如果启动了该功能,则表示超出设置时间的二进制日志文件会被自动删除,自动删除工作通常发生在 MySQL 服务器启动或 flush 日志的时候。
下面我们配置 my.cnf 文件把过期时间修改为 15 天,也就是 1296000 秒:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
然后重启数据库使修改生效:
sudo service mysql restart
-
查看现在 binlog 的过期时间:
SHOW variables LIKE 'binlog_expire_logs_seconds';其结果如下:
-
当然也可以在命令行中直接设置,如修改为 10 天也就是 864000 秒,其命令如下:
SET GLOBAL binlog_expire_logs_seconds = 864000;存在时间超过 10 天的 binlog 将被自动清除。