我们有一个实时MySQL数据库,99%INSERT,每秒100左右。我们希望每天存档数据,以便我们可以在其上运行查询,而不会影响主数据库。此外,存档完成后,我们要清除实时数据库。
如果没有(如果可能)锁定INSERT,最好的方法是什么?我们对查询使用INSERT DELAYED。
答案 0 :(得分:14)
http://www.maatkit.org/有mk-archiver
将表中的行存档或清除到另一个表和/或文件。它旨在以非常小的块有效地“蚕食”数据,而不会干扰关键的在线事务处理(OLTP)查询。它通过一个非回溯查询计划来实现这一点,该计划在查询到查询的表格中保持其位置,因此每个后续查询都可以很少地找到更多可存档行。
另一种方法是每天简单地创建一个新的数据库表。 MyIsam确实有一些优点,因为INSERT到表的末尾通常不会阻塞,并且有一个合并表类型将它们全部重新组合在一起。许多网站将httpd流量记录到这样的表中。
使用Mysql 5.1,还有一些分区表也可以做同样的事情。
答案 1 :(得分:2)
听起来像复制是最好的解决方案。在初始同步之后,从设备通过Binary Log获得更新,因此根本不会影响主数据库。
答案 2 :(得分:2)
我使用mysql分区表,我在各方面都取得了很好的成绩。
答案 3 :(得分:1)
MySQL复制对此非常有用。
大师 - >实时服务器
奴隶 - >同一网络上的其他服务器。
答案 4 :(得分:1)
MK-ARCHIVER是一个存档MYSQL数据的优雅工具。
答案 5 :(得分:0)
你能保留两个镜像数据库吗?写一个,保留第二个作为存档。每24小时切换一次(或者你认为合适的时间长)。进入作为存档的数据库,插入所有今天的活动。那么两个数据库应该匹配。将其用作新的实时数据库。获取存档的数据库并执行您想要的任何操作。您现在可以备份/提取/读取所有未被主动写入的内容。
有点像镜像raid,你可以将一个驱动器脱机备份,重新同步它,然后将另一个驱动器用于备份。