Mysql Alter Tables 添加1列需要5个小时

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)

And*_*nan 0

添加列需要对整个表(每个节点,而不是每个集群)使用独占锁。没有队列,因此数据库将等到没有写入发生后再锁定表。如果应用程序正在执行大量写入,则可能无法获取该锁。

如果您可以控制应用程序连接到哪个节点(使用 HAProxy 等),请将所有流量引导远离您尝试更新的节点。否则,您需要在执行此类任务之前关闭应用程序。