我目前有一个主数据库服务器(我们称之为 db1)和 6 个从属服务器(slave1-6)。我已将新服务器 (db2) 设置为 db1 的从属服务器,并且它们处于同步状态。我想将所有从属服务器更改为使用 db2 而不是 db1,但尽量减少停机时间/数据丢失。
目前我能想到的唯一方法是关闭我们的网站(这样数据就不会写入 db1),等到所有从服务器都更新完毕后,刷新 db1 上的日志,然后关闭它。重置 db2 上的主服务器,将所有从服务器更改为指向 db2,日志位置 = 0。
这是正确的方法吗?或者有没有无需让网站离线的方法?
答案1
目前还不清楚您是否正在移动应用程序来写入 db2,但您可以在系统运行时重新掌握从属服务器以从 db2 进行复制。
我过去处理这个问题的方法是:
1)停止从站[1-6]
2) 停止 db2 上的从属。注意它作为 db1 的从属的文件/pos 信息 (Master_Log_File 和 Exec_Master_Log_Pos) 及其主日志 pos (显示主状态)。
3) 在从属[1-6]上,‘启动从属直到 master_log_file = $file,master_log_pos = $pos’。这些是来自上面的从属信息((Master_Log_File 和 Exec_Master_Log_Pos))的位置。
4) 此时验证从属[1-6]和db2相对于其主db1在“显示从属状态”中具有相同的复制位置。
5)停止从站[1-6]上的从站
6) 在从属[1-6] 上更改主服务器。新的 master_log_file 和 master_log_pos 值是您在步骤 2 中从 db2 上的“show master status”获得的信息。
7)在从站[1-6]上启动从站。
请注意,此方法会导致所有从属数据库上的复制都处于陈旧状态。如果手动完成,这应该需要几分钟,或者您可以编写脚本并将其缩短到几秒钟。如果您的网站无法容忍由于复制延迟而导致的任何数据陈旧,那么您将不得不以不同的方式完成这项工作。
您还应确保 db2 已打开 log-slave-updates,否则它将无法正确地将语句从其主服务器复制到其从服务器。
祝你好运!