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

mysqlimport到staging表,然后更改表名?,mysql,innodb,staging,database-performance,mysqlimport,Mysql,Innodb,Staging,Database Performance,Mysqlimport,我们正在使用MySQL,并且有一个~110万条记录的InnoDB表,其中整个表必须每天两次用来自CSV的数据替换 到目前为止,我一直在做的是截断表,然后使用mysqlimport每天两次从新的CSV重新填充表。这导致了大约160秒的停机时间,起初我被告知这是可以的,但现在已经不是这样了 我能想到的唯一方法是拥有一个暂存表和一个生产表。实时查询将进入生产,当我需要重新填充数据库时,我将截断暂存,然后将CSV导入其中,然后在完成后,我将交换名称,以便暂存将拥有旧数据库,生产将包含新导入的CSV。我想

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

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

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


有人有别的解决办法吗?表需要尽快导入,这就是我使用mysqlimport的原因,停机时间必须非常短。

我认为您已经有了最佳解决方案。只需确保执行原子重命名,即“将表生产重命名为production2,将暂存重命名为生产”。这样,它将对应用程序/用户透明。需要注意的一点是,是否有外键引用此表,因为这些键仍将引用重命名的旧表。但我想,既然你以前能够毫无问题地截断它,那么你就没有合适的位置了


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

我想您已经找到了最佳解决方案。只需确保执行原子重命名,即“将表生产重命名为production2,将暂存重命名为生产”。这样,它将对应用程序/用户透明。需要注意的一点是,是否有外键引用此表,因为这些键仍将引用重命名的旧表。但我想,既然你以前能够毫无问题地截断它,那么你就没有合适的位置了


编辑:我对StackOverflow的评论很陌生,所以我不知道这是否是最好的地方,但我只想对eggyal发布的答案发表评论-TRUNCATE会导致隐式提交,因此建议的解决方案不会如所述工作(即,即使在加载新数据之前,用户/应用程序也会看到更改)。在事务中执行
删除
加载数据
(这就是
mysqlimport
所做的全部)操作:MySQL将自动为您执行登台过程,而无需付出任何努力

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

注意:@JohannTagle指出,
TRUNCATE
会导致隐式提交,因此需要使用
DELETE

在事务中执行
删除
加载数据
(这都是
mysqlimport
所做的)操作:MySQL将自动为您执行登台过程,没有努力

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

注意:@JohannTagle指出,
TRUNCATE
会导致隐式提交,因此需要使用
DELETE

在eggyal的消息下发表评论,而不是用另一个答案的评论稀释你的答案!Htthanks Rippo,但我在eggyal的消息中找不到任何“评论”链接。现在才发现,这是因为我没有最低的50个声誉,还不能在其他帖子上发表评论。啊哈,我明白了,在这里我将+1你。没有意识到评论需要50个代表。我没有意识到
TRUNCATE
导致隐式提交!一个人每天都能学到新东西。尽管如此,我们仍然可以使用
DELETE
。。。我将更新我的答案。在eggyal的消息下发表评论,而不是用另一个答案的评论来稀释你的答案!Htthanks Rippo,但我在eggyal的消息中找不到任何“评论”链接。现在才发现,这是因为我没有最低的50个声誉,还不能在其他帖子上发表评论。啊哈,我明白了,在这里我将+1你。没有意识到评论需要50个代表。我没有意识到
TRUNCATE
导致隐式提交!一个人每天都能学到新东西。尽管如此,我们仍然可以使用
DELETE
。。。我会更新我的答案。