我维护一个运行每日cron作业的服务器来聚合数据源并生成报告,这些报告可以通过私有的Ruby on Rails应用程序访问。
我们的一个数据源是我们合作伙伴的一个数据库的部分转储。合作伙伴运行一个活动的应用程序,MySQL DB有数百个表。他们给了我们对应用程序数据库相对不足的只读从属的只读访问权。
由于其从属数据库的延迟问题和性能瓶颈,我们一直在维护其数据库的有限本地副本。我们的报告只需要大约20个表,所以我只转储这些表。我们也只需要每日粒度的数据,因此不需要实时同步。
几个月来,我实现了一个夜间cron,它将必要表的转储流式传输到本地production_tmp
数据库。然后,在导入所有表格后,我删除了production
并将production_tmp
重命名为production
。这一直有效,直到数据库增长到25GB以上,我们开始遇到磁盘空间限制。
目前,我已经删除了冗余步骤,只是直接将转储流式传输到本地服务器上的production
。这对我来说有点脆弱,我想实施一种更安全的方法。此外,目前正在进行完全转储/负载需要我们的服务器超过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以上才开始工作,我们开始遇到磁盘空间限制。
有些问题“在这里”:
除此之外:
最后的想法(需要MySQL企业备份https://www.mysql.de/products/enterprise/backup.html):