从技术上讲,将一个mysql数据库从一个服务器移到另一个服务器是没有停机的吗?

这一个是棘手的。 我希望能够将单个数据库从服务器移动到另一个数据库,而无需停机。 我可以在主服务器上抓取数据的快照,移到辅助服务器上,启动复制服务,在辅助服务器上获得最新的数据,将查询移动到辅助服务器上。

但是,如果辅助服务器已经是一个生产MySQL服务器,我不能重新启动,并且必须接受来自多个不同源服务器的传入“数据库转移”?

我只想简单介绍一下这个问题。

所以是的,正确的方法是使用集群/复制。 这里有一些不正确的(但可能在特殊情况下function)的方式来做到这一点:

  1. 如果您在ZFS或其他支持快照的文件系统上使用MyISAM,则可以locking表以进行写入,发出刷新表,快照文件系统,然后解锁表。 然后,进入快照,复制所有文件,并将其加载到从服务器上。 当然,把它们放到从属服务器上是与上述过程相反的,除了删除和移动而不是反向快照。 注意:我不会认真地向生产系统中的任何人推荐这个。

  2. 您可以编写一个脚本,使用要复制的表的定义在从属系统上创build临时表,然后连接到主系统,执行select *并将结果复制到目标内存表中,然后当它们全部完成时,locking(或者交易)表格并且将数据从存储器复制到真实的表格(即,删除然后replace,或者replace然后删除); 然后,解锁和凌晨。

这两个都不需要停机(取决于你的表格大小等等,它可能会locking数据库一段时间,最多可能是几秒钟,如果你不经常这样做,这可能是好的)。

然而,这两种解决scheme都不是很好,因为它们会产生负载尖峰,并导致在从属数据不是最新的同步之间的时间段。 你没有在你的问题中指定你需要的,因此build议,但只是指出,如果这实际上是必需的,那么是的,你需要复制。

我使用类似第一个想法的东西来做一个非常特定的数据库服务器上的备份(而且它们工作正常),第二个同步来自上游源的数据,我不控制到一个服务器,我有控制权,这样我就可以与数据一起工作。 就像我说的那样,在那里没有很好的通用解决scheme,但是在那些特定的情况下,

由于在数据库本身没有本地支持的情况下这很难做到,所以您可能需要考虑使用具有asynchronous复制的MySQL集群 。 但是,这要求您使用MySQL Cluster分发,而不是正常的MySQL分发。

否则,就像@ RolandoMySQLDBA的答案所build议的那样,如果没有对每个数据库上的更新进行镜像的基础支持,就无法复制数据库。 他没有说明的是,这不会导致停机 – 在数据库被转储和加载时,站点可以保持在只读状态。

我也认为MySQL集群是你的解决scheme。 您可以设置主动/被动解决scheme。 我所做的是configuration故障转移在我的DNS服务器,如果失败我平衡服务器到被动的,然后我做了故障切换…

当然最好的解决scheme主动/主动是最好的,但当我这样做不是微不足道的,或者我比现在更愚蠢:P

无论如何,我认为你的解决scheme肯定是集中configuration。