首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个ALTER使用什么替换算法?

问这个ALTER使用什么替换算法?
EN

Database Administration用户
提问于 2021-11-08 10:31:42
回答 1查看 266关注 0票数 0

问题

我试图弄清楚像下面这样的命令会使用什么样的替换算法

代码语言:javascript
复制
ALTER TABLE `catalog_category_product_index_store1` COMMENT='Catalog Category Product Index Store1'

我认为这将是INPLACE,正如https://dev.mysql.com/doc/refman/8.0/en/alter-table.html#alter-table-performance的文档所述

支持内部算法的ALTER操作包括:.这种更改的一个例子是对列注释的更改。

但是,这是针对列注释而不是表注释的,我想知道这可能有所不同吗?有人能帮我弄清楚这条语句使用的是什么算法吗?或者是否有一种方法来记录它或者什么的?

谢谢

附加上下文

表定义

代码语言:javascript
复制
mysql> show create table catalog_category_product_index_store1\G
*************************** 1. row ***************************
       Table: catalog_category_product_index_store1
Create Table: CREATE TABLE `catalog_category_product_index_store1` (
  `category_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Category Id',
  `product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Product Id',
  `position` int(11) DEFAULT NULL COMMENT 'Position',
  `is_parent` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Is Parent',
  `store_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Store Id',
  `visibility` smallint(5) unsigned NOT NULL COMMENT 'Visibility',
  PRIMARY KEY (`category_id`,`product_id`,`store_id`),
  KEY `CAT_CTGR_PRD_IDX_STORE1_PRD_ID_STORE_ID_CTGR_ID_VISIBILITY` (`product_id`,`store_id`,`category_id`,`visibility`),
  KEY `IDX_216E521C8AD125E066D2B0BAB4A08412` (`store_id`,`category_id`,`visibility`,`is_parent`,`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Catalog Category Product Index Store1 Replica'
1 row in set (0.00 sec)

我相信这个查询会导致某种锁定,这会导致我们网站的停机,但我不能百分之百肯定。我正在尝试更多地了解这个alter语句实际上在做什么,以及它是如何实现的。

EN

回答 1

Database Administration用户

发布于 2021-11-08 14:00:36

MySQL支持表、列、索引和分区上的元数据注释。在任何情况下,修改注释都是元数据操作,它可以在不做表副本的情况下完成。

但是,任何alter,即使是内部ALTER,都需要一个元数据锁。元数据锁的获取将被阻止,而任何已触及该表的事务都会被阻止。

我可以使用两个窗口进行演示:

窗口1:

代码语言:javascript
复制
mysql> create table mytable (id int primary key);
Query OK, 0 rows affected (0.05 sec)

窗口2:

代码语言:javascript
复制
mysql> start transaction;

mysql> select * from mytable;
Empty set (0.00 sec)

到目前为止还不错,这就是我们所期望的。但是请注意,即使完成了该查询,事务仍然未提交。因此,窗口2中的会话持有该表上的元数据锁。

窗口1:

代码语言:javascript
复制
mysql> alter table mytable comment='my table';
<hangs>

这将被阻塞,等待窗口2中未完成的事务完成。

此外,在窗口1等待时,任何其他后续查询都无法获得自己的元数据锁。

窗口3:

代码语言:javascript
复制
mysql> select * from mytable;
<hangs>

它在窗口1中的元数据锁请求后面排队。

如果我在窗口2提交:

代码语言:javascript
复制
mysql> commit;

最后,alter完成:

代码语言:javascript
复制
mysql> alter table mytable comment='my table';
Query OK, 0 rows affected (4 min 23.98 sec)

然后,第三个窗口中的查询也完成了:

代码语言:javascript
复制
mysql> select * from mytable;
Empty set (4 min 8.32 sec)

这样,即使是执行内部更改的ALTER也可能意外地导致中断。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/302285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档