![从技术上讲,是否可以将单个 mysql 数据库从一台服务器移动到另一台服务器,并且不停机?](https://linux22.com/image/584449/%E4%BB%8E%E6%8A%80%E6%9C%AF%E4%B8%8A%E8%AE%B2%EF%BC%8C%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%B0%86%E5%8D%95%E4%B8%AA%20mysql%20%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E5%B9%B6%E4%B8%94%E4%B8%8D%E5%81%9C%E6%9C%BA%EF%BC%9F.png)
这个问题比较棘手。我希望能够将单个数据库从一台服务器移动到另一台服务器,并且不会停机。我可以对主服务器上的数据进行快照,然后将其移动到辅助服务器上,启动复制,获取辅助服务器上的最新数据,最后将查询移动到辅助服务器上。
但是,如果辅助服务器已经是生产 MySQL 服务器,我无法重新启动它,并且必须接受来自多个不同源服务器的传入“数据库传输”,该怎么办?
我只想对此事做一个非常简短的介绍。
答案1
是的,正确的方法是使用集群/复制。以下是一些不正确的方法(但在特殊情况下可能有效):
如果您在 ZFS 上使用 MyISAM 或支持快照的其他文件系统,则可以锁定表以进行写入,发出刷新表、快照文件系统,然后解锁表。然后,进入快照,复制所有文件,并将它们加载到从属服务器上。当然,将它们放入从属服务器是上述过程的逆过程,只不过是删除和移动而不是反向快照。注意:我不会认真推荐生产系统上的任何人这样做。
您可以编写一个脚本,使用要复制到的表的定义在从属系统上创建临时表,然后连接到主系统,执行 select * 并将结果复制到目标内存表中,然后当它们全部完成后,锁定(或事务)表并将数据从内存复制到真实表(即,删除然后替换,或替换然后删除);然后,解锁并删除。
这两者实际上都不需要停机(取决于您的表大小等,它可能会短暂锁定数据库,可能最多几秒钟,如果您不经常这样做,这可能没问题。)
但是这两种解决方案都不是很好,因为它们会产生负载峰值,并导致同步之间的时间段从属数据不是最新的。你没有在问题中指定你需要这样做,因此提出了建议,但只是指出如果确实需要这样做,那么是的,你需要复制。
我使用第一种方法在我们拥有的非常特定的数据库服务器上进行备份(它们工作得很好),第二种方法是将数据从我无法控制的上游源同步到我可以控制的服务器,这样我就可以处理数据了。就像我说的,没有很好的通用解决方案,但在那些特定情况下,它们很有效。
答案2
由于如果没有数据库本身的本地支持,这一点很难做到,因此您可能需要考虑使用MySQL 集群使用异步复制。这将要但是,要求您使用 MySQL Cluster 发行版,而不是普通的 MySQL 发行版。
否则,就像@RolandoMySQLDBA 的回答所暗示的那样,如果没有对每个数据库之间镜像更新的底层支持,就根本无法复制数据库。他没有澄清的是,这不会导致停机时间——在转储和加载数据库时,站点可以保持只读状态。
答案3
我也认为 MySQL 集群是您的解决方案。您可以设置主动/被动解决方案。我所做的是在我的 DNS 服务器上配置故障转移,如果发生故障,我会将服务器平衡为被动服务器,然后我进行了故障转移...
当然,最好的解决方案是主动/主动,但当我这样做时,这并不简单,或者我比现在愚蠢得多:P
无论如何,我认为您的解决方案肯定会集中在集群配置上。