我要做的是以下。它不会导致停机,不会丢失数据,并且几乎可以立即执行。
CREATE TABLE mytable_new LIKE mytable;
...possibly update the AUTO_INCREMENT of the new table...
RENAME TABLE mytable TO mytable_old, mytable_new TO mytable;
通过在一个语句中重命名两个表,它们被原子交换。在没有表接收写入的情况下,没有机会在“中间”写入任何数据。如果您不以原子方式执行此操作,则某些写入可能会失败。
RENAME TABLE 几乎是即时的,无论表有多大。您不必等待数据被复制。
如果表有一个自增主键,我想确保新表以大于旧表中当前 id 的 id 值开始。在交换表名之前执行此操作。
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable';
我喜欢为该值添加一些舒适的余量。您要确保插入旧表的 id 值不会超过您从 INFORMATION_SCHEMA 查询的值。
更改新表以将此新值用于其下一个自动增量:
ALTER TABLE mytable_new AUTO_INCREMENT=<increased value>;
然后立即执行 RENAME TABLE 来交换它们。一旦将新行插入到新的空表中,它将使用从增加的自动增量值开始的 id 值,如果您及时执行这些步骤,该值仍应大于插入旧表中的最后一个 id。