231_mysql_binlog解析&说明

举报
alexsully 发表于 2021/11/16 04:10:24 2021/11/16
【摘要】 binlog解析&详解&事件为基础

1 binlog

        Binary log 记录数据变更(insert/update/alter) 不记录查询(select,show)

 binlog 作用

  •         复制 主从复制
  •         数据恢复, 全备+增备(binlog备份) 可以将实例恢复到某一个时刻或具体位置
  •         日志审计, 解析binlog 所有变更操作,解析后进行日志审计

2 binlog 组成

       Binlog日志由 日志文件(记录变更信息) 和 索引文件(记录binlog文件列表) 组成

ll
mysql-bin.index; mysql-bin.000001, mysql-bin.000002, mysql-bin.000003
cat mysql-bin.index
#/home/mysql/data/binlog/mysql-bin.00001
#/home/mysql/data/binlog/mysql-bin.00002
#/home/mysql/data/binlog/mysql-bin.00003


3 binlog样例

select version() \G
show variables like "%binlog_format%" \G
flush logs;
create table test(id int primary key auto_increment, name varchar(20));
insert into test(`name`) values ('alex');
update test set name = 'sully' where name = 'alex'
delete from test where name = 'sully';
flush logs; 
#mysqlbinlog.exe -vv  --base64-output=decode-rows P_YUNYUJISUANAA-bin.000013
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#211114 16:45:10 server id 1  end_log_pos 125 CRC32 0x7ad847e8  Start: binlog v 4, server v 8.0.26 created 211114 16:45:10
# at 125
#211114 16:45:10 server id 1  end_log_pos 196 CRC32 0xdff3740f  Previous-GTIDs
# e0b21402-3ae8-11ec-8592-4ce17342dadc:1-3
# at 196
#211114 18:19:44 server id 1  end_log_pos 273 CRC32 0xa4f14232  GTID    last_committed=0        sequence_number=1       rbr_only=no     original_committed_timestamp=1636885184083421    immediate_commit_timestamp=1636885184083421     transaction_length=234
# original_commit_timestamp=1636885184083421 (2021-11-14 18:19:44.083421 中国标准时间)
# immediate_commit_timestamp=1636885184083421 (2021-11-14 18:19:44.083421 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885184083421*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:4'/*!*/;
# at 273
#211114 18:19:44 server id 1  end_log_pos 430 CRC32 0xb327ac6b  Query   thread_id=55    exec_time=0     error_code=0    Xid = 3372
use `nmg`/*!*/;
SET TIMESTAMP=1636885184/*!*/;
SET @@session.pseudo_thread_id=55/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
create table test2(id int primary key auto_increment, name varchar(20))
/*!*/;
# at 430
#211114 18:19:46 server id 1  end_log_pos 509 CRC32 0x0e2f1dd8  GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1636885186709669    immediate_commit_timestamp=1636885186709669     transaction_length=286
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1636885186709669 (2021-11-14 18:19:46.709669 中国标准时间)
# immediate_commit_timestamp=1636885186709669 (2021-11-14 18:19:46.709669 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885186709669*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:5'/*!*/;
# at 509
#211114 18:19:46 server id 1  end_log_pos 583 CRC32 0xf2d1c8cd  Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1636885186/*!*/;
BEGIN
/*!*/;
# at 583
#211114 18:19:46 server id 1  end_log_pos 640 CRC32 0xd29dc065  Table_map: `nmg`.`test` mapped to number 219
# at 640
#211114 18:19:46 server id 1  end_log_pos 685 CRC32 0x4043392f  Write_rows: table id 219 flags: STMT_END_F
### INSERT INTO `nmg`.`test`
### SET
###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
###   @2='alex' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
# at 685
#211114 18:19:46 server id 1  end_log_pos 716 CRC32 0x7715af57  Xid = 3379
COMMIT/*!*/;
# at 716
#211114 18:19:49 server id 1  end_log_pos 795 CRC32 0x272a73ba  GTID    last_committed=2        sequence_number=3       rbr_only=yes    original_committed_timestamp=1636885189580125    immediate_commit_timestamp=1636885189580125     transaction_length=307
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1636885189580125 (2021-11-14 18:19:49.580125 中国标准时间)
# immediate_commit_timestamp=1636885189580125 (2021-11-14 18:19:49.580125 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885189580125*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:6'/*!*/;
# at 795
#211114 18:19:49 server id 1  end_log_pos 878 CRC32 0x51a347ba  Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1636885189/*!*/;
BEGIN
/*!*/;
# at 878
#211114 18:19:49 server id 1  end_log_pos 935 CRC32 0xf7ec2ea0  Table_map: `nmg`.`test` mapped to number 219
# at 935
#211114 18:19:49 server id 1  end_log_pos 992 CRC32 0x0112e70a  Update_rows: table id 219 flags: STMT_END_F
### UPDATE `nmg`.`test`
### WHERE
###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
###   @2='alex' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
### SET
###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
###   @2='sully' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
# at 992
#211114 18:19:49 server id 1  end_log_pos 1023 CRC32 0xb0ae4a10         Xid = 3386
COMMIT/*!*/;
# at 1023
#211114 18:19:51 server id 1  end_log_pos 1102 CRC32 0x0783a607         GTID    last_committed=3        sequence_number=4       rbr_only=yes    original_committed_timestamp=1636885191538605    immediate_commit_timestamp=1636885191538605     transaction_length=287
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1636885191538605 (2021-11-14 18:19:51.538605 中国标准时间)
# immediate_commit_timestamp=1636885191538605 (2021-11-14 18:19:51.538605 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885191538605*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:7'/*!*/;
# at 1102
#211114 18:19:51 server id 1  end_log_pos 1176 CRC32 0xf88d7f2a         Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1636885191/*!*/;
BEGIN
/*!*/;
# at 1176
#211114 18:19:51 server id 1  end_log_pos 1233 CRC32 0xcecc1a15         Table_map: `nmg`.`test` mapped to number 219
# at 1233
#211114 18:19:51 server id 1  end_log_pos 1279 CRC32 0x84de7107         Delete_rows: table id 219 flags: STMT_END_F
### DELETE FROM `nmg`.`test`
### WHERE
###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
###   @2='sully' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
# at 1279
#211114 18:19:51 server id 1  end_log_pos 1310 CRC32 0xaec8af34         Xid = 3393
COMMIT/*!*/;
# at 1310
#211114 18:19:58 server id 1  end_log_pos 1367 CRC32 0x13b0ae8f         Rotate to P_YUNYUJISUANAA-bin.000014  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*/;


