MySQL DBA 需要了解一下 InnoDB Online DDL 算法更新

admin1个月前笔记38

image.png

在 MySQL 8.0.12 中,我们引入了一种新的 DDL 算法,该算法在更改表的定义时不会阻塞表。第一个即时操作是在表格末尾添加一列,这是来自腾讯游戏的贡献。

然后在 MySQL 8.0.29 中,我们添加了在表中任意位置添加(或删除)列的可能性。

在这篇文章中,我想重点讨论盲目使用此功能时可能发生的一些危险。

默认算法

从 MySQL 8.0.12 开始,对于任何支持的 DDL,默认算法是 INSTANT。这意味着 ALTER 语句只会修改数据字典中表的元数据。在操作的准备和执行阶段,不会对表进行独占元数据锁,表数据不受影响,使得操作是即时的。

另外两种算法是 COPY 和 INPLACEOnline DDL 操作参见手册。

然而,即使支持操作,Online DDL 也存在限制:一个表支持 64 次即时更改。到限制后,需要“重建”该表。

如果在 ALTER 语句(DDL 操作)期间未指定算法,则会默默地选择适当的算法。当然,如果没有预料到,这可能会导致生产中出现噩梦般的情况。

始终指定算法

因此,第一个建议始终是指定算法,即使它是执行 DDL 时的默认算法。当指定算法时,如果 MySQL 无法使用它,它将抛出错误,而不是使用其他算法执行操作:

SQL > ALTER TABLE t1 DROP col1, ALGORITHM=INSTANT;
ERROR: 4092 (HY000): Maximum row versions reached for table test/t1.No more columns can be added or dropped instantly. Please use COPY/INPLACE.

监控即时变化

第二个建议也是监视对表执行的即时更改的数量。

MySQL 在 information_schema 表中保留行版本:

SQL > SELECT NAME, TOTAL_ROW_VERSIONS
      FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME LIKE 'test/t1';+---------+--------------------+| NAME    | TOTAL_ROW_VERSIONS |+---------+--------------------+| test/t1 |                 63 |+---------+--------------------+

在上面的示例中,DBA 将能够执行一项额外的 INSTANT DDL 操作,但在此之后,MySQL 将无法执行另一项操作。

作为 DBA,监视所有表并决定何时需要重建表(以重置该计数器)是一个很好的做法。

这是添加到监控工具的建议查询的示例:

SQL > SELECT NAME, TOTAL_ROW_VERSIONS, 64-TOTAL_ROW_VERSIONS AS             "REMAINING_INSTANT_DDLs",
             ROUND(TOTAL_ROW_VERSIONS/64 * 100,2) AS "DDLs %"
      FROM INFORMATION_SCHEMA.INNODB_TABLES
      WHERE TOTAL_ROW_VERSIONS > 0 ORDER BY 2 DESC;+--------------------------+--------------------+------------------------+--------+| NAME                     | TOTAL_ROW_VERSIONS | REMAINING_INSTANT_DDLs | DDLs % |+--------------------------+--------------------+------------------------+--------+| test/t1                  |                 63 |                      1 |  98.44 || test/t                   |                  4 |                     60 |   6.25 || test2/t1                 |                  3 |                     61 |   4.69 || sbtest/sbtest1           |                  2 |                     62 |   3.13 || test/deprecation_warning |                  1 |                     63 |   1.56 |+--------------------------+--------------------+------------------------+--------+

要重置计数器并重建表,可以使用 OPTIMIZE TABLE <table> 或 ALTER TABLE <table> ENGINE=InnoDB

结论

总之,MySQL 8.0 引入的 DDL 操作 INSTANT 算法通过避免阻塞更改彻底改变了模式更改。然而,由于 64 次即时更改的限制,在需要重建表之前,在 ALTER 语句期间显式指定算法以避免意外行为至关重要。还建议通过 information_schema 监视即时更改的数量,以避免在不知不觉中达到即时更改限制而出现意外情况,并仔细计划将表重建

相关文章

Ubuntu 20.04安装Docker

Ubuntu 20.04安装Docker

Ubuntu 20.04安装Docker思维导航Docker学习系列文章Docker是什么?Docker的优势有哪些?Docker的作用?Ubuntu安装Docker Engine先决条件服务器操作系...

最常见的 Git 问题和操作清单汇总

最常见的 Git 问题和操作清单汇总

引言本文整理自工作多年以来遇到的所有 Git 问题汇总,之前都是遗忘的时候去看一遍操作,这次重新整理了一下,发出来方便大家收藏以及需要的时候查找答案。一、必备知识点仓库Remote: 远程主仓库;Re...

Linux下路由及网关的配置

1. Linux路由表设置1.1 route命令的基本用法Linux系统的route命令用于显示和操作IP路由表(show/manipulate the IP routing table)。要实现两个...

CentOS7怎样在VMware下配置桥接网络

CentOS7怎样在VMware下配置桥接网络

首先,在以下的配置都操作好之后,要确认宿主机的网络连接方式,若为需要认证的网络,则可能会出现宿主机与虚拟机能互相ping,但虚拟机不能ping外网的情况一、虚拟机配置确保虚拟机为关机的状态,在VMwa...

正则表达式中 “$” 并不是表示 “字符串结束

这篇文章写一写我最近在用 Python 的正则表达式模块(re)开发 CPython 的 SBOM 工具时发现的一个令人惊讶的行为。如果用过正则表达式,你可能知道 ^ 表示 “字符...

国内如何使用TikTok(抖音国际版)的方法,中国大陆使用tiktok海外版

国内如何使用TikTok(抖音国际版)的方法,中国大陆使用tiktok海外版

国内无法使用TikTok的原因TikTok虽然是国内公司开发的,但是本身服务于国外,除了出品方是国人,其他和facebook,instagram没啥两样,都是国外社交平台,所以这个并不会因为国内制作而...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。