231_mysql_binlog解析&说明
【摘要】 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 DDL在binlog中的体现
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)