MySQL 复制:从属服务器变为另一个从属服务器,且无需停机(或停机时间最少)

MySQL 复制:从属服务器变为另一个从属服务器,且无需停机(或停机时间最少)

我有以下设置:

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=98MySQL 5.0 及更高版本。

这将指向 S2 和 S3 的复制从 S1 开始。

步骤 11)在 S2 上运行

mysql> START SLAVE; SELECT SLEEP(5); SHOW SLAVE STATUS\G

这将启动复制,暂停 5 秒,并显示从属状态。如果Slave_IO_Running=YesSlave_SQL_Running=Yes,则一切正常。

步骤 12)对 S3 重复步骤 11

就是这样。

警告

停机时间从步骤 06 开始,到步骤 09 结束

相关内容