今天一位同学问到线上曾经碰到过连续建表,导致阻塞普通的insert、update等。不过也没有保留现场。因此有疑问为什么建表会影响DML?
分析
首先这个现象不是在所有场景都会碰到(否则MySQL的用户们早就跳起来了)。
一来建表这个操作本身很快,只涉及到写表定义文件和初始化表空间。中间涉及到redo和undo的操作也很少(这里只讨论InnoDB表)。因此除非碰到磁盘IO响应不了,否则多数情况下建表操作很快结束,不会“稳定复现”
二来即使由于io原因,建表过程执行时间较长,建表操作也不会阻塞一些DML操作。
因此只能从代码出发看冲突的case。
假设session 1正在执行一个create table操作,且由于io原因阻塞在写表空间文件这个步骤上。讨论session2作如下操作的场景。
无主键表insert
此时insert操作由于需要申请系统自增主键,需要对dict_sys->mutex加锁。而这个锁需要等session1建表操作完成后才释放,因此出现等待。
有外键表的操作
此时session2需要判断外键一致性,需要对dict_sys->mutex加锁。
这里包含几个方面:外键约束的child表插入数据时和parent表删除数据时,已经这两个表的关联外键字段被修改时,均会触发等待。
有同学会说我们线上这两种情况都禁止了,是不是就不会因为这个锁的原因导致阻塞dml?
新打开表时
若这个insert操作需要新打开一个表时,需要根据表名从字典中取出信息,也会触发等待。
即使原来已经打开过的表,也会因为执行了flush table或者表空间淘汰而要求下次访问需要重新打开。
影响的其他操作
顺着dict_sys->mutex我们还可以发现有以下几个操作,若发生在session2,都会被阻塞
1) 1) Flush tables
2) select * from information_schema.tables;
2) 以上两个因为都要访问到表对象列表,还比较好理解
3) select * from information_schema.innodb_sys_tables;
3)实际上可以用另外一个锁来单独处理sys_tables
4) show create table another_table
这个是因为必须判断是否有外键关联
简单留个问题:为什么show tables并不会被阻塞?
相关推荐
教程名称:疯狂Java肖文吉老师MYSQL数据库视频教程课程目录:【】1_MYSQL数据库_数据库概念【】2_MYSQL数据库_MYSQL的安装【】3_MYSQL数据库_MYSQL基础入门【】4_MYSQL数据库_DDL_建表【】5_MYSQL数据库_DDL_约束...
每个模块的SQL文件不仅包含建表语句,还可能包含其他DDL语句,如ALTER TABLE(修改表结构)、DROP TABLE(删除表)等,以及DML语句(数据操作语言),如INSERT INTO(插入数据)、UPDATE(更新数据)、DELETE(删除...
mysql2h2-转换器用 Java 编写的 MySQL 到 H2 SQL 转换库。...使用 datasource-proxy 转换示例其他想法: 查看 jOOQ 看看它是否可以用于对 DML 语句和 Liquibase 建模 DDL 部分执照此代码是在 MIT 许可下提供的。
14-MySQL建表语句及表的知识.avi 15-查看表结构以及建表语句.avi 16-索引的知识及索引创建多种方法实战.avi 17-索引生效的基本条件说明.avi 18-主键-唯一-普通索引创建及删除小结.avi 19-DML语句之insert知识讲解....
### DB2基本命令详解 #### 一、启动与停止数据库 - **启动数据库**: `db2start` ...以上就是DB2中关于实例管理和常用DML操作的相关命令总结,这些命令可以帮助您更好地管理数据库环境,提高工作效率。
万年历数据库的设计目的是为了提供对历史和未来日期的全面查询支持,这对于日历应用、时间计算、节假日管理、历史事件检索等场景尤其有用。在给定的资源中,`lunar.sql`文件很可能包含了创建这样一个数据库所需的SQL...
5. **DML(Data Manipulation Language):数据操作** - **添加数据**:`insert into 表名 [(字段名,...)] values (值,...)`,可以指定插入字段,也可以全部插入。 - **修改数据**:`update 表名 set 字段名=新值 ...
本资源"SQL建库建表.rar"显然是关于如何使用SQL进行数据库建设和表结构设计的教程或源码示例。 1. **SQL基础知识**:SQL分为DDL(Data Definition Language)和DML(Data Manipulation Language)两大部分。DDL用于...
例如,如果有一个`Student`类,包含`id`、`name`、`sex`、`age`、`zy`、`className`和`studyDate`等属性,对应的MySQL建表语句可能是: ```sql CREATE TABLE t_student ( id VARCHAR(20), name VARCHAR(20), sex...
- **多节点DDL vs DDL/DML**: 在多主模式下,如果多个节点同时对同一个表进行DDL操作或DDL与DML混合操作,可能会导致数据不一致或集群故障。 - **SERIALIZABLE隔离级别**: SERIALIZABLE是最严格的隔离级别,在多主...
MySQL数据管理是数据库管理系统中的一种重要的数据操作语言,它允许用户对数据库中的数据进行添加、修改、删除等操作。 MySQL数据管理ppt课件(完整版)提供了MySQL语句的基本使用方法和示例演示,让用户能够快速...
MySQL是一种广泛使用的开源关系数据库管理系统,由瑞典MySQL AB公司开发,后被Sun Microsystems公司收购,最终由Oracle公司收购。MySQL主要以其性能卓越、体积小、速度快、拥有成本低以及开放源码的特点著称,尤其是...
7. **011-动力节点-MySQL视频教程-查看建表语句** 这部分内容将教授如何查看已创建的表的创建语句(SHOW CREATE TABLE),这对于理解表结构和复制表设计非常有帮助。同时,可能会讲解如何解析和理解这些SQL语句。 ...
##### DML(Data Manipulation Language,数据操作语言) - **添加记录** - 插入全部字段:`INSERT INTO 表名 VALUES (值1, 值2, ...);` - 指定字段插入:`INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值...
MySQL 5.1中文手册是针对这一特定版本的MySQL数据库管理系统的重要参考资料,它包含了全面的文档和指南,帮助用户理解并有效地使用MySQL。MySQL是一种广泛使用的开源关系型数据库,其5.1版本在功能和性能上都有显著...
MySQL随手笔记涵盖了一系列关于MySQL数据库的基础知识,适合初级学者学习。笔记主要分为四个章节,分别介绍了数据库基础概念、MySQL数据库管理系统、SQL语句以及表的操作和约束。 首先,笔记介绍了数据库的基本概念...
- **2.0.5 关于MySQL回收某个用户权限** - 使用`REVOKE privileges ON db_name.* FROM 'username'@'host';`命令回收权限。 - **2.0.6 企业生产环境如何授权用户权限(MySQL主库)** - 根据用户的角色和职责授予...
2. DML(数据操纵语言):涉及`insert`、`delete`、`update`,分别用于数据插入、删除和修改。 3. DDL(数据定义语言):包括`create`、`drop`、`alter`,用于定义和修改表结构。 三、DDL操作详解 1. `CREATE`:...
本压缩包中的资源旨在帮助用户从基础到进阶全面掌握MySQL的相关知识,包括但不限于建表、触发器、存储过程和视图的创建与应用。 首先,让我们从基础开始。在MySQL中,建表是构建数据模型的第一步。`CREATE TABLE`...