以下我们都会在不同的事务隔离级别和不同的二进制日志格式下验证
注意:
当事务隔离级别为REA-UNCOMMITED和READ-COMMITED时如果binlog_format设置为statement,执行DML操作会报错
1.复制AUTO_INCREMENT字段
基于row格式复制带AUTO_INCREMENT字段,mysql产生的自增值会被明确记录到二进制日志中,因此AUTO_INCREMENT字段会被正确的复制到二进制日志中
基于statement格式复制带AUTO_INCREMENT字段(只能在REPETATABLE-READ的隔离级别下设置binlog_format为statement)通过解析二进制日志如果插入中未指定AUTO_INCREMENT字段的值,在主库上mysql将生成Intvar_event事件记录下一个生成的auto_increment字段的值,这样在备库执行时先set insert_id,因此保证了基于语句的复制auto_increment字段也能被正确的复制
总结:AUTO_INCREMENT字段在不同事务隔离级别和不同的复制格式下都能正确的复制到从库
2.复制create ... if not exists语句
此语句无论在什么隔离级别和复制格式下,都以Query_log_event事件记录到二进制日志中,无论是否触发建表操作都会记录日志中
3.create table ... select 语句复制
GTID格式下在mysql8.0.21版本之前执行create table ... select会报错(语句是2个事务)之后的版本在支持原子性的存储引擎上是一个事务
在statement格式下二进制日志以Query_log_event事件记录
在row格式下二进制日志以完整的日志记录记录create table 和插入记录
4.主从复制使用不同的表定义
支持不同表定义复制的前提条件:
在源表和目标表中都存在的字段,其定义顺序必须相同
源表和目标表有差异的字段,差异字段必须在相同字段的后面
源表和目标有差异的字段需要设置默认值
在row格式下,能够保证数据正常复制
在statement格式下,如果语句能在备库执行,数据也能正常复制到备库
5.复制limit 子句
在statement格式带有limit操作的语句,二进制日志会记录原始的语句,因为无法保证主从库上limit语句查询的数据顺序一致,所以无法保存复制一致性
在row或者mixed格式下带有limit子句的dml语句会记录每一行的变更,所以数据能够准确的复制从库上
6.复制load data语句
在statement格式下,从库在解析二进制日志文件begin_load_query_log_event事件,然后再tmpdir参数指定的目录下生成临时文件把提取的文件数据放到临时文件中,在从库执行load语句,就可以保证数据一致
在row,mixed的格式下,load在二进制日志记录为具体的jnsert语句
7.复制临时表