MySQL · 引擎特性 · DROP TABLE之binlog解析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

Drop Table的特殊之处

Drop Table乍一看,与其它DDL 也没什么区别,但当你深入去研究它的时候,发现还是有很多不同。最明显的地方就是DropTable后面可以紧跟多个表,并且可以是不同类型的表,这些表还不需要显式指明其类型,比如是普通表还是临时表,是支持事务的存储引擎的表还是不支持事务的存储引擎的表等。这些特殊之处对于代码实现有什么影响呢?对于普通表,无论是创建还是删除,数据库都会产生相应的binlog日志,而对于临时表来说,记录binlog日志就不是必须的。对于采用不同存储引擎的表来说,更是如此,有些存储引擎不支持事务如MyISAM,而有些存储引擎支持事务如Innodb,对于支持事务和不支持事务的存储引擎,处理方式也有些许差异。而Drop Table可以跟多种不同类型的表,就必须对这些情况分类处理。因此有必要对MySQL的DROP TABLE实现进行更深入的研究,以了解个中不同之处,防止被误解误用。

MySQL中Drop Table不支持事务

MySQL中对于DDL本身的实现与其它数据库也存在一些不同,比如无论存储引擎是什么,支持事务Innodb或是不支持事务MyISAM,MySQL的DDL都不支持事务,也不能被包含在一个长事务中,即使用begin/end或start transaction/commit包含多条语句的事务。如果在长事务中出现DDL,则在执行DDL之前,数据库会自动将DDL之前的事务提交。Drop Table可以同时删除多个表,这些表可能存在,也可能不存在。如果删除列表中的某个表不存在,数据库仍会继续删除其它存在的表,但最终会输出一条表不存在的错误消息。如要删除t1,t2,t3,t4,t5,则t1,t2,t5表存在,t3,t4表不存在,则语句Drop Table t1,t2,t3,t4,t5;会删除t1,t2,t5,然后返回错误:ERROR 1051 (42S02): Unknown table ‘test.t3,test.t4’而在其它数据库中,比如PostgreSQL,就会将事务回滚,不会删除任何一张表。

Drop Table如何记录binlog?

在MySQL中,通过binlog进行主备之间的复制,保证主备节点间的数据一致,对于Drop table又有什么不同吗?仔细研究一下,还真的有很大的不同。MySQL支持两种binlog格式,statement和row,实践中还有一种是两者混合格式mixed。不同的binlog格式对SQL语句的binlog产生也会有不同的影响,尤其对Drop table来说,因为Drop table有很多之前提到的特殊之处,如可能同时删除多个不同类型的表,甚至删除不存在的表,因此在产生binlog时必须对这些不同类型的表或者不存在的表进行特殊的处理。

不存在表的处理

对于不存在表,实际上也没有表的定义, MySQL将其统一认作普通表,并按普通表来记录binlog。如Drop table if exists t1, t2,t3; 其中t1,t3存在,t2不存在;则会产生binlog如下所示:DROP TABLE IF EXISTS t1,t2,t3;

临时表的处理

此外影响最大的就是对临时表的处理,在statement格式下,所有对临时表的操作都要记录binlog,包括创建、删除及DML语句;但在row格式下,只有Drop table才会记录binlog,而对临时表的创建及DML语句是不记录binlog的。为什么会这样?通常情况下,主机的临时表在备机上是没有用的,临时表只在当前session中有效,即使将临时表同步到备机,当用户从主机切换到备机时,原来session已经中断,与session关联的临时表也会被清除,用户会重建session到新的主机。但在一些特殊情况下,还是需要将主机的临时表同步到备机的,比如主机上执行insert into t1 select * from temp1,其中t1是普通表,而temp1是临时表。当binlog格式为statement时,这条语句会被记录到binlog,然后同步到备机,在备机上replay,若备机之前没有将主机上的临时表同步过来,那这条语句的replay就会出现问题。因此在statement格式下,对临时表的操作如创建、删除及其它DML语句都必须记录binlog,然后同步到备机执行replay。但在row格式下,因为binlog中已经记录了实际的row,那么对临时表的创建、DML语句是不是记录binlog就不是那么重要了。这里有一点比较特殊,对临时表的删除还是要记录binlog。因为用户可以随时修改binlog的格式,若之前创建临时表时是statement格式,而创建成功后,又修改为row格式,若row格式下删除表不记录binlog,那么在备机上就会产生问题,创建了临时表,但却没有删除它。因此对drop table语句,无论binlog格式采用statement或是row格式,都会记录binlog。而对于创建临时表语句,只有statement格式会记录binlog,而在row格式下,不记录binlog。为防止row格式下在备机上replay时drop不存在的临时表,会将drop临时表的binlog中添加IF EXISTS,防止删除不存在的表replay失败。

