mysql binlog入门

binlog

什么是binlog

binlg记录了所有的表结构变更(CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…),以事件形式记录,还包含语句所执行的消耗的时间。

简单的说就是,只要对表结构与表数据的修改,就会以事件的形式记录到binlog日志。系统管理员可以借助binlog日志,进行数据恢复、主从同步,统计分析等操作

有什么用

  • binlog 的主要目的是主从复制和数据的增量恢复。。

通过binlog就可以将一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器(slave),以实现灾难恢复、水平扩展、统计分析、远程数据分发等功能。

如何使用binlog

开启binlog

  • 永久开启binlog
vim /etc/my.cnf
[mysqld]
# 开启binlog
log-bin = mysql-bin

/etc/init.d/mysqld restart
  • 检查是否开启成功
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
  • 临时开启binlog
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

关于binlog的常用命令

# 是否启用binlog日志
show variables like 'log_bin';

# 查看详细的binlog日志配置信息
show global variables like '%log%';

# 查看binlog的目录
show global variables like "%log_bin%";

# 查看binlog文件日志列表
show binary logs;

# 查看最新一个binlog日志文件名称和Position(操作事件pos结束点)
show master status;

# 刷新log日志,自此刻开始产生一个新编号的binlog日志文件
# 每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
flush logs;

# 查看第一个binlog文件内容
show binlog events  

# 查看具体一个binlog文件的内容
show binlog events in 'master.000001';

# 重置(清空)所有binlog日志
reset master;

# 删除slave的中继日志
reset slave;

# 删除指定日期前的日志索引中binlog日志文件
purge master logs before '2022-02-22 00:00:00';

# 删除指定日志文件
purge master logs to 'master.000001';

查出binlog的事件

语法

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> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      622 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> show binlog events in 'mysql-bin.000001';
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                   |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
| mysql-bin.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.33-0ubuntu0.16.04.1-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids |         1 |         154 |                                                        |
| mysql-bin.000001 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                   |
| mysql-bin.000001 | 219 | Query          |         1 |         291 | BEGIN                                                  |
| mysql-bin.000001 | 291 | Table_map      |         1 |         344 | table_id: 108 (test.mytest)                            |
| mysql-bin.000001 | 344 | Update_rows    |         1 |         408 | table_id: 108 flags: STMT_END_F                        |
| mysql-bin.000001 | 408 | Xid            |         1 |         439 | COMMIT /* xid=39 */                                    |
| mysql-bin.000001 | 439 | Anonymous_Gtid |         1 |         504 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                   |
| mysql-bin.000001 | 504 | Query          |         1 |         576 | BEGIN                                                  |
| mysql-bin.000001 | 576 | Table_map      |         1 |         629 | table_id: 108 (test.mytest)                            |
| mysql-bin.000001 | 629 | Write_rows     |         1 |         678 | table_id: 108 flags: STMT_END_F                        |
| mysql-bin.000001 | 678 | Xid            |         1 |         709 | COMMIT /* xid=41 */                                    |
| mysql-bin.000001 | 709 | Rotate         |         1 |         756 | mysql-bin.000002;pos=4                                 |
+------------------+-----+----------------+-----------+-------------+--------------------------------------------------------+
13 rows in set (0.00 sec)


mysql> show binlog events in 'mysql-bin.000003';
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                                      |
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------+
| mysql-bin.000003 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.33-0ubuntu0.16.04.1-log, Binlog ver: 4    |
| mysql-bin.000003 | 123 | Previous_gtids |         1 |         154 |                                                           |
| mysql-bin.000003 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                      |
| mysql-bin.000003 | 219 | Query          |         1 |         291 | BEGIN                                                     |
| mysql-bin.000003 | 291 | Table_map      |         1 |         344 | table_id: 115 (test.mytest)                               |
| mysql-bin.000003 | 344 | Update_rows    |         1 |         407 | table_id: 115 flags: STMT_END_F                           |
| mysql-bin.000003 | 407 | Xid            |         1 |         438 | COMMIT /* xid=456 */                                      |
| mysql-bin.000003 | 438 | Anonymous_Gtid |         1 |         503 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                      |
| mysql-bin.000003 | 503 | Query          |         1 |         622 | use `test`; DROP TABLE `mytest` /* generated by server */ |
+------------------+-----+----------------+-----------+-------------+-----------------------------------------------------------+
9 rows in set (0.00 sec)

