mysqlimport到staging表,然后更改表名?

时间:2012-05-02 06:51:51

标签: mysql innodb staging database-performance mysqlimport

我们正在使用MySQL并拥有约110万条记录的InnoDB表,其中整个表必须每天两次用CSV替换数据。

到目前为止,我一直在做的是截断表格,然后使用mysqlimport每天两次从新的CSV重新填充表格。这导致大约160秒的停机时间,我最初被告知这很好,但情况已经不是这样了。

我能想到的唯一方法就是拥有一个临时表和一个生产表。实时查询将进入生产阶段,当我需要重新填充数据库时,我将截断暂存,然后将CSV重新插入其中,然后在完成后我将交换名称,以便暂存将具有旧数据库和生产将包含新导入的CSV。我想我需要一个中间名,比如生产变成了production2,分段变成了生产,然后production2就变成了分期。

有没有人有替代解决方案?该表需要尽快导入,这就是我使用mysqlimport的原因,停机时间必须极短。

2 个答案:

答案 0 :(得分:3)

我认为您已经拥有最佳解决方案。只要确保你进行原子重命名,即“将表生成重命名为production2,暂存到生产”。这样,它对应用程序/用户是透明的。需要注意的一件事是,如果有外键引用此表,因为键仍将引用重命名的旧表。但是我想,既然你可以在没有任何问题之前将其截断,那么你就没有任何问题。

编辑:我很擅长评论StackOverflow所以我不知道这是否是最好的地方,但我只是想评论eggyal发布的答案 - TRUNCATE会导致隐式提交所以建议的解决方案将无法按照描述的方式工作(即,即使在加载新数据之前,也会看到用户/应用程序的更改。)

答案 1 :(得分:0)

在事务中执行DELETELOAD DATA(无论如何都是mysqlimport)操作:MySQL会自动为您执行暂存过程,而不需要付出努力。

START TRANSACTION;
DELETE FROM foo;
LOAD DATA INFILE '/path/to/bar' INTO TABLE foo;
COMMIT;

N.B。:@JohannTagle指出,TRUNCATE会导致隐式提交,因此需要使用DELETE