第一部分 mysqlbinlog 工具添加
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;    # mysql server内部使用
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;    # 设置结束符, ; 代表当前命令已经结束
# COMPLETION_TYPE=0 表示关闭链式事务,遇到commit/rollback时不会断开连接, binlog恢复时 改参数很重要


第二部分 Format_description_event 类型,第一个event 记录基本信息
# at 4
#211114 16:45:10 server id 1  end_log_pos 125 CRC32 0x7ad847e8  Start: binlog v 4, server v 8.0.26 created 211114 16:45:10

如果不加  --base64-output=decode-rows 解析效果如下

# at 4
#211114 12:18:57 server id 1  end_log_pos 125 CRC32 0xe1deddd7  Start: binlog v 4, server v 8.0.26 created 211114 12:18:57
BINLOG '
MY6QYQ8BAAAAeQAAAH0AAAAAAAQAOC4wLjI2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEwANAAgAAAAABAAEAAAAYQAEGggAAAAICAgCAAAACgoKKioAEjQA
CigB193e4Q==
'/*!*/;


# at 4 为该binlog的起始偏移量, 字节单位,表示事件从binlog的多少字节处开始(每个binlog都以4字节魔术数 0xfe 0x62 0x69 0x6e开始)
#211114 12:18:57 写入事件
# server id 1,  end_log_pos 125 该事件结束偏移量是123,也是下个事件的开始
# start 表示 Format_description_event类型事件,主从结构中,从库忽略该事件
# binlog v 4 表示日志结构版本为V4,  server v 8.0.26 表示产生binlog的MySQL版本为 8.0.26
# /*!*/ 表示结束



第三部分 Previous-GTIDS 事件类型Previous_gtid_log_event
写入Format_description_event事件后 如果开启GTID模式 会写入previous_gtid_log_event事件,记录创建该日志文件之前执行的全局事务ID集合

