MySQL的binlog日志文件(也叫做:二进制日志)记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。若操作本身并没有导致数据库发生变化,那么该操作不会被写入binlog。binlog日志文件的主要作用:
- 可以完成主从复制。在主服务器上把所有修改数据的操作记录到binlog中,通过网络发送给从服务器,从而达到主从同步。
- 进行恢复操作。数据可以通过binlog日志,使用mysqlbinlog命令,实现基于时间点和位置的恢复操作。
视频讲解如下:
下表列举了binlog文件的三种模式。
与binlog非常相似的一个概念叫做redo log,下表列出了二者的区别。
下面我们通过一个简单的例子来说明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