我试图弄清楚像下面这样的命令会使用什么样的替换算法
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操作包括:.这种更改的一个例子是对列注释的更改。
但是,这是针对列注释而不是表注释的,我想知道这可能有所不同吗?有人能帮我弄清楚这条语句使用的是什么算法吗?或者是否有一种方法来记录它或者什么的?
谢谢
表定义
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语句实际上在做什么,以及它是如何实现的。
发布于 2021-11-08 14:00:36
MySQL支持表、列、索引和分区上的元数据注释。在任何情况下,修改注释都是元数据操作,它可以在不做表副本的情况下完成。
但是,任何alter,即使是内部ALTER,都需要一个元数据锁。元数据锁的获取将被阻止,而任何已触及该表的事务都会被阻止。
我可以使用两个窗口进行演示:
窗口1:
mysql> create table mytable (id int primary key);
Query OK, 0 rows affected (0.05 sec)窗口2:
mysql> start transaction;
mysql> select * from mytable;
Empty set (0.00 sec)到目前为止还不错,这就是我们所期望的。但是请注意,即使完成了该查询,事务仍然未提交。因此,窗口2中的会话持有该表上的元数据锁。
窗口1:
mysql> alter table mytable comment='my table';
<hangs>这将被阻塞,等待窗口2中未完成的事务完成。
此外,在窗口1等待时,任何其他后续查询都无法获得自己的元数据锁。
窗口3:
mysql> select * from mytable;
<hangs>它在窗口1中的元数据锁请求后面排队。
如果我在窗口2提交:
mysql> commit;最后,alter完成:
mysql> alter table mytable comment='my table';
Query OK, 0 rows affected (4 min 23.98 sec)然后,第三个窗口中的查询也完成了:
mysql> select * from mytable;
Empty set (4 min 8.32 sec)这样,即使是执行内部更改的ALTER也可能意外地导致中断。
https://dba.stackexchange.com/questions/302285
复制相似问题