mysql一条语句 原子_mysql8 参考手册--原子DDL定义语句支持

MySQL 8.0引入了原子DDL,将数据定义语言操作变为原子操作,确保在操作过程中即使服务器暂停也能保持数据一致性。此功能不适用于所有存储引擎,目前仅InnoDB支持。原子DDL包括表DDL和非表DDL,如CREATE、ALTER、DROP等,但不包括特定的非原子语句。在DDL操作期间,元数据更新、二进制日志写入和存储引擎操作同步进行,提供了一种更安全的数据库修改方式。
摘要由CSDN通过智能技术生成

MySQL 8.0支持原子数据定义语言(DDL)语句。此功能称为原子DDL。原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子操作中。即使服务器在操作过程中暂停,该操作也可以提交,并在数据字典,存储引擎和二进制日志中保留适用的更改,或者回滚。

注意

原子DDL不是事务性DDL。DDL语句(原子的或其他方式)隐式结束当前会话中处于活动状态的任何事务,就好像您COMMIT在执行该语句之前已执行了。这意味着DDL语句不能在另一个事务内,在诸如的事务控制语句内执行,也不能 START TRANSACTION ... COMMIT与同一事务内的其他语句组合。

通过在MySQL 8.0中引入MySQL数据字典,可以实现原子DDL。在早期的MySQL版本中,元数据存储在元数据文件,非事务表和特定于存储引擎的词典中,这需要中间提交。MySQL数据字典提供的集中式事务性元数据存储消除了这一障碍,从而可以将DDL语句操作重组为原子性的。

支持的DDL语句

原子DDL功能支持表DDL语句和非表DDL语句。与表相关的DDL操作需要存储引擎支持,而非表DDL操作则不需要。当前,仅InnoDB存储引擎支持原子DDL。

支持的表DDL语句包括 CREATE,ALTER和 DROP数据库,表空间,表和索引的TRUNCATE TABLE语句以及该 语句。

受支持的非表DDL语句包括:

CREATE和DROP 语句,以及(如果适用)ALTER 存储程序,触发器,视图和用户定义函数(UDF)的语句。

账户管理语句: CREATE,ALTER, DROP,,如果适用, RENAME报表用户和角色,以及GRANT 和REVOKE报表。

原子DDL功能不支持以下语句:

与表相关的DDL语句,其中包含以外的存储引擎InnoDB。

INSTALL PLUGIN和 UNINSTALL PLUGIN 声明。

INSTALL COMPONENT和 UNINSTALL COMPONENT 声明。

CREATE SERVER, ALTER SERVER和 DROP SERVER语句。

原子DDL特性

原子DDL语句的特征包括以下内容:

元数据更新,二进制日志写入和存储引擎操作(如果适用)组合为一个原子操作。

在DDL操作期间,SQL层没有中间提交。

适用时:

数据字典,例程,事件和UDF缓存的状态与DDL操作的状态一致,这意味着更新缓存以反映DDL操作是成功完成还是回滚。

DDL操作中涉及的存储引擎方法不执行中间提交,并且存储引擎将自身注册为DDL操作的一部分。

存储引擎支持DDL操作的重做和回滚,该操作在DDL操作的 后DDL阶段执行。

DDL操作的可见行为是原子的,这会更改某些DDL语句的行为

存储引擎支持

当前,仅InnoDB存储引擎支持原子DDL。不支持原子DDL的存储引擎免于DDL原子性。涉及豁免的存储引擎的DDL操作仍然能够引入不一致,这种不一致可能在操作中断或仅部分完成时发生。

为了支持DDL操作的重做和回滚, InnoDB请将DDL日志写入 mysql.innodb_ddl_log表,该表是驻留在mysql.ibd数据字典表空间中的隐藏数据字典表 。

要查看mysql.innodb_ddl_log在DDL操作期间写入表的DDL日志 ,请启用 innodb_print_ddl_logs 配置选项。

**InnoDB存储引擎分阶段执行DDL操作。DDL操作(例如) ALTER TABLE可能 在提交 阶段之前多次执行“ 准备”和“ 执行”阶段。

准备:创建所需的对象并将DDL日志写入 mysql.innodb_ddl_log表中。DDL日志定义了如何前滚和后滚DDL操作。

执行:执行DDL操作。例如,执行操作的创建例程CREATE TABLE。

提交:更新数据字典并提交数据字典事务。

