如何将列正常添加到具有超过 100K 条记录的 mysql table 中?

How to add a column normally into a mysql table with more than 100K records?

如上述标题 normally 中所述,我所做的不是更改 table 以添加一列的正常方法。

我们正在使用 MySql 5.5Toad 在数据库中进行操作。有一个 table appln_doc 有将近 300K 的记录存储申请人的文件,例如图像,而且尺寸也很大。

现在我们必须添加 tinyint 类型的新列 is_signature。我们尝试了三种不同的方式

  1. 在内置配置中使用 Toads - 双击 table,一个新的 window 将在列选项卡下添加一个包含名称、类型和大小的新列,然后单击更改按钮。
  2. 在 toad 本身中使用 alter table 查询。
  3. 我们使用 putty 登录 mysql 并执行相同的查询。

这三项努力都会导致同一个问题Fixing “Lock wait timeout exceeded; try restarting transaction” for a 'stuck" Mysql table。所以我们试图杀死等待进程并再次尝试改变table,结果还是一样。

我们再次终止进程并重新启动 mysql 服务器并再次尝试添加列,问题仍然相同。

最后我们将所有 table 数据导出到 excel sheet 并截断了 table。之后,当我们尝试添加该列时,它成功了。然后导出的 excel sheet 添加了一个新列 is_signature ,其所有值都是 0 作为新列的默认值。然后我们再次将该数据导出回 table。这就是为什么我说我没有在 normal way.

中添加列

那么有没有人遇到过这样的情况并且有比这更好的解决方案?谁能说出为什么会这样,是因为存储在 table 中的数据量大吗?

PS : table appln_doc 的 child table appln_doc_details 没有数据。只有这个 table 在更改时有问题。

归根结底,无论您使用什么工具,都归结为以下两种情况之一:

  1. 一个alter table语句
  2. 新建table/copydata/delete旧table/rename新建table.

第一个通常更快,第二个通常更灵活(有些东西 table 不能更改)。

无论哪种方式,处理这么多数据都需要花费大量时间,而且您对此无能为力。

好的一面是,几乎所有超时都可以在某处配置。我不知道如何配置这个特定的,但我 99% 确定你可以。找出方法并将其增加到足够大。对于 300K 条记录,我认为操作大约需要 10 分钟或更短时间,但这当然要视情况而定。将其设置为 10 小时。 :)