jas*_*eUK 5 mysql mysql-cluster mysql-5.6
最近有一个问题,在一个有 100 万行的表上添加一列需要 5 个小时。我添加了一个默认值为 1 的列。这是在夜间完成的,因此数据库上没有太多活动,但是一旦开始,它确实有很多锁。
查看服务器统计信息 CPU、内存和硬盘空间都远低于其最大值的一半。所以我不知道为什么这花了这么长时间,有问题的表只有 7 列,包括新的。数据类型为 int(11)、datetime 或 varchar(45)。
我使用的是 MySQL Cluster 7.3.3,有 4 个数据节点,它们都在同一个数据中心。
谁能建议为什么简单地添加一列需要 5 个小时?
表结构:
CREATE TABLE ddi_t (
id int(11) NOT NULL AUTO_INCREMENT,
ddi varchar(45) NOT NULL,
is_deleted tinyint(1) NOT NULL DEFAULT '0',
created_time datetime NOT NULL,
module_group_id int(11) DEFAULT NULL,
created_user_id int(11) DEFAULT NULL,
supplier_id int(11) DEFAULT '1',
PRIMARY KEY (id),
UNIQUE KEY uq_ddi_1 (ddi),
KEY fk_ddi_1_idx (module_group_id)
) ENGINE=ndbcluster AUTO_INCREMENT=935352 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
添加列需要对整个表(每个节点,而不是每个集群)使用独占锁。没有队列,因此数据库将等到没有写入发生后再锁定表。如果应用程序正在执行大量写入,则可能无法获取该锁。
如果您可以控制应用程序连接到哪个节点(使用 HAProxy 等),请将所有流量引导远离您尝试更新的节点。否则,您需要在执行此类任务之前关闭应用程序。