DDL后:重播并从mysql.innodb_ddl_log表中删除DDL日志。为了确保可以安全地执行回滚而不会引起不一致,在此最后阶段执行文件操作,例如重命名或删除数据文件。这一阶段还从删除的动态元数据 mysql.innodb_dynamic_metadata的数据字典表DROP TABLE,TRUNCATE TABLE和该重建表其他DDL操作。

mysql.innodb_ddl_log在DDL后阶段, 将重播DDL日志并将其从表中 删除 ,而不管DDL操作是提交还是回滚。仅mysql.innodb_ddl_log当在DDL操作期间停止服务器时,DDL日志才应保留在表中。在这种情况下,将恢复DDL日志并在恢复后将其删除。

在恢复情况下,重新启动服务器时,可能会落实或回退DDL操作。如果在重做日志和二进制日志中存在在DDL操作的Commit阶段执行的数据字典事务,则 该操作被认为是成功的并且被前滚。否则,在InnoDB重播数据字典重做日志时将回滚不完整的数据字典事务 ,并回滚DDL操作。

查看DDL日志

要查看mysql.innodb_ddl_log在涉及InnoDB存储引擎的原子DDL操作过程中写入 数据字典表 innodb_print_ddl_logs的DDL日志,请启用 MySQL将DDL日志写入stderr。根据主机操作系统和MySQL配置, stderr可能是错误日志,终端或控制台窗口。请参见 第5.4.2.2节“默认错误日志目标配置”。

InnoDB将DDL日志写入 mysql.innodb_ddl_log表以支持DDL操作的重做和回滚。该 mysql.innodb_ddl_log表是一个隐藏的数据字典表,位于 mysql.ibd数据字典表空间中。与其他隐藏数据字典表一样,该 mysql.innodb_ddl_log表不能在MySQL的非调试版本中直接访问。(请参见 第14.1节“数据字典架构”。)mysql.innodb_ddl_log表的结构 与此定义相对应:

CREATE TABLE mysql.innodb_ddl_log (

id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

thread_id BIGINT UNSIGNED NOT NULL,

type INT UNSIGNED NOT NULL,

space_id INT UNSIGNED,

page_no INT UNSIGNED,

index_id BIGINT UNSIGNED,

table_id BIGINT UNSIGNED,

old_file_path VARCHAR(512) COLLATE UTF8_BIN,

new_file_path VARCHAR(512) COLLATE UTF8_BIN,

KEY(thread_id)

);

id:DDL日志记录的唯一标识符。

thread_id:每个DDL日志记录都分配了一个thread_id,用于重播和删除属于特定DDL操作的DDL日志。涉及多个数据文件操作的DDL操作会生成多个DDL日志记录。

type:DDL操作类型。类型包括FREE(删除索引树), DELETE(删除文件), RENAME(重命名文件)或 DROP(删除mysql.innodb_dynamic_metadata数据字典表中的元 数据)。

space_id:表空间ID。

page_no:包含分配信息的页面;例如,索引树的根页面。

index_id:索引ID。

table_id:表格ID。

old_file_path:旧表空间文件路径。由创建或删除表空间文件的DDL操作使用;也用于重命名表空间的DDL操作。

new_file_path:新表空间文件路径。由重命名表空间文件的DDL操作使用。

实施例表明能够 innodb_print_ddl_logs以查看写入到DDL日志strderr用于 CREATE TABLE操作。

mysql> SET GLOBAL innodb_print_ddl_logs=1;

mysql> CREATE TABLE t1 (c1 INT) ENGINE= InnoDB;

[Note] [000000] InnoDB: DDL log insert : [DDL record: DELETE SPACE, id=18, thread_id=7,

space_id=5, old_file_path=./test/t1.ibd]

[Note] [000000] InnoDB: DDL log delete : by id 18

[Note] [000000] InnoDB: DDL log insert : [DDL record: REMOVE CACHE, id=19, thread_id=7,

table_id=1058, new_file_path=test/t1]

[Note] [000000] InnoDB: DDL log delete : by id 19

[Note] [000000] InnoDB: DDL log insert : [DDL record: FREE, id=20, thread_id=7,

space_id=5, index_id=132, page_no=4]

[Note] [000000] InnoDB: DDL log delete : by id 20

[Note] [000000] InnoDB: DDL log post ddl : begin for thread id : 7

[Note] [000000] InnoDB: DDL log post ddl : end for thread id : 7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值