InnoDB Online DDL
1.Online DDL的优势
在繁忙的生产环境中提高响应速度和可用性,在这种环境中,使一个表在几分钟或几小时内不可用是不现实的。
对于就地操作,在DDL操作期间使用LOCK子句调整性能和并发性之间的平衡的能力。
比表复制方法占用更少的磁盘空间和I/O开销
2.Online DDL的使用
通常,您不需要做任何特别的事情来启用在线DDL。默认情况下,MySQL会立即执行该操作,或者在允许的情况下就地执行,并且锁的数量尽可能少。
可以使用ALTER TABLE语句的ALGORITHM和LOCK子句控制DDL操作的各个方面。这些子句放在语句的末尾,用逗号与表和列规范分隔。
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
LOCK子句可用于原地执行的操作,用于微调操作期间对表的并发访问程度。对于立即执行的操作,只支持LOCK=DEFAULT。算法子句主要用于性能比较,并在遇到问题时作为旧的表复制行为的备用方案。
LOCK=EXCLUSIVE:阻塞读和写
LOCK=DEFAULT :尽可能的不阻塞读和写
LOCK=NONE :允许读和写
LOCK=SHARED:允许写
ALGORITHM=INSTANT
ALGORITHM=COPY
ALGORITHM=INPLACE.
ONLINE DDL的三个阶段
1.初始化
2.执行
3.提交表定义
3.Online DDL的成本评估
DDL操作的性能在很大程度上取决于该操作是否立即就地执行,以及是否重新构建表。
在对一个大表进行DDL操作之前,需要检查DDL操作的快慢
克隆表结构。
用少量数据填充克隆表
在克隆表上运行DDL操作。
检查“行影响”值是否为零。非零值表示操作复制表数据,这可能需要特殊的规划。例如,您可以在计划的停机期间执行DDL操作,或者在每个复制从服务器上一次执行一个DDL操作。
Query OK, 0 rows affected (21.42 sec) --没有复制数据
Query OK, 1671168 rows affected (1 min 35.54 sec) --复制数据
4.Online DDL的空间要求
(1)临时日志文件
innodb_online_alter_log_max_size参数,默认128M,如果临时日志文件超过此参数值,会抛出DB_ONLINE_LOG_TOO_BIG错误。大的innodb_online_alter_log_max_size参数值允许更多的Online DDL操作,但这也意味着DDL结束时更长的锁表时间。
(2)临时排序文件
重建表的在线DDL操作在创建索引时将临时排序文件写入MySQL临时目录(Unix上为$TMPDIR, Windows上为%TEMP%,或由——TMPDIR指定的目录)。在包含原始表的目录中不会创建临时排序文件。每个临时排序文件都足够容纳一列数据,当数据合并到最终的表或索引时,每个排序文件都会被删除。涉及临时排序文件的操作可能需要相当于表中数据量加上索引的临时空间。如果在线DDL操作使用了数据目录所在文件系统的所有可用磁盘空间,则上报错误。
如果MySQL临时目录不够大,不能容纳排序文件,则将tmpdir设置为其他目录。另外,为在线DDL操作定义一个单独的临时目录 innodb_tmpdir。引入这个选项是为了帮助避免由于大型临时排序文件而可能发生的临时目录溢出。
(3)中间表文件
一些重建表的在线DDL操作在与原始表相同的目录中创建临时中间表文件。中间表文件可能需要与原始表大小相等的空间。中间表文件名以#sql-ib前缀开始,只在在线DDL操作期间短暂出现。
5.Online DDL的限制
在线DDL无法暂停,无法限制IO和CPU的使用
回滚和失败的DDL的代价可能会更高
长时间运行在线DDL操作可能导致复制滞后。在线DDL操作必须在主节点上运行完之后才能在从节点上运行。此外,在主服务器上并发处理的DML,只有在从服务器上的DDL操作完成后,才在从服务器上处理
标签:文件,临时,LOCK,DDL,InnoDB,Online,操作 From: https://blog.csdn.net/qq_29431123/article/details/141105878