数据库主从DDL是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库主从DDL是啥相关的知识,希望对你有一定的参考价值。

谈到mysql数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlog,binlog是顺序写,所以效率很高,slave的Slave_IO_Running线程到主库取日志,效率很比较高,下一步,问题来了,slave的Slave_SQL_Running线程将主库的DDL和DML操作在slave实施。DML和DDL的IO操作是随即的,不是顺序的,成本高很多,还可能可slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延时。有朋友会问:“主库上那个相同的DDL也需要执行10分,为什么slave会延时?”,答案是master可以并发,Slave_SQL_Running线程却不可以。 参考技术A

MySQL8.0 开始支持原⼦ DDL(atomic DDL),数据字典的更新,存储引擎操作,写⼆进制日志结合成了一个事务。在没有原⼦DDL之前,DROP TABLE test1,test2;如遇到server crash,可能会有test1被drop了,test2没有被drop掉。下面来看下在MySQL8.0之前和MySQL8.0 数据字典的区别

在MySQL8.0 之前,Data Dictionary除了存在与.FRM, .TRG, .OPT ⽂件外,还存在于系统表中(MyISAM ⾮事务引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),这使crash recovery 维持原⼦性成为了可能


存储引擎⽀持

目前,只有InnoDB存储引擎⽀持原子DDL,为了实现原子DDL,Innodb要写DDL logs 到 mysql.innodb_ddl_log 表,这是⼀个隐藏在mysql.ibd 数据字典表空间⾥的数据字典表。要看mysql.innodb_ddl_log 中的内容,需要

SET GLOBAL LOG_ERROR_VERBOSITY=3;(MySQL 8.0 默认为2,error log 记录Errors and

warnings,不不记录notes)

SET GLOBAL innodb_print_ddl_logs=1;

CREATE TABLE t1 (c1 INT) ENGINE = InnoDB;

查看error log

[Note] [MY-011066] InnoDB: DDL log insert : [DDL record: DELETE SPACE, id=30,

thread_id=25, space_id=9, old_file_path=./test/t1.ibd]

[Note] [MY-011066] InnoDB: DDL log delete : by id 30

[Note] [MY-011066] InnoDB: DDL log insert : [DDL record: REMOVE CACHE, id=31,

thread_id=25, table_id=1066, new_file_path=test/t1]

[Note] [MY-011066] InnoDB: DDL log delete : by id 31

[Note] [MY-011066] InnoDB: DDL log insert : [DDL record: FREE, id=32, thread_

id=25, space_id=9, index_id=143, page_no=4]

[Note] [MY-011066] InnoDB: DDL log delete : by id 32

[Note] [MY-011066] InnoDB: DDL log post ddl : begin for thread id : 25

[Note] [MY-011066] InnoDB: DDL log post ddl : end for thread id : 25


原子DDL 操作步骤


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

    执行:执⾏DDL操作。例如,为CREATE TABLE操作执⾏创建。

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

    Post-DDL:重播并从mysql.innodb_ddl_log表格中删除DDL⽇志。为确保回滚可以安全执⾏⽽不引⼊不⼀致性,在此最后阶段执⾏⽂件操作(如重命名或删除数据文件)。这一阶段还从 mysql.innodb_dynamic_metadata的数据字典表删除的动态元数据为了DROP TABLE,TRUNCATE和其它重建表的DDL操作。

    ⽆论事务是提交还是回滚,DDL日志都会mysql.innodb_ddl_log在Post-DDL阶段重播并从表中删除 。mysql.innodb_ddl_log如果服务器在DDL操作期间暂停,DDL⽇志应该只保留在表中。在这种情况下,DDL⽇志会在恢复后重播并删除。

    在恢复情况下,当服务器重新启动时,可能会提交或回退DDL事务。如果在重做⽇志和⼆进制日志中存在DDL操作的提交阶段期间执⾏的数据字典事务,则该操作被认为是成功的并且被前滚。否则,在InnoDB重放数据字典重做日志时回滚不完整的数据字典事务 ,并且回滚DDL事务。

    原⼦DDL ⽀持类型

    • DROP TABLES , all tables dropped or none

    • DROP SCHEMA, all entities in the schema are dropped, or none

    • Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES

    • CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)

    • TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back

    • RENAME TABLES, all or none

    • ALTER TABLE successful or not done

    示例

    请点击输入图片描述

    请点击输入图片描述

    结论

    在MySQL8.0之前,alter table 操作在server crash的情况下,会遗留.frm,.ibd文件。MySQL8.0 能实现原⼦DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情况下,不会遗留.frm,.ibd临时文件。让我们⼀起期待MySQL8.0 GA的到来吧!

术语 DDL、DML 和 DCL 的起源是啥?

【中文标题】术语 DDL、DML 和 DCL 的起源是啥?【英文标题】:What are the origins of terms DDL, DML and DCL?术语 DDL、DML 和 DCL 的起源是什么? 【发布时间】:2018-06-18 17:51:30 【问题描述】:

我熟悉应用于 SQL 的 DDL、DML 和 DCL 的定义。有很多网站和书籍对它们进行了定义和解释。但似乎没有人给出权威的参考。

我对这些术语的来源很感兴趣。 SQL 发明了它们吗?它们在历史上是否已经用于其他数据库?是否有其他标准创建了它们,并且它们被 SQL 使用?还是 SQL 甚至在 ISO 规范中都使用了它们?

一本书表明 SQL92 包含这些术语,但我无法在在线提供的草稿中找到它们。 (也许我必须购买最终的 SQL92 ISO 规范才能确定。)SQL:1999 切换到不同的分类系统。

