我们有一个实时的MySQL数据库,99%的操作是INSERT,每秒大约100次。我们希望每天归档一次数据,以便于在不影响主实时数据库的情况下运行查询。另外,一旦归档完成,我们希望清空实时数据库。
如果可能的话,在不锁定INSERTs的情况下,最好的方法是什么?我们在查询中使用INSERT DELAYED。
如果可能的话,在不锁定INSERTs的情况下,最好的方法是什么?我们在查询中使用INSERT DELAYED。
http://www.maatkit.org/提供了mk-archiver,该工具可以将一个表中的行存档或清除到另一个表和/或文件中。它旨在以非常小的数据块高效地“咬取”数据,而不会干扰关键的在线事务处理(OLTP)查询。它通过一种非回溯查询计划实现这一目标,该计划从查询到查询保持其在表中的位置,因此每个后续查询都很少做更多的工作来查找更多可归档的行。
另一种选择是每天创建一个新的数据库表。对于此,MyISAM确实具有某些优点,因为向表末尾进行的插入通常不会被阻塞,而且还有一种合并表类型可以将它们全部重新组合在一起。许多网站将httpd流量记录到类似的表中。
使用MySQL 5.1,还可以使用分区表来实现大致相同的功能。
我使用了mysql分区表,并在各个方面都取得了很好的结果。
MK-ARCHIVER是一个优雅的工具,用于归档MYSQL数据。
MySQL 复制非常适合这种情况。
主服务器 -> 生产服务器。
从服务器 -> 同一网络中的不同服务器。
你能否保留两个镜像数据库?一个用于写入,另一个作为归档。每隔24小时(或您认为合适的时间)切换一次。将今天的所有活动插入到归档数据库中。然后这两个数据库应该匹配。将其用作新的实时数据库。对归档数据库进行任何想要的操作。现在可以备份/提取/读取所有内容,因为它不再被主动写入。
这有点像拥有镜像RAID,您可以将其中一个驱动器脱机备份,重新同步它,然后将另一个驱动器取出备份。