MySQL同时重命名和创建表

时间:2018-03-13 04:21:41

标签: mysql sql mysql-event

我需要重命名MySQL表并同时创建一个新的MySQL表。

有大量记录的关键实时表。 master_table 始终从脚本中插入记录。

需要备份主表并同时创建另一个具有相同名称的主表。

通用SQL是这样的。

RENAME TABLE master_table TO backup_table;

Create table master_table (id,value) values ('1','5000');

是否有可能在执行上述查询时记录缺失的数据?

有什么方法可以避免丢失记录?锁定主表等......

2 个答案:

答案 0 :(得分:3)

我所做的是以下内容。它不会导致停机,数据丢失和几乎瞬时执行。

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。

答案 1 :(得分:2)

您可以,而不是重命名master_backup表并重新创建它 只需使用master_table中的数据创建一个backup_table,用于第一次备份运行。

CREATE TABLE backup_table AS
   SELECT * FROM master_table;

如果必须将主键添加到备份表,则只运行一次,即第一次备份:

ALTER TABLE backup_table ADD CONSTRAINT pk_backup_table PRIMARY KEY(id);

对于将来的备份,请执行以下操作:

INSERT INTO backup_table 
  SELECT * FROM master_table;

然后您可以删除master_table中找到的backup_table中的所有数据,如:

DELETE FROM master_table A JOIN 
       backup_table B ON A.id=B.id;

然后,您可以使用此查询将数据添加到master_table:

INSERT INTO master_table (`value`) VALUES ('5000'); -- I assume the id field is auto_incrementable

我认为即使没有锁定主表也不会丢失执行,这应该可以完美地工作。