关于mysql二进制文件

358 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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 以便进行后续实验

  1. 查看当前二进制日志文件信息,其命令如下:

    SHOW master status;
    

    输出结果:

    图片描述

  2. 查看当前所有的二进制日志文件,其命令如下:

    SHOW binary logs;
    

    输出结果:

    图片描述

    也可以使用 SHOW master logs 命令,结果一样。

  3. 查看二进制日志文件内容

    用二进制格式存储日志信息,可以使日志写入更高效,但是不能直接查看其内容。需要使用 mysqlbinlog 命令查看二进制日志,例如:

    mysqlbinlog --no-defaults binlog.000001
    

image.png

删除二进制文件的两种方式

二进制日志文件的删除分两种情况,手动删除和自动清理。

手动删除,可使用 purge 命令和 reset 命令。

  1. purge 命令使用格式:

    PURGE BINARY LOGS TO '日志名'
    

    其含义是删除某个日志之前的所有二进制日志文件。

    PURGE BINARY LOGS BEFORE '2020-09-03 09:00:00';
    

    表示清除指定时间节点以前的所有日志文件。

  2. 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
  1. 查看现在 binlog 的过期时间:

    SHOW variables LIKE 'binlog_expire_logs_seconds';
    

    其结果如下:

    图片描述

  2. 当然也可以在命令行中直接设置,如修改为 10 天也就是 864000 秒,其命令如下:

    SET GLOBAL binlog_expire_logs_seconds = 864000;
    

    存在时间超过 10 天的 binlog 将被自动清除。