MySQL复制:将从站作为另一个从站的从站,没有任何(或最less可能)的停机时间

我有以下设置:

M1 =主人1
S1 =从站1
S2 =从机2
S3 =从机3

所有奴隶都直接从M1复制。 我想移动S2和S3成为S1的奴隶。

我不确定如何在没有任何停机时间的情况下执行此操作,并在复制停止的地方进行复制。 如何确保从站从新主站的日志中的正确位置继续,而不会错过任何写入或尝试重复写入,这些写入在更改之前已经完成。

其中一个奴隶在一个相对较慢的连接上的异地,而且它是一个相当大的数据库,所以从转储或复制数据文件重build奴隶将需要很长的时间,在我看来,好像它是不必要的!

任何帮助或build议非常感谢!

西蒙

警告:请仔细阅读,确保您理解并信任它

开始了 :

步骤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上创build二进制日志

步骤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}' 

这将使主人处于假死状态。 Master上的二进制日志位置将停止移动。 这将使所有的奴隶都有机会在复制的同一个地方停下来。 最后一行将回显持有读锁的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; 

请记住,对于MySQL 5.1用户MASTER_LOG_POS=106或对于MySQL 5.0用户MASTER_LOG_POS=106 MASTER_LOG_POS=98并返回。

这将指出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结束