不同类型表的处理

另外,drop table在产生binlog还有一个诡异的地方,通常一条SQL语句只会产生一个binlog event,占用一个gitd_executed,但drop table有可能会产生多个binlog event,并占用多个gtid_executed。如下示例:DROP TABLE t1, tmp1, i1, no1;其中t1为普通表,tmp1为innodb引擎的临时表,i1为MyISAM引擎的临时表,no1为不存在的表。则会产生3条binlog events,并且每个binlog events都有自己的gtid_executed。如下所示:

binlog.png

总结

由于历史原因,MySQL支持多种存储引擎,也支持多种复制模式,binlog的格式也从statement一种发展到现在的statement、row和mixed三种,为了兼容不同的存储引擎和不同的复制模式,在代码实现上做了很多折衷,这也要求我们要了解历史、了解未来,只有这样才能更好的使用、改进MySQL,为用户提供更好的云服务体验。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19小时前
|
SQL 自然语言处理 JavaScript
【JavaScript】ECMAS6(ES6)新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
ES6,作为ECMAScript 2015的简称,标志着JavaScript编程语言的一个重要进化节点。它不是渐进的变化,而是一次飞跃式的更新,为开发者带来了一系列强大的新特性与语法糖,极大提升了代码的简洁性、可读性和运行效率。从新的变量声明方式let与const,到优雅的箭头函数、模板字符串,再到让对象操作更为灵活的解构赋值与增强的对象字面量,ES6的每项改进都旨在让JavaScript适应日益复杂的应用场景,同时保持其作为脚本语言的活力与魅力。本文是深入探索这些核心特性的起点,为你铺开一条通向高效、现代JavaScript编程实践
15 0
|
1天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版产品使用问题之假如mysql的binlog有很多个文件,按什么顺序扫描
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2天前
|
安全 Java API
深入解析 Java 8 新特性:LocalDate 的强大功能与实用技巧
深入解析 Java 8 新特性:LocalDate 的强大功能与实用技巧
8 1
|
3天前
|
SQL JSON 关系型数据库
MySQL 8.0新特性?
【6月更文挑战第14天】MySQL 8.0新特性?
13 1
|
3天前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】2.6-InnoDB关键特性
【MySQL技术内幕】2.6-InnoDB关键特性
12 0
|
5天前
|
编译器 PHP 开发者
PHP 8.0 新特性解析与实践
PHP 8.0的发布带来了许多令人激动的新特性和改进,本文将深入解析PHP 8.0的一些重要特性,包括JIT编译器、命名参数、属性声明的初始化等,并结合实际案例进行详细讨论,帮助开发者更好地理解和应用这些新特性。
17 5
|
6天前
|
传感器 存储 SQL
ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析
GraphiteMergeTree是ClickHouse用于优化Graphite数据存储和汇总的表引擎,适合需要瘦身和高效查询Graphite数据的开发者。它基于MergeTree,减少存储空间并提升查询效率。创建表时需包括Path、Time、Value和Version列。配置涉及pattern、regexp、function和retention,用于指定聚合函数和数据保留规则。文章还提供了建表语句示例和相关资源链接。
11 1
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
智能时代的引擎:深度学习技术解析
【6月更文挑战第8天】本文深入探讨了深度学习技术,一种基于人工神经网络的机器学习方法。我们将从其基本原理出发,分析其在数据处理、特征提取和模式识别方面的强大能力。文章将通过具体案例,展示深度学习在图像识别、自然语言处理等领域的应用,并讨论其面临的挑战与未来发展方向。
|
8天前
|
关系型数据库 MySQL 数据库
MySQL 8.0 新特性之不可见主键
【6月更文挑战第9天】MySQL 8.0 引入了不可见主键特性,提供更灵活的数据库管理方式。不可见主键能减少业务逻辑干扰,提高数据安全性和隐私,同时在某些场景下更适用。示例展示了如何创建和使用不可见主键,但需要注意它可能带来的理解和调试难题。此特性增加了设计和管理数据库的选项,适用于对数据隐私有高要求的场景。随着技术发展,不断学习和探索新特性将提升数据库性能和功能。
32 9
|
9天前
|
编译器 PHP 开发者
PHP 8 新特性解析:迈向更高效的编程时代
PHP 8 是一次里程碑式的更新,通过引入许多令人振奋的新特性,使得PHP语言在性能、安全性和开发体验方面都有了巨大的进步。本文将深入解析PHP 8 中的关键特性,探讨它们对于开发者和企业的意义,以及如何充分利用这些新特性来提升自己的技术水平和项目的质量。
11 0

热门文章

最新文章

推荐镜像

更多