mysqlbinlog.exe -vv P_YUNYUJISUANAA-bin.000006
# at 125
#211114 12:18:57 server id 1  end_log_pos 156 CRC32 0x908e1985  Previous-GTIDs
# [empty]

mysqlbinlog.exe -vvv  -- skip-gtid --base64-output=decode-rows P_YUNYUJISUANAA-bin.000006
# at 125

Previous-GTIDS 表示该事件类型为Previous_gtid_log_event,记录之前全局事务ID 集合,主从复制时,从库会忽略该事件
[empty]  创建该日志之前全局事务ID集合,empty 代表空



第四部分_GTID_Gtid_log_event事件

# at 196
#211114 18:19:44 server id 1  end_log_pos 273 CRC32 0xa4f14232  GTID    last_committed=0  sequence_number=1   rbr_only=no  original_committed_timestamp=1636885184083421    immediate_commit_timestamp=1636885184083421     transaction_length=234
# original_commit_timestamp=1636885184083421 (2021-11-14 18:19:44.083421 中国标准时间)
# immediate_commit_timestamp=1636885184083421 (2021-11-14 18:19:44.083421 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885184083421*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:4'/*!*/;

#GTID 表示 GTID_log_event 类型事件,开启GTID复制后,事务的GTID 记录在 Gtid_log_event中
#last_committed = 0  表示提交的一个事务时, binlog中最大已经提交的sequence_number作为该事务的last_commited值,0前面没有事务发生
#sequence_number= 1; 单个binlog中, sequence_number是递增且顺序提交的数字,每个事务递增1,默认从1开始
#rbr_only =YES  rbr_only表示该事务中是否包含SBR(statement); =No 表示包含SBR语句或者一个空事务
				=yes不包含SBR模式的语句,mysqlbinlog 解析时 会在解析结果中增加一个 READ-COMMITED语句
SET @@SESSION.GTID_NEXT='xxx'  该事务的GTID为 'xxxx'


第五部分_Query_query_log_event事件

# at 273
#211114 18:19:44 server id 1  end_log_pos 430 CRC32 0xb327ac6b  Query   thread_id=55    exec_time=0     error_code=0    Xid = 3372
use `nmg`/*!*/;
SET TIMESTAMP=1636885184/*!*/;
SET @@session.pseudo_thread_id=55/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=255,@@session.collation_connection=255,@@session.collation_server=255/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
create table test2(id int primary key auto_increment, name varchar(20))
/*!*/;
# query 表示query_log_event类型事件,记录执行的语句 在RBR模式下 一般是DDL语句
# thread_id = 55 , 表示执行该语句的线程ID, thread_id 与 show processlist 输出的结果中的 ID字段一致, exec_time 执行时间,exec_code 返回的错误码
# use xxx 数据库,query_log_event & load_log_event 会将数据库名字保留 与之前事件比较,如果不一样会用 USE xxx 目的恢复数据的准确性
# set TIMESTAMP ,将当前时间戳修改为事件记录的时间,如果query_log_event中记录的语句执行的与时间相关,不设置时间戳会导致数据不准确
# set @@session 设置会话级别变量值,确保从库回放保证数据正确性
#SET @@session.pseudo_thread_id=55/*!*/;  mysql server 内部使用
#SET @@session.foreign_key_checks=1 @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1 
	#保证主从配置文件不一致重放失败或者数据不一致的情况
SET @@session.sql_mode=1075838976/*!*/; 保证主从在绘画级别下 sql_mode相同,避免从库在更严格模式下 回放失败
SET @@session.auto_increment_increment  保证从库重放语句时,不会因为自增配置变量配置与主库不一致而导致主从数据不一致
#SET @@session.lc_time_names=0/*!*/; 设置lc_time_names 保证从库重放语句中包括date_format(), dayname(), monthname()函数 不会因为系统变量不同导致数据不一致

以上会话变量仅在第一个 query_log_event 打印,除非后面有变化,不然不会再次打印
# create /*!*/;  执行具体SQL语句 后结束


第六部分 GTID

