Binlog 概念
binlog 是 逻辑日志,用于记录数据库执行的写入操作(查询不记录)信息,并且是顺序写。
binlog 属于 MySQL Server 层记录,和引擎层无关。
逻辑日志,属于 MySQL Server 层记录;binlog 记录语句的原始逻辑。
物理日志,属于 InnoDB 存储引擎产生的;redo log 记录某个数据页上做了什么修改。
当 MySQL 创建二进制日志文件时,先创建一个以“filename”为名称、以“.index”为后缀的文件,再创建一个以“filename”为名称、以“.000001”为后缀的文件。
MySQL 服务重新启动一次,以“.000001”为后缀的文件就会增加一个,并且后缀名按 1 递增。即日志文件的个数与 MySQL 服务启动的次数相同;如果日志长度超过了 max_binlog_size 的上限(默认是 1GB),也会创建一个新的日志文件。
Binlog 作用
Binlog 存储格式
binlog 日志有三种格式,可以通过 binlog_format 参数指定,具体参见 Binlog 存储格式。
Binlog 存储时机
binlog 的写入时机也非常简单,事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。
因为一个事务的 binlog 不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为 binlog cache。
系统给 binlog cache 分配了一片内存,每个线程一个。我们可以通过 binlog_cache_size 参数控制单个线程 binlog cache 大小。如果存储内容超过了这个参数,就要暂存到磁盘( Swap )。
Binlog 刷盘时机
write 和 fsync 的时机,可以由参数 sync_binlog 控制,默认是 0。
sync_binlog = 0
- 每次提交事务都只
write,由系统自行判断什么时候执行fsync。 - 机器宕机,
page cache里面的 binglog 会丢失。
sync_binlog = 1
- 每次提交事务进行
write+fsync。
sync_binlog = N
- 每次提交事务都
write,但累积N个事务后才fsync。 - 在出现
IO瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。 - 机器宕机,会丢失最近
N个事务的binlog日志。
在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。
Binlog 配置、内容查看、恢复数据
查看与修改配置
查看配置 binlog 参数配置
show variables like '%log_bin%';
查看 binlog 格式
show variables like 'binlog_format';修改 MySQL 的 my.cnf 或 my.ini 文件可以设置二进制日志的相关参数:
log-bin= # binlog文件位置
binlog_expire_logs_seconds=600
max_binlog_size=100M命令行(只能)修改 session 级别
SET sql_log_bin=0;查看当前二进制日志文件列表及大小
SHOW BINARY LOGS;
查看 binlog 日志内容
将行事件以伪 SQL 的形式表现出来
mysqlbinlog -v "/var/lib/mysql/binlog/xxx-bin.000002"将行事件以伪 SQL 的形式表现出来,其中关闭 binlog 格式的语句。
mysqlbinlog -v --base64-output=DECODE-ROWS "/var/lib/mysql/binlog/atguigu-bin.000002"可查看参数帮助
mysqlbinlog --no-defaults --help更方面的查询命令
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
IN 'log_name':指定要查询的 binlog 文件名(不指定就是第一个 binlog 文件)FROM pos:指定从哪个 pos 起始点开始查起(不指定就是从整个文件首个 pos 点开始算)LIMIT [offset]:偏移量(不指定就是 0)row_count: 查询总条数(不指定就是所有行)
还可以通过 MySQL Binlog 日志查看 来了解下。
删除二进制日志
MySQL 的二进制文件可以配置自动删除,同时 MySQL 也提供了安全的手动删除二进制文件的方法。
PURGE MASTER LOGS 只删除指定部分的二进制日志文件, RESET MASTER 删除所有的二进制日志文件。具体如下:
PURGE {MASTER | BINARY} LOGS TO ‘指定日志文件名’
PURGE {MASTER | BINARY} LOGS BEFORE ‘指定日期’