我有一个MySQL数据库,它在一周的某一天在给定时间(大约120万行)每周从源获取一次数据并将其存储,然后调用它,“直播”表。
我想将“实时”表中的所有数据复制到存档中,并截断实时表格,以便为下一周的下一个“当前数据”腾出空间。
任何人都可以建议一种有效的方法。我真的想避免 - 插入archive_table select * from live - 。我希望能够使用PHP运行这个归档器,所以我不能使用Maatkit。有什么建议吗?
编辑:此外,存档数据需要易于访问。由于每个插入都有时间戳,如果我想查找上个月的数据,我可以在档案中搜索它
答案 0 :(得分:2)
偷偷摸摸的方式:
不要复制记录。这花了太长时间。
相反,只需将实时表重命名,然后重新创建:
RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);
它应该非常快速和无痛。
编辑:如果你想要一个每个轮换周期的归档表,我描述的方法效果最好。如果要维护单个存档表,可能需要变得更加棘手。但是,如果您只是想对历史数据进行即席查询,则可以使用UNION。
如果你只想保存一些时间段的数据,你可以用类似于日志轮换的方式重命名一次。然后,您可以定义一个视图,将归档表UNION为一个大的honkin'表。
EDIT2:如果你想保留自动增量内容,你可能希望尝试:
RENAME TABLE live TO archive1;
CREATE TABLE live (...);
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);
但遗憾的是,这不起作用。但是,如果您正在使用PHP驱动该过程,那么这很容易解决。
答案 1 :(得分:1)
编写一个脚本作为cron作业运行到:
答案 2 :(得分:0)
这取决于您在归档后对数据执行的操作,但您是否考虑过使用MySQL复制?
您可以将另一台服务器设置为复制从属服务器,并且在复制完所有数据后,在其之前使用SET BIN-LOG 0
进行删除或截断,以避免该语句被复制。