# at 430
#211114 18:19:46 server id 1  end_log_pos 509 CRC32 0x0e2f1dd8  GTID    last_committed=1        sequence_number=2       rbr_only=yes    original_committed_timestamp=1636885186709669    immediate_commit_timestamp=1636885186709669     transaction_length=286
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1636885186709669 (2021-11-14 18:19:46.709669 中国标准时间)
# immediate_commit_timestamp=1636885186709669 (2021-11-14 18:19:46.709669 中国标准时间)
/*!80001 SET @@session.original_commit_timestamp=1636885186709669*//*!*/;
/*!80014 SET @@session.original_server_version=80026*//*!*/;
/*!80014 SET @@session.immediate_server_version=80026*//*!*/;
SET @@SESSION.GTID_NEXT= 'e0b21402-3ae8-11ec-8592-4ce17342dadc:5'/*!*/;

# GTID Gtid_log_event 该事件记录了事务ID
# rbr_only = yes 表示事务中 不包含 SBR 模式的语句. 此状态下增加 SET TRANSACTION ISOLATION LEVEL READ COMMITTED 从库基于此回放 可避免GAP LOCK 
SET @@SESSION.GTID_NEXT ='xxxx:x'  表示该事务的GTID为 xxxx-xxx-xxx:xx 


第七部分 Query_Query_log_event 
# at 509
#211114 18:19:46 server id 1  end_log_pos 583 CRC32 0xf2d1c8cd  Query   thread_id=55    exec_time=0     error_code=0
SET TIMESTAMP=1636885186/*!*/;
BEGIN
/*!*/;


第八/九/十/十一部分——table_map_event & write_rows_event等变更操作
# at 583
#211114 18:19:46 server id 1  end_log_pos 640 CRC32 0xd29dc065  Table_map: `nmg`.`test` mapped to number 219
# at 640
#211114 18:19:46 server id 1  end_log_pos 685 CRC32 0x4043392f  Write_rows: table id 219 flags: STMT_END_F
### INSERT INTO `nmg`.`test`
### SET
###   @1=4 /* INT meta=0 nullable=0 is_null=0 */
###   @2='alex' /* VARSTRING(80) meta=80 nullable=1 is_null=0 */
# at 685
#211114 18:19:46 server id 1  end_log_pos 716 CRC32 0x7715af57  Xid = 3379
COMMIT/*!*/;

# 正常RBR模式下都是row模式记录,无法看见原始的变更语句,可以通过binlog_rows_query_log_events为1 在binlog会被记录到 rows_query_log_event类型事件中(rows_query)

# Table_map  table_map_event类型事件,在row模式独有,记录变更操作的的表的结构,方便后续write/update/delete进行应用
# mapped to number 219  对应的 table_id 是多少,翻倍后续变更语句通过 table_id 来寻找对应的操作表
	RBR模式下 一个事务在binlog 中由Table_map_event + write/update/delete_rows_log_event + Xid_event组成

# Write_rows  Write_rows_log_event 记录insert操作的实际数据
# flags: STMT_END_F 表示该事件时insert语句最后一个write_row_log_event事件,如果插入多行会分成多个write_rows_log_event事件,最后一个用STMT_END_F表示
# Xid= 3379表示 Xid_event事件类型, 表示事务提交;  3379表示事务的xid为3379; 
 mysq每个语句会被分配一个query_id(全局自增&重启清零),一个事务的第一个语句的query_id 会被作为该事务的xid,mysql异常恢复时,会解析redo日志中的prepare状态的事务,然后得到xid, 根据xid 在binlog中查找,如果找到匹配xid的xid_event,则对事务重新持久化,否则回滚事务
 
 # commit 语句表示事务提交
 
 # insert 语句插入 @1 @2 表示字段(information_schema.columns表中 ordinal_position字段对应的方式来查找字段) 
	#meta=0 表元数据为0 (int类型没有元数据) nullable =0 表示字段不允许为null, is_null=0 表示插入的值不为null
	varstring(80) 对应varchar,且长度为80 meta=80 表示字段元数据为80(最终该字段占用的字节数)
 
同理 update / delete 
# at 685
#211114 18:19:46 server id 1  end_log_pos 716 CRC32 0x7715af57  Xid = 3379

