2

我有一个 MySQL 数据库,它每周在给定时间(大约 120 万行)每周的某一天从一个源接收大量数据,并将其存储在“实时”表中,我们称之为“实时”表。

我想将“实时”表中的所有数据复制到存档中并截断实时表,以便为下周将出现的下一个“当前数据”腾出空间。

任何人都可以提出一种有效的方法来做到这一点。我真的很想避免 -- insert into archive_table select * from live --。我希望能够使用 PHP 运行这个归档器,所以我不能使用 Maatkit。有什么建议么?

编辑:此外,归档数据需要易于访问。由于每个插入都有时间戳,如果我想查找上个月的数据,我可以在档案中搜索它

4

3 回答 3

2

偷偷摸摸的方式:

不要复制记录。那需要的时间太长了。

相反,只需重命名活动表,然后重新创建:

RENAME TABLE live_table TO archive_table;
CREATE TABLE live_table (...);

它应该非常快速且无痛。

编辑:如果您想要每个轮换周期的存档表,我描述的方法效果最好。如果要维护单个存档表,可能需要变得更棘手。但是,如果您只想对历史数据进行临时查询,您可能只使用 UNION。

如果你只想保存几个周期的数据,你可以做几次重命名,类似于日志轮换。然后,您可以定义一个视图,将存档表联合到一个大的 honkin 表中。

EDIT2:如果您想维护自动增量的东西,您可能希望尝试:

RENAME TABLE live TO archive1; 
CREATE TABLE live (...); 
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1);

但遗憾的是,这行不通。但是,如果您使用 PHP 驱动该过程,则很容易解决。

于 2011-04-12T20:33:49.470 回答
1

编写一个脚本以作为 cron 作业运行以:

  1. 从“实时”表中转储存档数据(使用 shell 脚本中的 mysqldump 可能更有效)
  2. 截断活动表
  3. 修改转储文件中的 INSERT 语句,使表名引用归档表而不是活动表
  4. 将存档数据附加到存档表(同样,可以通过 shell 脚本从转储文件导入,例如 mysql dbname < dumpfile.sql)
于 2011-04-12T19:44:15.330 回答
0

这将取决于您在归档数据后对数据的处理方式,但您是否考虑过使用 MySQL 复制?

您可以将另一台服务器设置为复制从属服务器,一旦所有数据都被复制,请SET BIN-LOG 0在它之前执行删除或截断,以避免该语句也被复制。

于 2011-04-12T19:47:50.867 回答