维护实时远程MySQL数据库的本地只读副本的有效方法是什么?

时间:2016-08-02 22:04:08

标签: mysql linux database cron devops

我维护一个运行每日cron作业的服务器来聚合数据源并生成报告,这些报告可以通过私有的Ruby on Rails应用程序访问。

我们的一个数据源是我们合作伙伴的一个数据库的部分转储。合作伙伴运行一个活动的应用程序,MySQL DB有数百个表。他们给了我们对应用程序数据库相对不足的只读从属的只读访问权。

由于其从属数据库的延迟问题和性能瓶颈,我们一直在维护其数据库的有限本地副本。我们的报告只需要大约20个表,所以我只转储这些表。我们也只需要每日粒度的数据,因此不需要实时同步。

几个月来,我实现了一个夜间cron,它将必要表的转储流式传输到本地production_tmp数据库。然后,在导入所有表格后,我删除了production并将production_tmp重命名为production。这一直有效,直到数据库增长到25GB以上,我们开始遇到磁盘空间限制。

目前,我已经删除了冗余步骤,只是直接将转储流式传输到本地服务器上的production。这对我来说有点脆弱,我想实施一种更安全的方法。此外,目前正在进行完全转储/负载需要我们的服务器超过2小时,并且我想实施一种不需要花费很长时间的方法。数据库只会不断增长,所以我希望能够实现未来的证明。

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:2)

我认为你从未听说过,或者考虑过MySQL Replication

这个想法是你做备份&还原一次,然后将副本配置为“订阅”到在主MySQL实例上进行的连续更改流。应用于主数据库的任何更改都会在几秒钟内自动应用于副本。你没有必要做备份&除非复制品被损坏,否则请再次恢复。

设置和继续工作需要一些注意,但这是一种更有效的方法,可以保持两个实例同步。

@SusannahPotts提及热备份和/或增量备份。您可以免费获得这两个功能,而无需使用Percona XtraBackup支付MySQL Enterprise。

您还可以考虑使用MySQL Transportable Tablespaces

您需要文件系统访问才能运行Percona XtraBackup或MySQL Enterprise Backup。例如,不可能将这些物理备份工具用于Amazon RDS。

另一种方法是在与实时系统相同的网络中创建复制从站,并在该从站上运行Percona XtraBackup,在那里您可以访问文件系统。

另一种选择是将二进制日志流式传输到另一台主机(请参阅https://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html),然后定期将它们传输到本地实例并重播它们。

这些解决方案中的每一个都有利有弊。很难推荐哪种解决方案最适合您,因为您没有分享有关您的要求的完整详细信息。

答案 1 :(得分:1)

  

直到数据库增长到25GB以上才开始工作,我们开始遇到磁盘空间限制。

有些问题“在这里”:

  • 为什么不直接增加数据库的可用磁盘空间?当它归结为磁盘空间时,25 GB似乎什么都没有?
  • 为什么不修改脚本:下载table1,导入table1_tmp,drop table1_prod,将table1_tmp重命名为table1_prod;冲洗并重复。

除此之外:

  • 为什么不向合作伙伴询问具有足够性能的系统来运行报告?我很确定,他更喜欢这个而不是让你每天都将敏感数据下载到你的“本地网站”?

最后的想法(需要MySQL企业备份https://www.mysql.de/products/enterprise/backup.html):