MySQL DDL Online ddl是什么意思
什么是DDLOnline为什么要OnlineDDLOnline的办法官方自带DDLOnlinept-online-schema-change工具gh-ost工具总结什么是DDLOnlineDDLOnline:在线履行DDL语句 , 也就是在线修正表构造 。所谓在线的意思就是保证在履行DDL语句的进程中 , 表
- 什么是DDL Online
- 为什么要Online
- DDL Online的办法
- 官方自带DDL
- Onlinept-online-schema-change工具
- gh-ost工具
- 总结
这就像飞机在不下降的情形下 , 在空中给飞机加油的操作 。
文章插图
你可能会想我履行一个DDL语句很快的呀 , 不会导致表不能正常读写吧?那是因为你操作的表是一个数据量比拟小的表 , 或者不是一个被频繁拜访的业务表 , 对于这些表 , 履行DDL语句确切很快 , 不会对业务造成很大的影响 。但是 , 你如果对一个几百万、甚至上千万的大表进行DDL语句的修正 , 这个DDL语句履行的进程 , 可能会连续几十秒、甚至几分钟 , 此时的这个进程不会像操作小表那么快 。
【MySQL DDL Online ddl是什么意思】
为什么要Online我们在生产环境中 , 难免要遇到对表构造的修正 。而此时线上的表正在为后端供给各种要求拜访的服务 , 如果此时我们直接进行对表构造的更改 , 可能导致后端的SQL要求被阻塞 , 不能正常拜访 , 进而导致服务异常或不可用 。所以 , 在我们对在线的表进行DDL操作的时候 , 要格外的注意 。要选择适合的方法、适合的时光进行 , 尽量避免这些问题的产生 。
那么为什么增长给表增长一个字段会导致锁表呢?
当我们对表增长字段的时候 , 我们就要获取这个表的MDL元数据锁(meta data lock)写锁(写锁又称为X锁 , 读锁资源网又称为S锁) , 只有获取的这个MDL的X锁之后 , 我们才可以对这个表的构造进行修正 , 否则不能修正会被阻塞 。
DDL Online的办法目前为止 , MySQL的DDL Online的方法重要有以下几种 。
- MySQL官方自带的DDL Online功效
- percona供给的Percona Toolkit
- Github开源的gh-ost工具
- 主从切换的方法
- Facebook的OSC
- LHM
官方自带DDL OnlineMySQL从5.6之后的版本已经支撑了DDL的Online操作 。在应用的时候 , 就是在我们的DDL语句中 , 显示去指定症结字ALGORITHM和LOCK的参数值 。示例如下:
/*推举该参数组合*/alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=NONE;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=SHARED;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=DEFAULT;alter table t add column col varchar(32), ALGORITHM=INPLACE, LOCK=EXCLUSIVE;其中的ALGORITHM=INPLACE, LOCK=NONE是症结的处所 , 这里须要分离为ALGORITHM和LOCK这两个参数指定值 。
- ALGORITHM该参数的值可认为INPLACE、COPY、DEFAULT 。INPLACE:它的原理是基于本来的表直接进行DDL的操作 , 此时原表可以支撑DML操作 。COPY:它的原理是复制出一张和原表的构造一样的表 , 然后基于这个新复制出来的表进行DDL操作 。然后再用这个复制出来的新表调换掉原表 。在履行DDL期间 , 原表不支撑DML的操作 , 因为数据已经复制了一个新表中 , 在原表中如果仍然履行DML操作 , 将不能把这些操作同步到复制的新表中 。DEFAULT:默认值 , 依据DDL语句的类型 , 主动的选择应用INPLACE或者COPY选项 , 能应用INPLACE的不应用COPY 。注意:这个COPY的操作 , 请求磁盘的空间要充分 , 因为它会复制出一张和原表一样的表 , 会再次占用和原表一样的磁盘空间 , 同时会增长IO的负载 。所以 , 一般情形下我们都是应用I资源网NPLACE作为ALGORITHM参数的值 , 只有当某些DDL语句 , 不支撑ALGORITHM=INPLACE参数的时候 , 才选择ALGORITHM=COPY的选项 。
推荐阅读
- MySQL中MyISAM为什么比InnoDB查询快
- mysql数据库出现c乱码问题怎么解决?
- centos 7.9 安装配置mysql5.7
- mysqldump全库备份脚本
- mysql数据库怎么查询数据库是否存在?
- mysql数据库的最大连接数怎么查询?
- mysql数据库中的my.ini路径在哪里?
- 浅析MySQL恶意服务器读取文件原理
- 新一代HTAP数据库崛起,MySQL生态的最佳归宿?
- mysql中all用法和any的用法和内外连接,全外连接,联合查询,自连接