gpt4 book ai didi

MySQL 使用在线 DDL 添加列

转载 作者:可可西里 更新时间:2023-11-01 08:39:16 27 4
gpt4 key购买 nike

我目前正在尝试向约 2500 万行的表格中添加一列。我需要接近 0 的停机时间,所以希望使用在线 DDL。它运行了一段时间,但最终遇到了问题:

"Duplicate entry '1234' for key 'PRIMARY'" 
[SQL: u'ALTER TABLE my_table ADD COLUMN my_coumn BOOL NOT NULL DEFAULT false']

我认为发生这种情况是因为我在运行操作时正在对表运行 INSERT ... ON DUPLICATE KEY UPDATE ... 操作。这似乎是一个 known limitation .

在这不起作用之后,我尝试使用 Percona pt-online-schema-change 工具,但不幸的是,因为我的表生成了列,所以它也不起作用并出现错误:

The value specified for generated column 'my_generated_column' in table '_my_table_new' is not allowed.

所以,我现在不知所措。在不阻止 DML 操作的情况下添加列的其他选项是什么?

最佳答案

您的 Alter 语句正在创建一个默认值为 false 的不可空列。我怀疑这会在您的表上放置一个独占锁,尝试创建该列,然后在每一行中将其设置为 False。

如果您没有任何可用的停机时间,我建议您

  1. 将列添加为可空且没有默认值

    ALTER TABLE my_table ADD COLUMN my_coumn BOOL NULL;
  2. 将现有行的值更新为 false

    update my_table set my_coumn=false;
  3. 再次更改表,使其不可为空并使用默认值。

    ALTER TABLE my_table modify my_coumn BOOL NOT NULL DEFAULT false;

或者你可以使用像 Percona 这样的东西它使用触发器管理模式更改,旨在提供在不锁定表的情况下更新模式的能力。

无论哪种选择,我都建议您在您的开发环境中进行测试,将一些进程写入表以模拟用户事件。

关于MySQL 使用在线 DDL 添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com