我维护着一个服务器,每天运行 cron 作业来聚合数据源并生成报告,可通过私有(private) Ruby on Rails 应用程序访问。
我们的一个数据源是我们合作伙伴的一个数据库的部分转储。合作伙伴运行一个活跃的应用程序,MySQL 数据库有数百个表。他们为我们提供了对他们应用程序数据库的相对低效的只读从属的只读访问权限。
由于他们的从属数据库存在延迟问题和性能瓶颈,我们一直在维护他们数据库的有限本地副本。我们的报告只需要大约 20 个表,所以我只转储这些表。我们也只需要每日粒度的数据,因此不需要实时同步。
几个月来,我实现了一个夜间 cron,它将必要表的转储流式传输到本地 production_tmp
数据库中。然后,在导入所有表后,我删除了 production
并将 production_tmp
重命名为 production
。这一直有效,直到数据库增长到超过 25GB,并且我们开始遇到磁盘空间限制。
现在,我已经删除了冗余步骤,只是将转储直接流式传输到我们本地服务器上的 production
中。这对我来说有点脆弱,我想实现一种更安全的方法。此外,目前执行完全转储/加载需要我们的服务器超过 2 小时,我想实现一种不需要那么长时间的方法。数据库只会不断增长,所以我想实现一些面向 future 的东西。
如有任何建议,我们将不胜感激!
最佳答案
我认为您从未听说过或考虑过 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 ),然后定期将它们传输到您的本地实例并重播它们。
这些解决方案各有利弊。很难推荐哪种解决方案最适合您,因为您没有分享有关您的要求的完整详细信息。
关于mysql - 维护实时远程 MySQL 数据库的本地只读副本的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38731222/