查看binlog日志内容

  • 需要借助mysqlbinlog工具
root@dg02-xianwetitest-dy03:/var/log/mysql# mysqlbinlog mysql-bin.000001
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240429 15:26:55 server id 1  end_log_pos 123 CRC32 0x60124025 	Start: binlog v 4, server v 5.7.33-0ubuntu0.16.04.1-log created 240429 15:26:55 at startup
ROLLBACK/*!*/;
BINLOG '
v0svZg8BAAAAdwAAAHsAAAAAAAQANS43LjMzLTB1YnVudHUwLjE2LjA0LjEtbG9nAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC/Sy9mEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASVAEmA=
'/*!*/;
# at 123
#240429 15:26:55 server id 1  end_log_pos 154 CRC32 0x45671611 	Previous-GTIDs
# [empty]
# at 154
#240429 15:27:20 server id 1  end_log_pos 219 CRC32 0x13e18364 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240429 15:27:20 server id 1  end_log_pos 291 CRC32 0x57afa1d9 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1714375640/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 291
#240429 15:27:20 server id 1  end_log_pos 344 CRC32 0xb82fc741 	Table_map: `test`.`mytest` mapped to number 108
# at 344
#240429 15:27:20 server id 1  end_log_pos 408 CRC32 0x6aa30bbe 	Update_rows: table id 108 flags: STMT_END_F

BINLOG '
2EsvZhMBAAAANQAAAFgBAAAAAGwAAAAAAAEABHRlc3QABm15dGVzdAADAw8DAjwABkHHL7g=
2EsvZh8BAAAAQAAAAJgBAAAAAGwAAAAAAAEAAgAD///4BQAAAAR4dzA1XgAAAPgFAAAABHh3MDVd
AAAAvgujag==
'/*!*/;
# at 408
#240429 15:27:20 server id 1  end_log_pos 439 CRC32 0x4e34ad89 	Xid = 39
COMMIT/*!*/;
# at 439
#240429 15:27:44 server id 1  end_log_pos 504 CRC32 0x268c5f40 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 504
#240429 15:27:44 server id 1  end_log_pos 576 CRC32 0xcb62e1e1 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1714375664/*!*/;
BEGIN
/*!*/;
# at 576
#240429 15:27:44 server id 1  end_log_pos 629 CRC32 0xbc66d528 	Table_map: `test`.`mytest` mapped to number 108
# at 629
#240429 15:27:44 server id 1  end_log_pos 678 CRC32 0x63198af6 	Write_rows: table id 108 flags: STMT_END_F

BINLOG '
8EsvZhMBAAAANQAAAHUCAAAAAGwAAAAAAAEABHRlc3QABm15dGVzdAADAw8DAjwABijVZrw=
8EsvZh4BAAAAMQAAAKYCAAAAAGwAAAAAAAEAAgAD//gGAAAABHh3MDZgAAAA9ooZYw==
'/*!*/;
# at 678
#240429 15:27:44 server id 1  end_log_pos 709 CRC32 0x931e24bd 	Xid = 41
COMMIT/*!*/;
# at 709
#240429 15:36:37 server id 1  end_log_pos 756 CRC32 0x2b455551 	Rotate to mysql-bin.000002  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
root@dg02-xianwetitest-dy03:/var/log/mysql#
  • 默认显示的是二进制数据,可以使用-vv参数,解析出二进制数据中的sql语句