(我很好奇的一个原因是,如果这些是不是 SQL 发明的通用行业术语,那么继续使用它们不一定是不正确的,作为新 SQL 分类的补充。)

谁能提供有关这些术语起源的更多见解,以及对可能最初定义它们的任何标准或规范的权威参考?

【问题讨论】:

我投票结束这个问题,因为它不是关于编程的问题。 这可能很有用 - foldoc.org/Data+Definition+Language,其中提到了“DDL 参考手册”,ECE Dept U Colorado,1991。不是 DDL 的 original source,但也许这本书可能会让你更近一步. 嗯,@ZoharPeled,你意识到“DDL”、“DML”、“DCL”中的“语言”是指“编程语言”吗?例如,我想知道调用处理数据操作的 SQL 子集的适当方法,但不清楚术语“DML”是否已过时,或者只是通过一组互补的类别来增加。 好吧,那是错误的。 DDL 与 XML 或 HTML 一样,不再是一种编程语言。 DML 可能被认为是一种编程语言,而 DCL 是一种用于授予和撤销对数据的访问权限的语言,我认为这不能被视为一种编程语言。无论如何,您问的是语言问题,而不是编程问题。这并不是一个坏问题,我也想阅读它的答案,它只是不适合 ***。我确信 StackExchange 网络中的其他网站会更好地解决这个问题。 linguistics.stackexchange.com 或许? 我阅读了规则,没有看到任何禁止此类问题的内容。无论如何,在您等待同意您的人进行第三次投票以结束此问题时,请随时提供问题的答案并赢得赏金。 ;) 干杯! 【参考方案1】:

根据Wikipedia's "Data definition language" entry:

数据定义语言的概念和它的名字是第一位的 介绍了与 Codasyl 数据库模型相关的,其中架构 数据库是用一种语言语法编写的,描述了 用户数据模型的记录、字段和集合。 [1]后来用了 引用结构化查询语言 (SQL) 的子集来声明 表、列、数据类型和约束。 SQL-92 引入了一个 要查询的模式操作语言和模式信息表 模式。这些信息表在中指定为 SQL/Schemata SQL:2003。术语 DDL 也用于一般意义上的任何 用于描述数据或信息结构的正式语言。

Wikipedia's "Codasyl" entry 中提供了更多详细信息:

1969 年 10 月DBTG 发布了它的第一个语言规范 对于网络数据库模型,它通常被称为 CODASYL 数据模型。这个规范实际上定义了几个 单独的语言:一种数据定义语言 (DDL),用于定义 数据库的模式,另一个用于创建一个或多个子模式的 DDL 定义数据库的应用程序视图;和数据操作 语言 (DML) 定义用于嵌入 COBOL 编程的动词 语言来请求和更新数据库中的数据。虽然工作 专注于 COBOL,即独立于宿主语言的数据库的想法 在 IBM 提倡将 PL/I 作为 COBOL 的推动下开始出现 替换。

"Data Base Task Group" Wikipedia entry 说它在 2 年后发布了最终报告:

1971 年 4 月,DBTG 发布了一份包含规范的报告 数据操作语言 (DML) 和数据定义语言 (DDL) 用于网络数据库模型的标准化。第一个 DBTG 提案已于 1969 年发布。规范是 随后在各个委员会修改和开发 由其他报告于 1973 年和 1978 年出版。规范是 通常称为 DBTG 数据库模型或 CODASYL 数据库 模型。以及数据模型,数据库的许多基本概念 该小组介绍了术语,特别是 架构和子架构。

以上内容涵盖了 DDL 和 DML。不幸的是,Wikipedia's "Data control language" entry 在撰写本文时没有太多细节,我无法在其他地方找到这个术语的起源。但考虑到上述情况和下面显示的Google Ngram graph,我会怀疑它来得较晚——可能是在 1970 年代中期的某个时间。

而here is another graph 显示了似乎支持这一点的所有三个术语:

【讨论】:

是的,有趣的东西 --- 我已经阅读了大部分内容。我希望获得一些权威参考(直接来自一些规范),或者从“过去”实际使用过这些东西的人那里听到。 DCL 的第一个参考文献是在 vi-lib.com/CheatSheets/… 上找到的 DCL (Data Control Language) Component of SQL that protect databases from harm such as lock,日期为 1971 年 9 月 27 日 @GarretWilson 我简要了解了如何获取原始规范文档 - 似乎它们可以从 here 获得)但显然这个资源只是一个查找指南 ("要访问在明尼苏达大学寻找援助数据库中找到的馆藏,请联系各个馆藏单位或存储库。"). @GarretWilson 另外值得一提的是,在 20 岁时参与过 Codasyl 原始报告的人现在大约 70 岁。根据the 2016 survey,60 岁以上的用户占 *** 用户的 0.8%。因此,也许可以找到从事相关工作的人,但您似乎不太可能听到原作者的消息。 这是一个很好的观点,@SteveChambers。有时我会忘记时间过得有多快。您当然为此付出了很多努力,毫无疑问,您应该得到赏金。谢谢你的努力。我仍然希望有一些更明确的东西。我可能会购买 SQL92 规范(如果它仍然可用)以及一些 CODASYL 文档,看看它们是否能带来更多见解。

以上是关于数据库主从DDL是啥的主要内容,如果未能解决你的问题,请参考以下文章

ddl是啥意思

数据库DML DDL的中文含义分别是啥 谢谢

术语 DDL、DML 和 DCL 的起源是啥?

mysql主从同步延迟原因及解决方法

MySQL主从同步延迟原因及解决办法

MySQL主从同步延迟原因及解决办法