Using the topology you mentioned from the [MySQL Documentation][1] ![sxjn][2] Let's setup the first scenario **EXAMPLE IPs for Each DB Server** - `Master1` : `10.20.30.40` - `Master2` : `10.20.30.50` - `Slave_1` : `10.20.30.60` - replication user is `repluser@'%'` - replication password is `replpass` ***Make sure binary logging is enabled on all the Slaves*** We will do the following - Promote Master2 to Master1 - Promote Slave_1 to Master2 - Demote Master1 to Slave1 *Step 01* : On Master2, run the following mysql> SET GLOBAL read_only = 1; mysql> STOP SLAVE; mysql> RESET SLAVE; mysql> CHANGE MASTER TO master_host=''; mysql> FLUSH TABLES; mysql> SET GLOBAL read_only = 0; *Step 02* : Move your CNAME/VIP to Master2 *Step 03* : On Slave_1, run `mysql> RESET MASTER; FLUSH TABLES;` *Step 04* : On Slave_1, dump the data NEW_MASTER_HOST="10.20.30.60" MYSQL_USER=root MYSQL_PASS=rootpassword MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" MYSQLDUMP_OPTIONS="--single-transaction" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --routines" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --triggers" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --master-data=1" MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --all-databases" echo "STOP SLAVE;" > MySQLData.sql echo "CHANGE MASTER TO master_host='${NEW_MASTER_IP}'," >> MySQLData.sql echo "master_port=3306," >> MySQLData.sql echo "master_user='repluser'," >> MySQLData.sql echo "master_password='replpass'," >> MySQLData.sql echo "master_log_file='bogus'," >> MySQLData.sql echo "master_log_pos=1;" >> MySQLData.sql mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} >> MySQLData.sql echo "START SLAVE;" >> MySQLData.sql gzip MySQLData.sql *Step 05* : When Master1 comes back up, rsync or scp `MySQLData.sql.gz` from Slave_1 to Master1 *Step 06* : Login to MySQL on the Master1 and setup it up to replicate from Slave_1 Don't worry about the real binary log filename and position. Using `--master-data=1` embeds `CHANGE MASTER TO` command with the real coordinates on line 23 of a standard dump. You can see it with the following less MySQLData.sql.gz | head -35 | tail -1 *Step 07* : Load the data into Master1 MYSQL_USER=root MYSQL_PASS=rootpassword MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" gzip -d < MySQLData.sql.gz | mysql ${MYSQL_CONN} *Step 08* : Login to MySQL on Master1 mysql> SHOW SLAVE STATUS\G and Make sure `Slave_IO_Running` and `Slave_SQL_Running` both say `Yes` #EPILOGUE When Done, the topology should be - `Master1` : `10.20.30.60` - `Master2` : `10.20.30.50` - `Slave_1` : `10.20.30.40` #DISCLAIMER Please try this out on Test Servers before deploying to Production #GIVE IT A TRY !!! **Note: I would advise that you have multiples slaves** - One for Nightly Backups - The others for load balancing `SELECTs` [1]: http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-performance.html [2]: https://i.sstatic.net/z162N.png