# xid 表示xid_event事件
mysq每个语句会被分配一个query_id(全局自增&重启清零),一个事务的第一个语句的query_id 会被作为该事务的xid,mysql异常恢复时,会解析redo日志中的prepare状态的事务,然后得到xid, 根据xid 在binlog中查找,如果找到匹配xid的xid_event,则对事务重新持久化,否则回滚事务


# at 1310
#211114 18:19:58 server id 1  end_log_pos 1367 CRC32 0x13b0ae8f         Rotate to P_YUNYUJISUANAA-bin.000014  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*/;
# rotate 类型为 rotate_event 表示二进制日志的切换,当前二进制文件的最后一个事件.
# to P_YUNYUJISUANAA-bin.000014  pos: 4 下个二进制文件中第一个事件的起始位置 4 
# /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;  生成 GTID 是自动动,防止用户手动更改 gtid_next 影响后面生成的GTID
DELIMITER ;  设置结束符为 ';'
# End of log file  表示已经是二进制日志文件的末尾
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; 将COMPLETION_TYPE变量修改为最初的值,与起始部分对应
# /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;  恢复pseundo_slave_mode变量的值


 


4 DDLbinlog中的体现

DDL操作在binlog中以 query_log_event事件的形式存储, 不接受事务隔离级别和binlog_format影响

如果开启GTID DDL会被分配GTID,表示一个事务,DDL自动提交,不接受Begin & Commit 限制

  •         # binlog 中会包含 Gtid_log_event (Gid) 和 Query_log_event (query)

RU & RC 隔离级别下, binlog_format 设置statement, 执行DML 操作会报错

5 DML 时间戳说明

  •         Gtid_log_event & Xid_event 类型事件是事务执行 commit语句产生的
  •         Query_log_event & Row_query_log_event & Table_map_event & Update_rows_log_event 事件时事务执行updateDML语句时产生的

 

6 statement & row 模式下 auto_increment差异

  Row 模式 query_log_event   @1=1 /* INT META = 0, nullable-0, is_null-0 /

Statement 模式: Intvar_event & query_log_event 事件, 两种情况下会出现  intvar_event(Intvar) set insert_id =1 /*!*/

  •  1 insert 语句插入数据时,表中带有auto_increment属性字段且insert 没有指定该字段 mysql会生成一个自增值以insert_id形式记录在intvar_event
  •  2 DML 操作中使用 last_insert_id()函数,mysql会把该函数值以 last_insert_id形式记录在 intvar_event

        # statement 模式中

  •  如果指定了auto_increment 字段则会在query_log_event中记录该insert语句,主从中 从库会被插入相同的值
  • 如果不指定的话,会生成intvar_event事件,生成insert_id 保证从库和主库有同样的auto_increment字段值

     系统变量配置

Auto_increment_offset  设置auto_increment 字段的起始值

 Auto_increment_increment 设置auto_increment字段的步长

#查看语句                               

Select auto_increment from information_schema.tables where table_schema=’’ and table_name=’’ 查看

TABLE_CATALOG: def
   TABLE_SCHEMA: xxx_db_0064
     TABLE_NAME: xxxx_d
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Dynamic
     TABLE_ROWS: 6471967
 AVG_ROW_LENGTH: 1131
    DATA_LENGTH: 7324254208
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 12022939648
      DATA_FREE: 5242880
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2021-11-08 01:35:53
    UPDATE_TIME: 2021-11-14 22:30:20
     CHECK_TIME: NULL
TABLE_COLLATION: utf8mb4_general_ci
       CHECKSUM: NULL
 CREATE_OPTIONS:
  TABLE_COMMENT: xxxxxx

7  CREATE_TABLE binlog中不同形态

        create table … if not exists  会记录在query_log_event中,且有幂等性,多次执行也不会报错 (无论目标表是否存在,都会记录)

        create table …. Select 语句 会被拆分成

  • statement模式下:记录在query_log_event 中,如果有auto_increment 则会通过 intvar_event事件记录,同时目标表不存在则记录,存在则不记录
  •  row 模式下: 拆分成 query_log_event(create table语句) + insert_rows_log_event (insert @1=xxx) 记录事件, 如果目标表 存在则不记录create

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。