Problem
I have MySQL replication setup between 2 servers, master (A) and slave (B). I need to add a new slave to the mix (C). I want this slave to get it's updates directly from the master, I do not want chain replication from the slave. However, the master is "hot", I usually use Xtrabackup to create a full backup of the master, but this will lock it for a good 10 minutes, as the database is around 20GB in size.
Possible Solution
FLUSH TABLES WITH READ LOCK on slave B, use SHOW SLAVE STATUS on B, write down binlog and position. Then backup database with Xtrabackup, ship the backup to C and use it to create the slave, and set replication to point to A with the binlog position I just wrote down.
Question
Is there a better way that doesn't require me to lock B for so long? Or something that is more easily automated?
Best Answer
Hey I know a crazy method to create a slave without augmenting any operation of master (ServerA) or slave (ServerB)
Step 1) Setup a New Server (ServerC)
Step 2) On ServerC, Install MySQL (same version as ServerB)
Step 3) On ServerC, service mysql stop
Step 4) Copy /etc/my.cnf from ServerB to ServerC
Step 5) On ServerC, change server_id to a value different from ServerA and ServerB
Step 6) rsync /var/lib/mysql on ServerB to ServerC
Step 7) When rsync is completed, run "STOP SLAVE;" on ServerB
Step 8) rsync /var/lib/mysql on ServerB to ServerC
Step 9) On ServerB, run "START SLAVE;"
Step 10) On ServerC, service mysql start
Step 11) On ServerC, run "START SLAVE;" (Do this if skip-slave-start is in /etc/my.cnf)
Give it a Try !!!
BTW I have the utmost confidence this will work because I just did this for client over the last 2 days. Client had 2.7TB of data on a slave. I rsyncd to another server while the slave was still active. rsync took like 11 hours. I then ran STOP SLAVE; on the first slave and ran rsync again. That took another hour. I then performed the above step and everything is done.