MYSQL–架构–MGR–理论–09–小心DDL语句
1、架构图
2、DDL语句
2.1、定义
DDL(Data Definition Language)主要用于对数据库对象进行操作的过程,主要下面四个关键字完成。
1. create(添加)
2. alter(修改)
3. drop(删除)
4. truncate(删除)
2.2、举例
# 创建一个名为test的数据库
create database test;
# 创建一个表test01
create table test01 (
id bigint(20) COMMENT 'id',
name varchar(64) COMMENT '姓名'
)
# 删除表test01
drop table test01;
# 清除表test01中的数据
truncate table test01;
3、小心DDL语句
- DDL没有事务,所有的DDL语句都无法保证原子性,无法回滚。
- 但DDL语句毕竟会对表中数据产生影响,它是一个事件,必须被复制走。
4、DDL语句和DML语句在binlog中的记录格式的区别
- 命令:show binlog events in ‘BINLOG_FILE’
- 下面日志为了排版,删掉了几个字段
# 前4行是2个DDL语句代表的事件
+-----------+-------------------------------------------------------------------+
| Gtid | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2' |
| Query | create database gr_test |
| Gtid | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3' |
| Query | use `gr_test`; create table t4(id int primary key) |
# 后5行是一个DML语句代表的事件,它是一个分布式事务
| Gtid | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4' |
| Query | BEGIN |
| Table_map | table_id: 117 (gr_test.t4) |
| Write_rows| table_id: 117 flags: STMT_END_F |
| Xid | COMMIT /* xid=63 */ |
+-----------+-------------------------------------------------------------------+
4.1、说明
- 不难看出,DDL语句从头到尾就只记录了它的GTID和语句部分。
- DDL语句不会进行冲突检测。这会出现两个可怕的陷阱
4.2、陷阱
4.2.1、陷阱1
- 如果多个节点并发执行多个DDL语句,后执行的DDL如果能正确执行,其实是在对前面的DDL进行覆盖。如果不能正确执行,将报错。
- 举例:
- 第1个DDL语句的作用是删除一个A字段
- 第2个DDL语句是修改A字段的数据类型,这时第2个DDL语句将失去操作目标而报错。
4.2.2、陷阱2
- 如果多个节点并发执行DDL和DML语句,将可能出错。
- 举例:
- 第1个DDL语句是truncate语句,它将删除表中所有数据
- 第2个DML语句则是update语句,显然第2个DML语句在truncate后已经失去了更新目标。
4.3、总结
- 不要执行并发的DDL+DDL语句
- 不要执行并发的DDL+DML语句。