首页 > 数据库 >MySQL InnoDB Instant schema 变更注意点

MySQL InnoDB Instant schema 变更注意点

时间:2024-03-21 10:01:57浏览次数:32  
标签:Instant INSTANT VERSIONS 算法 InnoDB MySQL instant TOTAL ROW

在 MySQL 8.0.12 中为 DDL 引入了新的算法,在修改表的定义的时候不会阻塞。第一个 instant 操作是在表的最后增加一个列,这是腾讯游戏团队贡献的。在 8.0.29 中,官方增加在任意位置增加或删除列的 instant 操作。

本文要讲的是盲目使用该特性会带来的危害。

 

默认算法

从 MySQL 8.0.12 开始,对于任意的 DDL 操作,默认的算法就是 instant。这意味着 alter 语句只会修改表在数据字典中的元数据。在操作的准备和执行阶段,不会对表进行排他的元数据锁定,表数据也不会受到影响,从而使操作瞬时完成。

除了instant 算法之外,还有另外两种算法:copy、inplace。

然而,即使是在支持 instant ddl 的场景下,也会有一些限制:表最多支持64个 instant 变更。达到这个限制后,就需要重构表了。

如果在 alter 语句中没有指定 instant 算法,后台会自动选择合适的算法,当然,如果没有按照预期的方式,对于生产环境可能就是一场噩梦。

 

总是显式指定算法

给出的第一个建议就是,总是显式的指定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.

 

监控 instant 变更次数

第二个建议就是监控在表上执行 instant 便跟的次数。

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 操作,之后就不可以了。

 

对于 dba,最好监控所有表的 instant ddl 的次数,从而知晓是否要对表做重构操作、或者重置该计数器。可以使用以下的脚本做监控检测:

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 |
+--------------------------+--------------------+------------------------+--------+

如果想重置计算器,可以使用 optimze table、或 alter table <tablename> engine=innodb。

 

总之,MySQL 8.0 为 DDL 操作引入的 INSTANT 算法避免了阻塞性变更,从而彻底改变了schema变更方式。不过,由于有 64 次 INSTANT 变更的限制,在需要重建表之前,必须在 ALTER 语句中明确指定算法,以避免出现意想不到的行为。此外,还建议通过 Information_Schema 监控 INSTANT 变更的数量,以避免在不知情的情况下达到 INSTANT 变更限制而出现意外,并谨慎计划表的重建。

 

标签:Instant,INSTANT,VERSIONS,算法,InnoDB,MySQL,instant,TOTAL,ROW
From: https://www.cnblogs.com/abclife/p/18084949

相关文章

  • 通过Docker安装MySQL数据库
    1.安装Docker首先,确保你的系统上已经安装了Docker。如果还没有安装,可以访问Docker官网查看安装指南。对于大多数Linux发行版,可以使用以下命令安装Docker:sudoapt-getupdatesudoapt-getinstalldocker.io安装完成后,启动Docker服务并设置开机自启:sudosystemctlstart......
  • mysql-存储引擎
    1.mysql的体系结构下面这张图值得注意的是不同的存储引擎的Index不一样,从5.5版本以后存储引擎默认的就是InnoDB了。2.存储引擎 --查询建表语句---默认存储引擎:InnoDBshowcreatetablecourse;--查询当前数据库支持的存储引擎showengines;--创建表my_myisam,......
  • MYSQL事务面试题记录
    1.什么是数据库事务数据库事务是数据库管理系统执行过程种的一个逻辑单位,由一个有限的数据库操作序列构成,这些操作要嘛全部执行,要嘛都不执行,是一个不可分割的工作单位。2.Mysql事务的四大特性是什么?原子性事务作为一个整体被执行,对数据库的操作要吗全部被执行,要吗都不执行,......
  • MySQL学习八:窗口函数(一)
    目录一、窗口函数1.窗口函数定义2.窗口函数语法3.演示表格一4.窗口的确定4.1例1:查询各班级总分4.2例2:查询各班级累计总分4.3分区子句(partitionby)4.4排序子句(orderby)4.5窗口子句(rows)4.6总体执行流程5.函数分类5.1排序类函数5.2聚合类函数5.3跨行类函数......
  • 了解和编译安装mysql数据库
    一.数据库的基本概念1.1数据①描述事物的符号记录称为数据(Data)。包括数字、文字、图形、图像、声音、档案记录等②数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的。相同格式和类型的数据统一存放在一起,而不会把“人”和“书”混在一起存储。这样,数......
  • MySQL | CRUD
    目录1.Create2.Retrieve2.1.SELECT列2.1.1.全列查询2.1.2.指定列查询2.1.3.查询字段为表达式2.1.4.为查询结果指定别名2.1.5.结果去重2.2.WHERE条件2.2.1.年龄小于19的同学2.2.2.id在2~3的同学2.2.3.id为1和4的同学2.2.4.姓张的同学及张某的同学2.3......
  • 记一下mysql隔离级别问题
      MSQL默认隔离级别是  可重复读; 可重复读即 同一次查询,再次查询结果一致;不会查询到别的事务提交的内容;原理:开始事务后,做一次select产生一个readview,这个readview已经确定了能读取的undolog链;简单理解就是只能读取到当前事务版本之前的数据;当另一个事务插入数据......
  • MySQL中如何快速定位占用CPU过高的SQL
    作为DBA工作中都会遇到过数据库服务器CPU飙升的场景,我们该如何快速定位问题?又该如何快速找到具体是哪个SQL引发的CPU异常呢?下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。 以一......
  • 【数据库】MySQL表的增删改查(二)
    文章目录一、数据库约束一、数据库约束1.1约束类型NOTNULL-指示某列不能存储NULL值。UNIQUE-保证某列的每行必须有唯一的值。DEFAULT-规定没有给列赋值时的默认值。PRIMARYKEY-NOTNULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识......
  • mysql 1248错误 多级查询之别名
    【mysql解决方案】ERROR1248(42000):Everyderivedtablemusthaveitsownalias-CSDN博客 多级查询的过程中,会需要给表一个别名。代码错误的查询方式:select*from(selects.snofromstudentswheres.ssex='女');正确的查询方式:select*from(selects.sno......