MYSQL大表DDL处理知识点

本文详细探讨了在大型数据库上执行DDL操作时可能遇到的问题,包括锁表风险、执行时间预估以及如何在不阻塞读写操作的情况下进行。介绍了MySQL 5.6的Online DDL特性,以及第三方工具pt-online-schema-change的使用,提供了大表DDL操作的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

IT人员经常需要线上mysql执行一些增加字段,加入索引的DDL的操作。但是有些表数据量比较大,超过几百万或者字段特别多,需要考虑这些DDL的操作是否会造成锁表进而造成生产环境出现问题。因此在执行某些觉得有风险的操作的DDL时,查看不要锁表,以及知悉其内部操作流程非常重要。

知识点

可以查看SQL执行过程中是否存在阻塞锁

在执行SQL时查看是否会出现锁,如果要看目前是否有所锁,查看一下三张表

select * from information_schema.innodb_locks;
select * from information_schema.innodb_trx;
select * from information_schema.innodb_lock_waits;
可以使用show profiles查看某个SQL的具体执行过程

show profiles是5.0.37之后添加的,某个会话打开该功能后,该会话的SQL都可以得到trace并分析该SQL具体的执行步骤,如下。

可以在测试环境建立测试表,并查看其执行过程,进而估算SQL的执行时间。

Mysql 5.6 Online ddl

从mysql5.6开始,Online DDL特性被引进(存储引擎要求是innodb)。增强了很多种类的Alter Table操作避免拷贝表和锁表,在运行Alter操作的同时允许运行select,insert,update,delete语句。因此在最新版本,我们可以通过使用ALGORITHM和LOCK选项抑制文件拷贝和加锁。
但是即使在mysql5.6,仍然有一些alter操作(增加/删除列,增加/删除主键,改变数据类型等)需要重建。

非常实用,参考下表

额外的工具pt-online-schema-change

在mysql 没有加入online ddl特性之前,大表上的ddl语句对mysql dba造成很大的困扰。于是就有一些额外的三方工具帮助我们解决这些问题pt-online-schema-change就是其中一款,它可以在线执行DDL操作,不会阻塞读写操作从而影响业务程序。

具体的使用,因为笔者没有深入使用过,在此只做推荐,参考一下博文:

https://blog.youkuaiyun.com/mchdba/article/details/76253016

https://blog.youkuaiyun.com/lijingkuan/article/details/68951089

https://www.aliyun.com/jiaocheng/1120002.html

最后,大表DDL的最佳实践

1、一定要选业务少的时候执行DDL,一定,不要蜜汁自信。

2、执行DDL前,先看一下库中是否有未提交的事务,注意查看事务information_schema.innodb_trx表

3、随时关注服务器日志状况,已有问题要先行解决。show processlist也可以发现一些问题

4、特别危险的操作一定先在预生产环境或测试环境先行模拟,评估风险。

5、尽量避免 kill 会话进程,可能会在某些情况造成数据问题。

6、研发时,预计表就会比较大的时候,要多评审几次,多留一些预置字段,避免DDL操作。

参考资料及博文:

https://www.cnblogs.com/mysql-dba/p/6192897.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值