当前位置: 首页 > 后端技术 > Java

MySQL修改表结构会锁表吗?

时间:2023-04-02 01:23:33 Java

〇、关于DDL、DML和DCLDDL(DataDefinitionLanguages)语句:数据定义语言,这些语句定义了不同数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要有create、drop、alter等。DML(DataManipulationLanguage)语句:数据操作语句,用于增删改查数据库记录,检查数据完整性。常用的语句关键字主要有insert、delete、udpate、select。(增删改查)DCL(DataControlLanguage)语句:数据控制语句,用于控制不同数据段的直接权限和访问级别。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。1.DDL的实现方式在MySQL5.6之前,DDL的执行方式主要有两种:Copy方式和In-place方式。Copy方法执行DDL操作并创建一个与原始表具有相同结构定义的临时表。数据锁(metadatalock)锁,禁止对表中的数据进行增删改查,允许查询按照主键ID递增的顺序在临时表上执行DDL语句,从原表逐行读取数据,然后插入临时表升级原表锁,禁止对原表数据进行读写操作,删除原表,将临时表重命名为原表名,完成DDL操作.就地模式执行DDL操作。就地模式也称为快速索引创建。与Copy方法相比,In-place方法不复制数据,因此执行速度大大加快。但是这种方法只支持二级索引的增删改查,和Copy方法一样需要全表锁。下面以添加索引为例简单介绍in-place方法的实现过程:创建新索引的数据字典在原表上加一个MDL(metadatalock,元数据锁)锁,禁止添加,表中数据的删除、修改,并允许查询根据聚簇索引的顺序,查询数据,找到需要的索引列数据,排序插入到新的索引页,等待所有只读打开当前表提交和创建索引的事务。2、OnlineDDLMySQL在5.6版本后加入了OnlineDDL的新特性,用于支持DDL执行过程中DML语句的并行操作,提高数据库的吞吐量。与Copy方法和In-place方法相比,Online方法在执行DDL时可以读写表中的数据。OnlineDDL可以有效改善DDL期间对数据库的影响:OnlineDDL期间,大部分情况下查询和DML操作可以正常执行,表的锁时间会大大减少,保证数据库的可扩展性不亚于可能的;允许In-place操作的DDL避免了重建表时过多的磁盘IO和CPU资源,降低了数据库的整体负载,从而在DDL期间可以保持数据库的高性能和高吞吐量;允许In-placeoperation的DDL比需要COPY到临时文件的Operations占用更少的bufferpool,避免之前DDL过程中临时性能下降,因为以前需要copy数据到临时表,这个过程会占用缓冲池,导致内存中一些经常访问的数据会被清理掉。OnlineDDL的实现本质上可以分为两种方式:Copy方式和In-place方式:对于不支持OnlineDDL的SQL,采用Copy方式,比如删除主键,修改列数据类型,改变表字符集,等这些操作会导致记录格式发生变化,不可能通过简单的全量+增量的方式实现OnlineDDL。对于支持OnlineDDL的SQL,采用In-place方式。MySQL内部以“是否修改行记录格式”为标准,将In-place方法分为两类:如果修改了行记录格式,则需要重建表,例如添加primary等操作键、增删字段、培养格式ROW_FORMAT、用OPTIMIZE优化表,这些都称为rebuild方法。如果不修改行记录格式,只修改表的元数据,则不需要重建表,如增删改名二级索引,设置删除字段默认值,重命名字段,重命名表等。这种方法称为不重建方法。更多细节请参考官方文档:https://dev.mysql.com/doc/ref...3.OnlineDDL实现流程OnlineDDL主要包括3个阶段,Preparestage,Executestage,Commitstage。下面将主要介绍OnlineDDL执行过程中三个阶段的过程。Prepare阶段持有EXCLUSIVE-MDL锁,禁止DML语句读写根据DDL类型,确定执行方式(Copy、Online-rebuild、Online-no-rebuild)新建frm和ibd临时文件(ibd临时文件只有rebuild类型需要)分配row_log空间记录DDLExecute阶段产生的DML操作(只有rebuild类型需要)。Execute阶段降级EXCLUSIVE-MDL锁,允许DML语句读写扫描原表主键和二级索引所有数据页生成B+树,存储在临时文件中,记录DML操作DDLExecute阶段产生的row_log(只有rebuild类型需要)在Commit阶段升级到EXCLUSIVE-MDL锁,禁止读写DML语句将row_log中记录的DML操作应用到临时文件,并得到一个与原表逻辑数据相同的数据文件(仅rebuild类型需要)重命名frm和idb临时文件,替换原表,删除原表文件并提交事务(刷redolog的)transaction),通过以上流程完成变更可以看出Prepare阶段和Commit阶段都禁止读写,只有Execute允许读写。那为什么说OnlineDDL方法在执行过程中可以读写表中的数据呢?实际上,由于Prepare和Commit阶段相对于Execute阶段来说特别短,所以基本上可以认为整个过程都是允许读写的。Prepare阶段和Commit阶段都禁止读写,主要是为了保证数据的一致性。4.OnlineDDLALTERTABLE…的语法和可选参数。,ALGORITHM[=]{DEFAULT|INPLACE|COPY},LOCK[=]{DEFAULT|NONE|SHARED|EXCLUSIVE}例句:ALTERTABLEtablenameDROPCOLUMNage,ALGORITHM=INPLACE,LOCK=DEFAULT;ALGORITHMoptionCOPY:使用Copy方法执行DDL操作,DDL执行过程中不允许DML操作。INPLACE:使用In-place方式进行DDL操作。在DDL执行期间允许进行DML操作。默认:默认选项。根据DDL操作类型,自动选择DDL执行方式。首选In-place方式,不满足条件时选择Copy方式。LOCK选项EXCLUSIVE:对整个表加排他锁(X锁),不允许DML操作SHARED:对整个表加共享锁(S锁),允许查询操作,但不允许数据更改操作NONE:不允许notlockthetable允许查询操作,也支持数据更改操作,即允许所有的DML操作,这种模式下并发度最好DEFAULT:默认选项,根据DDL操作的类型,最小程度的锁定,尽可能支持DML操作