root@dg02-xianwetitest-dy03:/var/log/mysql# mysqlbinlog mysql-bin.000001 -vv
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240429 15:26:55 server id 1  end_log_pos 123 CRC32 0x60124025 	Start: binlog v 4, server v 5.7.33-0ubuntu0.16.04.1-log created 240429 15:26:55 at startup
ROLLBACK/*!*/;
BINLOG '
v0svZg8BAAAAdwAAAHsAAAAAAAQANS43LjMzLTB1YnVudHUwLjE2LjA0LjEtbG9nAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC/Sy9mEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
ASVAEmA=
'/*!*/;
# at 123
#240429 15:26:55 server id 1  end_log_pos 154 CRC32 0x45671611 	Previous-GTIDs
# [empty]
# at 154
#240429 15:27:20 server id 1  end_log_pos 219 CRC32 0x13e18364 	Anonymous_GTID	last_committed=0	sequence_number=1	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#240429 15:27:20 server id 1  end_log_pos 291 CRC32 0x57afa1d9 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1714375640/*!*/;
SET @@session.pseudo_thread_id=3/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1436549152/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 291
#240429 15:27:20 server id 1  end_log_pos 344 CRC32 0xb82fc741 	Table_map: `test`.`mytest` mapped to number 108
# at 344
#240429 15:27:20 server id 1  end_log_pos 408 CRC32 0x6aa30bbe 	Update_rows: table id 108 flags: STMT_END_F

BINLOG '
2EsvZhMBAAAANQAAAFgBAAAAAGwAAAAAAAEABHRlc3QABm15dGVzdAADAw8DAjwABkHHL7g=
2EsvZh8BAAAAQAAAAJgBAAAAAGwAAAAAAAEAAgAD///4BQAAAAR4dzA1XgAAAPgFAAAABHh3MDVd
AAAAvgujag==
'/*!*/;
### UPDATE `test`.`mytest`
### WHERE
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw05' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=94 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw05' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=93 /* INT meta=0 nullable=1 is_null=0 */
# at 408
#240429 15:27:20 server id 1  end_log_pos 439 CRC32 0x4e34ad89 	Xid = 39
COMMIT/*!*/;
# at 439
#240429 15:27:44 server id 1  end_log_pos 504 CRC32 0x268c5f40 	Anonymous_GTID	last_committed=1	sequence_number=2	rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 504
#240429 15:27:44 server id 1  end_log_pos 576 CRC32 0xcb62e1e1 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1714375664/*!*/;
BEGIN
/*!*/;
# at 576
#240429 15:27:44 server id 1  end_log_pos 629 CRC32 0xbc66d528 	Table_map: `test`.`mytest` mapped to number 108
# at 629
#240429 15:27:44 server id 1  end_log_pos 678 CRC32 0x63198af6 	Write_rows: table id 108 flags: STMT_END_F

BINLOG '
8EsvZhMBAAAANQAAAHUCAAAAAGwAAAAAAAEABHRlc3QABm15dGVzdAADAw8DAjwABijVZrw=
8EsvZh4BAAAAMQAAAKYCAAAAAGwAAAAAAAEAAgAD//gGAAAABHh3MDZgAAAA9ooZYw==
'/*!*/;
### INSERT INTO `test`.`mytest`
### SET
###   @1=6 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw06' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=96 /* INT meta=0 nullable=1 is_null=0 */
# at 678
#240429 15:27:44 server id 1  end_log_pos 709 CRC32 0x931e24bd 	Xid = 41
COMMIT/*!*/;
# at 709
#240429 15:36:37 server id 1  end_log_pos 756 CRC32 0x2b455551 	Rotate to mysql-bin.000002  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
root@dg02-xianwetitest-dy03:/var/log/mysql#
  • 可以通过grep过滤出sql语句对应的行
root@dg02-xianwetitest-dy03:/var/log/mysql# mysqlbinlog mysql-bin.000001 -vv  |grep '###'
### UPDATE `test`.`mytest`
### WHERE
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw05' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=94 /* INT meta=0 nullable=1 is_null=0 */
### SET
###   @1=5 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw05' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=93 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO `test`.`mytest`
### SET
###   @1=6 /* INT meta=0 nullable=0 is_null=0 */
###   @2='xw06' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
###   @3=96 /* INT meta=0 nullable=1 is_null=0 */

binlog的使用场景

1、mysql主从复制

2、mysql数据恢复

3、数据同步,比如基于Canal投递MySQL Binlog到kafka、elasticsearch

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值