我有以下设置:
M1 = 主设备 1
S1 = 从设备 1
S2 = 从设备 2
S3 = 从设备 3
所有从属服务器都直接从 M1 复制。我想将 S2 和 S3 移动为 S1 的从属服务器。
我不确定如何在不停机的情况下完成此操作,并且复制可以从中断的地方继续。如何确保从属服务器从新主服务器的日志中的正确位置继续,而不会丢失任何写入或尝试重复在更改之前已经完成的写入。
其中一个从属服务器位于异地,连接速度相对较慢,并且数据库很大,因此从转储重建从属服务器或复制数据文件会花费太长时间,而且在我看来,这似乎是不必要的!
非常感谢任何帮助或建议!
西蒙
答案1
警告:请仔细阅读,确保您理解并信任它
开始了 :
步骤 01)获取 S1 的私有 IP 地址(记在某处)
$ ip addr show
步骤 02)从 S1 获取复制的用户名和密码
cd /var/lib/mysql
cat master.info
用户名和密码以纯文本形式保存在此文件中
步骤 03)在 S1 上运行
mysql> GRANT REPLICATION SLAVE ON *.* TO '<username from Step 02>'@'%' IDENTIFIED BY '<password from Step 02>';
步骤 04)在 S1 上,将其添加到 /etc/my.cnf
[mysqld]
log-slave-updates
log-bin=mysql-bin
步骤 05)在 S1 上运行此
service mysql restart
这将在 S1 上创建二进制日志
步骤 06)在 M1 上,在命令行上运行此命令
$ mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);" &
$ sleep 15
$ mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'
这将使主服务器处于假死状态。主服务器上的二进制日志位置将停止移动。这将使所有从服务器都有机会在复制中停止在同一个位置。最后一行将回显持有读取锁的 MySQL ProcessID。不要丢失这个数字!!!
步骤 07)在 S1 上运行
mysql> RESET MASTER; SHOW MASTER STATUS;
这将清除 S1 上的所有二进制日志,并显示 S1 的二进制日志和位置。日志文件应名为mysql-bin.000001
。位置将根据 MySQL 的版本而有所不同。对于 MySQL 5.5,它是 107。对于 MySQL 5.1,它是 106。对于 MySQL 5.1 之前的任何版本,它是 98。
步骤 08)在 S2 和 S3 上运行此操作
mysql> STOP SLAVE;
步骤 09)在 M1 上运行以下命令:
mysql> KILL <ProcessID From Step 06>;
这将释放所有待处理的 INSERT、UPDATE 和 DELETE。
步骤 10)在 S2 和 S3 上运行
mysql> CHANGE MASTER TO
MASTER_HOST='<ip address of S1 from Step 01>',
MASTER_PORT=3306,
MASTER_USER='<username from Step 02>',
MASTER_PASSWORD='<password from Step 02>',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
请记住,用户MASTER_LOG_POS=106
适用于 MySQL 5.1 或MASTER_LOG_POS=98
MySQL 5.0 及更高版本。
这将指向 S2 和 S3 的复制从 S1 开始。
步骤 11)在 S2 上运行
mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G
这将启动复制,暂停 5 秒,并显示从属状态。如果Slave_IO_Running=Yes
和Slave_SQL_Running=Yes
,则一切正常。
步骤 12)对 S3 重复步骤 11
就是这样。
警告
停机时间从步骤 06 开始,到步骤 09 结束