二进制文件(binlog)记录对MySQL数据库执行更改的全部操做,但不包括SELECT和SHOW这类操做,由于这类操做没有改变数据。mysql
首先 binlog 是 Server 层的日志模块,最初设计来是为了归档(备份)使用的。通过多个版本的发展,如今 binlog 主要有三个做用:sql
下面以一条Update语句来介绍 binlog 是如何记录的。shell
mysql> update T set c=c+1 where ID=2;
这里涉及两阶段提交和 redo log 的内容,感兴趣的移步到此处。数据库
binlog 的写入时机是在数据更改后,事务提交前。ubuntu
binlog 记录逻辑SQL语句。vim
当执行如下命令:并发
mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1; mysql> show binlog events in 'master.000001';
其中'master.000001'是binlog的文件名。编辑器
binlog 记录的内容以下图所示:设计
优势:省空间:只记录逻辑语句。rest
缺点:可能产生主备不一致。
mysql> delete from t /*comment*/ where a>=4 and t_modified<='2018-11-10' limit 1;
上面的SQL,假如在主库使用索引 a,而备库使用索引 t_modified 会致使删除的记录不同。
binlog 记录表的行更改状况。配合 READ COMMITED,得到更好的并发性。
查看 binlog 内容:mysql> show binlog events in 'master.000001';
(其中'master.000001'是binlog的文件名)
解析 binlog 内容:使用 mysqlbinlog 命名解析 binlog 内容。
liang24@ubuntu:~$ mysqlbinlog -vv data/master.000001 --start-position=8900;
优势:记录原始数据;保证主备一致性;
缺点:
一、费空间:由于要保存原始数据;
例如:删除十万行数据,STATEMENT 格式只记录逻辑语句,而 ROW 会记录十万条日志,至关费空间。
二、费IO
例如:删除十万行数据,ROW 会记录十万条日志,而写 binlog 会耗费必定的 IO。
推荐使用 binlog_format=ROW:能记录原记录数据。误操做时,可以根据原数据进行恢复,例如 Delete 就转写成 Insert,Update 就把 Update 前的再执行一次。
由于 STATEMENT 和 ROW 各有优缺点,所以 MySQL 新增了一种格式 MIXED,采用折中方案,MySQL 会判断采用 STATEMENT 仍是 ROW 来记录 binlog。
一、查看是否开启
mysql 默认是不开启 binlog 的。
mysql> show variables like 'log_bin%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin | OFF | | log_bin_basename | | | log_bin_index | | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+-------+ 5 rows in set (0.00 sec)
从结果看到 log_bin=OFF
,知道没有开启 binlog。
二、开启 binlog 日志
退出 MySQL,使用 vi 编辑器修改 MySQL 的 my.cnf 配置文件(vim /etc/my.cnf)
# server-id:表示节点名称 server-id=1 # log-bin:表示存储binlog日志的目录和binlog的文件名 log-bin=/var/lib/mysql/mysql-bin
三、重启 MySQL 及查看 binlog 开启状态
service mysql restart
登陆 MySQL,输入 show variables like '%log_bin%';
查看到 binlog=ON ;
mysql> show variables like 'log_bin%'; +---------------------------------+--------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+--------------------------------+ 5 rows in set (0.00 sec)