MYSQL--架构--MGR--理论--09--小心DDL语句

本文探讨了MySQL架构中的DDL语句,特别是其原子性缺失和可能导致的并发问题,包括数据覆盖陷阱和DDL/DML并发错误。作者强调了避免并发DDL+DDL和DDL+DML操作的重要性,并给出了实例和总结。
摘要由CSDN通过智能技术生成

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语句

  1. DDL没有事务,所有的DDL语句都无法保证原子性,无法回滚。
  2. 但DDL语句毕竟会对表中数据产生影响,它是一个事件,必须被复制走。

4、DDL语句和DML语句在binlog中的记录格式的区别

  1. 命令:show binlog events in ‘BINLOG_FILE’
  2. 下面日志为了排版,删掉了几个字段
# 前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、说明

  1. 不难看出,DDL语句从头到尾就只记录了它的GTID和语句部分。
  2. DDL语句不会进行冲突检测。这会出现两个可怕的陷阱

4.2、陷阱

4.2.1、陷阱1

  1. 如果多个节点并发执行多个DDL语句,后执行的DDL如果能正确执行,其实是在对前面的DDL进行覆盖。如果不能正确执行,将报错。
  2. 举例:
    1. 第1个DDL语句的作用是删除一个A字段
    2. 第2个DDL语句是修改A字段的数据类型,这时第2个DDL语句将失去操作目标而报错。

4.2.2、陷阱2

  1. 如果多个节点并发执行DDL和DML语句,将可能出错。
  2. 举例:
    1. 第1个DDL语句是truncate语句,它将删除表中所有数据
    2. 第2个DML语句则是update语句,显然第2个DML语句在truncate后已经失去了更新目标。

4.3、总结

  1. 不要执行并发的DDL+DDL语句
  2. 不要执行并发的DDL+DML语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值