我有以下设置:
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结束