我有一个MySQL DB,它每周的某一天在给定的时间(大约120万行)从某个源接收大量数据,并将其存储在,我们称之为“活动”表中。
我希望将“活动”表中的所有数据复制到归档中,并截断活动表,以便为下一周到来的下一个“当前数据”腾出空间。
有没有人能建议一个有效的方法来做这件事。我真的在努力避免-- insert into archive_table select * from live --。我希望能够运行此归档程序使用PHP,所以我不能使用Maatkit。有什么建议吗?
编辑:另外,存档的数据需要易于访问。因为每次插入都有时间戳,所以如果我想查找上个月的数据,我可以在归档中搜索它
发布于 2011-04-13 04:33:49
诡计多端:
不要复制记录。这太耗时了。
相反,只需重命名活动表,然后重新创建:
RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);它应该是相当快和无痛的。
编辑:如果你想要一个每个循环周期的存档表,我描述的方法效果最好。如果您想维护单个存档表,可能需要更复杂一些。但是,如果您只想对历史数据进行即席查询,那么您可能只需要使用UNION。
如果您只想保存几个周期的数据,则可以以类似于日志轮换的方式多次执行重命名操作。然后,您可以定义一个视图,将存档表合并为一个很大的表。
EDIT2:如果你想维护自动增量的东西,你可能希望尝试一下:
RENAME TABLE live TO archive1;
CREATE TABLE live (...);
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);但不幸的是,这样做行不通。但是,如果您使用PHP来驱动这个过程,那么很容易解决这个问题。
发布于 2011-04-13 03:44:15
编写脚本以作为cron作业运行,以执行以下操作:
发布于 2011-04-13 03:47:51
这将取决于您在归档数据后对数据所做的操作,但是您是否考虑过使用MySQL复制?
您可以将另一台服务器设置为复制从服务器,一旦复制了所有数据,请在其前面使用SET BIN-LOG 0执行删除或截断操作,以避免该语句也被复制。
https://stackoverflow.com/questions/5640625
复制相似问题