最佳的存档实时MySQL数据库的方法

27
我们有一个实时的MySQL数据库,99%的操作是INSERT,每秒大约100次。我们希望每天归档一次数据,以便于在不影响主实时数据库的情况下运行查询。另外,一旦归档完成,我们希望清空实时数据库。
如果可能的话,在不锁定INSERTs的情况下,最好的方法是什么?我们在查询中使用INSERT DELAYED。
6个回答

15

http://www.maatkit.org/提供了mk-archiver,该工具可以将一个表中的行存档或清除到另一个表和/或文件中。它旨在以非常小的数据块高效地“咬取”数据,而不会干扰关键的在线事务处理(OLTP)查询。它通过一种非回溯查询计划实现这一目标,该计划从查询到查询保持其在表中的位置,因此每个后续查询都很少做更多的工作来查找更多可归档的行。

另一种选择是每天创建一个新的数据库表。对于此,MyISAM确实具有某些优点,因为向表末尾进行的插入通常不会被阻塞,而且还有一种合并表类型可以将它们全部重新组合在一起。许多网站将httpd流量记录到类似的表中。

使用MySQL 5.1,还可以使用分区表来实现大致相同的功能。


mk-archiver 正好符合我的需求! - davidmytton
2
Maatkit已成为Percona Toolkit的一部分 - http://www.percona.com/doc/percona-toolkit/2.1/pt-archiver.html - Alister Bulman

4

我使用了mysql分区表,并在各个方面都取得了很好的结果。


2

链接不存在。 - Martin Karari

2
听起来复制是这个问题的最佳解决方案。在初始同步之后,从服务器通过二进制日志获取更新,因此不会影响主数据库。
了解更多关于复制的信息,请参见这里

1

MySQL 复制非常适合这种情况。
主服务器 -> 生产服务器。
从服务器 -> 同一网络中的不同服务器。


0

你能否保留两个镜像数据库?一个用于写入,另一个作为归档。每隔24小时(或您认为合适的时间)切换一次。将今天的所有活动插入到归档数据库中。然后这两个数据库应该匹配。将其用作新的实时数据库。对归档数据库进行任何想要的操作。现在可以备份/提取/读取所有内容,因为它不再被主动写入。

这有点像拥有镜像RAID,您可以将其中一个驱动器脱机备份,重新同步它,然后将另一个驱动器取出备份。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接