Existem duas alternativas
ALTERNATIVA # 1: Use o XtraBackup
É capaz de copiar o MyISAM, assim como o InnoDB, em um mestre em execução.
ALTERNATIVA # 2: Execute várias vezes o rsync
Você pode executar o rsync em / var / lib / mysql em um master e copiá-lo para / var / lib / mysql em um escravo. Claro, eu rodaria o rsync várias vezes. Até o último rsync você deve executar o FLUSH TABLES WITH READ LOCK. Antes de copiar, certifique-se de colocar todos os registros binários e começar do zero.
Antes de executar qualquer coisa, por favor, certifique-se de que os logs binários estão escritos em / var / lib / mysql no master e slave, tendo algo como o seguinte em /etc/my.cnf:
[mysqld]
log-bin=mysql-bin
Por favor, tente executar este script no caso de você não querer desligar o MySQL no master:
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0; RESET MASTER;"
RSYNCSTOTRY=7
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
X='echo ${X}+1|bc'
rsync -r * slaveserver:/var/lib/mysql/.
sleep 60
done
mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);"
sleep 60
SLEEPID='mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}''
rsync -r * slaveserver:/var/lib/mysql/.
mysql -u... -p... -e"KILL ${SLEEPID};"
Sou um pouco mais conservador em termos de dados e páginas de índice armazenadas em cache ao fazer isso. Pessoalmente, eu prefiro desligar o mysql após vários rsyncs ao invés das tabelas FLUSH WITH READ LOCK. Outra alternativa para este script seria o seguinte script que desliga o mysql para o rsync final:
mysql -u... -p... -e"RESET MASTER;"
RSYNCSTOTRY=7
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
X='echo ${X}+1|bc'
rsync -r * slaveserver:/var/lib/mysql/.
sleep 60
done
service mysql stop
rsync -r * slaveserver:/var/lib/mysql/.
service mysql start
Isso é tudo para a parte do rsync do mestre. E quanto ao escravo ???
Antes de iniciar o mysql no escravo, você precisa ter o arquivo de log e a posição de log do mestre. Os registros binários que você copiou precisam, particularmente o último log binário. Aqui está como você consegue isso no escravo:
cd /var/lib/mysql
for X in 'ls -l mysql-bin.0* | awk '{print $9}''
do
LOGFIL=${X}
done
LOGPOS='ls -l ${LOGFIL} | awk '{print $5}''
echo "Master Log File ${LOGFIL} Position ${LOGPOS}"
Você pode confiar nesses números porque os copiou pessoalmente do mestre. Agora que você tem o registro principal e a posição, você pode iniciar o mysql no escravo e configurar a replicação usando o arquivo de log e a posição de registro que acabou de ser reportada.
Experimente !!!
CAVEAT
Se você tiver algum dado do InnoDB, você deve definir isto cerca de 1 hora antes de tentar o rsync:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Isso fará com que o InnoDB pague dados não-consolidados do InnoDB Buffer Pool mais rápido.