MySQL8.0学习记录14 - 原子DDL

MySQL8.0开始支持DDL原子语句,它指的是将数据字典更新、存储引擎操作和与DDL操作相关的二进制日志写入合并为一个单一的原子操作。即使在这些过程中,服务器停止,DDL原子操作包含的几个过程要么一起提交,要么一起回滚。

DDL隐含其他事务结束

原子DDL并不是事务性的DDL,跟一般的DDL一样,它会结束当前回话的其他事务。这点以前没有注意过,看个例子:

start transaction;
insert into t_person values(2,'Hello','上海');
create table t (id int);
rollback;

create table 正常执行隐含了commit,所以后面的rollback没有成功。再看个DDL失败的例子:

start transaction;
insert into t_person values(3,'Hi','上海');
drop table t_not_exists;
rollback;

虽然t_not_exists不存在,drop 语句会报错,但是DDL隐含了对其他事务的提交,所以insert 语句成功提交了。

支持的原子DDL语句

MySQL8.0支持的原子DDL语句,主要包含两类:

  • Table DLL:数据库、表空间、表和索引的CREATE、ALTER和DROP语句,以及TRUNCATE TABLE语句
  • Non-Table DLL:存储程序、触发器、视图以及函数的CREATE、DROP 、ALTER语句;以及用户和角色相关的 CREATE、ALTER、 DROP、 GRANT和REVOKE。

几个需要注意的事项:

  • 目前支持原子DDL的只有InnoDB引擎
  • DROP TABLE, 可以同时DROP多个表,如果这些表都是InnoDB引擎的话,那么要不一起删除或者一起回滚。如何含有不支持原子DDL存储引擎的表,那么这些不支持的表,会先一步单独处理;
  • 原子DDL支持 CREATE TABLE … SELECT,前提是BINLOG的格式是ROW。当作为原子操作执行的时候,插入数据会在表上加上元数据锁,这会阻止对表的并发访问。
  • 帐户管理语句要么对所有指定的用户成功,要么在发生错误时回滚并没有影响。不允许部分执行

InnoDB引擎如何支持原子DDL

为了支持DDL操作的重做和回滚,InnoDB将DDL日志写入mysql.innodb_ddl_log表,这是一个隐藏的数据字典表,位于mysql.ibd数据字典表空间中。InnoDB将DDL的执行分为几个阶段:

  • Prepare:创建所需的对象,并将DDL日志写到mysql.innodb_ddl_log表中。DDL日志定义了如何向前滚动和向后滚动DDL操作。
  • Perform:执行DDL操作
  • Commit:更新数据字典并提交数据字典事务。
  • Post-DDL:重放并从mysql.innodb_ddl_log表中删除DDL日志。为了确保可以安全地进行回滚而不引入不一致,在这个最后阶段进行文件操作, 比如重命名或删除文件;这个阶段也从mysql.innodb_dynamic_metadata数据字典表中删除动态元数据(对于DROP TABLE或重建表等操作)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL是一种开源的关系型数据库管理系统,它支持多种操作系统,并且广泛应用于Web应用程序的后端数据存储。MySQLDDL(Data Definition Language)是用于定义和管理数据库结构的基础操作。 以下是MySQLDDL的基础操作: 1. 创建数据库:使用CREATE DATABASE语句可以创建一个新的数据库。例如,CREATE DATABASE mydatabase; 2. 删除数据库:使用DROP DATABASE语句可以删除一个已存在的数据库。例如,DROP DATABASE mydatabase; 3. 创建表:使用CREATE TABLE语句可以创建一个新的数据表。在CREATE TABLE语句中,需要指定表名和表的列及其属性。例如,CREATE TABLE mytable (id INT, name VARCHAR(50)); 4. 删除表:使用DROP TABLE语句可以删除一个已存在的数据表。例如,DROP TABLE mytable; 5. 修改表结构:使用ALTER TABLE语句可以修改已存在的数据表的结构,包括添加、修改和删除列等操作。例如,ALTER TABLE mytable ADD COLUMN age INT; 6. 添加主键:使用ALTER TABLE语句可以为数据表添加主键约束,以确保每行数据的唯一性。例如,ALTER TABLE mytable ADD PRIMARY KEY (id); 7. 添加外键:使用ALTER TABLE语句可以为数据表添加外键约束,以确保与其他表的关联完整性。例如,ALTER TABLE mytable ADD FOREIGN KEY (customer_id) REFERENCES customers(id); 8. 创建索引:使用CREATE INDEX语句可以为数据表创建索引,以提高查询性能。例如,CREATE INDEX idx_name ON mytable (name); 这些是MySQLDDL的基础操作,通过这些操作可以定义和管理数据库的结构。如果你有更具体的问题或者需要了解更多高级的DDL操作,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值