头图

MySQL的binlog日志文件(也叫做:二进制日志)记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。若操作本身并没有导致数据库发生变化,那么该操作不会被写入binlog。binlog日志文件的主要作用:

  • 可以完成主从复制。在主服务器上把所有修改数据的操作记录到binlog中,通过网络发送给从服务器,从而达到主从同步。
  • 进行恢复操作。数据可以通过binlog日志,使用mysqlbinlog命令,实现基于时间点和位置的恢复操作。

视频讲解如下:
https://www.bilibili.com/video/BV1v9YDeyE4V/?aid=112942540391...

下表列举了binlog文件的三种模式。
image.png

与binlog非常相似的一个概念叫做redo log,下表列出了二者的区别。
image.png

下面我们通过一个简单的例子来说明binlog的作用。

(1)查看MySQL是否启用binlog

mysql> show variables like '%log_bin%';

# 输出的信息如下:
+------------------+------------------------------------+
| Variable_name    | Value                              |
+------------------+------------------------------------+
| log_bin          | ON                                 |
| log_bin_basename | /usr/local/mysql/data/binlog       |
| log_bin_index    | /usr/local/mysql/data/binlog.index |
+------------------+------------------------------------+

# 其中:
# log_bin:表示是否开启了binlog。
# log_bin_basename:binlog日志的基本文件名,最终生成的binlog文件会追加标识来表示每一个文件
# log_bin_index:指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录 。
提示:从MySQL 8开始默认启用了binlog。但是在MySQL 8之前的版本中,默认并没有开启Binlog。需要修改my.cnf文件增加下面的参数,并重启MySQL以启用binlog。
log-bin=mysql-binlog
server-id=1
注意:这里的mysql-binlog是生成的binlog的文件名。

(2)将binlog的格式设置为STATEMENT,即:每条改变数据的语句都被记录到binlog中。

mysql> set binlog_format = 'STATEMENT';
提示:binlog_format参数的默认值是ROW模式,执行下面的语句:
mysql> select @@binlog_format;

# 输出的信息如下:
+-------------------+
| @@binlog_format   |
+-------------------+
| ROW               |
+-------------------+

(3)查看当前的binblog日志文件是哪个。

mysql> show master status \G;

# 输出的信息如下:
*************************** 1. row ***************************
             File: binlog.000010
         Position: 12255
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 3f332e68-9d5c-11ec-9a32-000c298c28d2:1-176384
1 row in set (0.00 sec)

(4)创建测试表,并插入测试数据。

mysql> use demo1;
mysql> create table test4(tid int,tname varchar(10),money int);
mysql> insert into test4 values(1,'Tom',1000);

(5)修改数据

mysql> update test4 set money=1234 where tid=1;

(6)查看binlog中记录的日志信息

mysql> show binlog events in 'binlog.000010';

# 输出的信息如下:
use `demo1`; create table test4(tid int,tname varchar(10),money int)
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                
BEGIN                                                               
use `demo1`; insert into test4 values(1,'Tom',1000)                 
COMMIT /* xid=27 */                                                 
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                
BEGIN                                                               
use `demo1`; update test4 set money=1234 where tid=1                
COMMIT /* xid=28 */ 
提示:也可以通过下面的语句直接查看binlog日志:
mysqlbinlog --no-defaults binlog.000001

赵渝强老师
33 声望11 粉丝

20年以上的IT行业从业经历,清华大学计算机软件工程专业毕业,京东大学大数据学院院长,Oracle中国有限公司高级技术顾问;曾在BEA、甲骨文、摩托罗拉等世界500强公司担任高级软件架构师或咨询顾问等要职,精通大...