熟悉 MariaDB 中复制的工作方式,解决方案就变得很直观了。
您可以通过将现有数据库复制到新服务器来创建副本数据库服务器,mysqldump
并特别注意选项--master-data
并--single-transaction
进行备份。将结果加载到您的新数据库服务器上会创建原始数据库的副本,因为它在您开始进行备份时就已经存在。InnoDB MVCC 确保每个表中每一行的版本,因为它在备份开始时存在,是加载此备份后出现在新服务器上的版本。(是的,你必须使用 InnoDB,无论如何你都应该这样做。)
然后,您将新数据库(作为从属)连接到旧数据库(作为主数据库),指示它从同一时间点开始复制——由备份中包含的主日志坐标标识的时间点——开始备份的时间。
您等待从站与主站同步。
SHOW MASTER STATUS;
在主服务器和从服务器上监视复制状态SHOW SLAVE STATUS;
,确定从服务器何时确实与主服务器“当前”是很简单的。MariaDB 复制是“异步”的,因为主服务器上的更改是在从服务器上进行更改之前进行的,但是对于具有适当容量的从服务器,典型的复制延迟是数量级或毫秒……而且,再次,很容易决定。在停止/启动您的应用程序所需的时间内,可以确认任何延迟数据已完成复制。
使从属可写(通常从属设置为只读模式,唯一的更改源是复制 SQL 线程,当然仍然可以写入它)...然后监视复制以验证同步,停止应用程序,将应用程序指向新数据库,验证复制是否仍然同步,启动应用程序...完成。现在,断开从属数据库与主数据库的连接并放弃旧的主数据库。
当然,真正的零停机时间实际上是不可能的,因为在某些时候必须重新配置应用程序以连接到不同的数据库......但总停机时间基本上取决于您可以键入多快,或自动执行必要的步骤来轮询两者数据库服务器并比较复制坐标,并进行转换。
冒着明显的风险,永远不要将数据库以外的任何东西放在数据库服务器上,也不要将它与应用程序并置。生产中的任何例外情况都不应公开讨论。一个经常出现的问题,如这里、 这里、这里和这里所见这通常归因于人们无视这一原则,在同一台服务器上运行应用程序及其数据库。性能和稳定性不仅存在风险,而且出现的症状也给人一种(不正确的)印象,即 MySQL(或 MariaDB 或 Percona Server)有故障,“崩溃”,而实际上应用程序有故障,提示操作系统强制使数据库崩溃,以尝试在不可避免的内存耗尽时保持整体机器稳定性。