Forneci links para tutoriais. Lembre-se de que, no Ubuntu, o arquivo my.cnf está em /etc/mysql/my.cnf e não em /etc/my.cnf, como no tutorial da howtoforge. Na minha configuração, eu não usei FLUSH TABLES WITH READ LOCK; no mestre. Se o servidor principal tiver muita atividade de gravação, talvez seja necessário bloquear suas tabelas executando esse comando antes de fazer o backup. Se você usa FLUSH TABLES WITH READ LOCK ;, após o backup, você deseja executar UNLOCK TABLES. Se você tiver algum problema, me avise.
Aqui está o tutorial que encontrei no howto forge, feito para o Redhat / CentOS:
http://www.howtoforge.com/mysql_database_replication
Outro tutorial que parecia bom para o Ubuntu
http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/
Aqui está a configuração que eu usei:
No servidor MASTER
Configure o servidor principal:
vi /etc/mysql/my.cnf
[mysqld]
# bind-address = 127.0.0.1 (comment this out)
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
max_binlog_size = 100M
expire_logs_days = 1
Reinicie o MySQL:
/etc/init.d/mysql restart
Conecte-se ao console do mysql: mysql -u root -ppassword
Crie e conceda permissões ao usuário de replicação.
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';
Certifique-se de copiar essas informações em algum lugar ou deixá-las visíveis
SHOW MASTER STATUS \G;
mysql> show master status \G;
File: mysql-bin.000001
Position: 100
Binlog_Do_DB:
Binlog_Ignore_DB:
mysql> quit
Despejar o banco de dados em um arquivo:
mysqldump -u root -p databasename > /tmp/databasename-backup.sql
Copie o dump do banco de dados no servidor escravo usando scp ou use ftp, se desejar:
scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/
No servidor SLAVE
Edite a configuração do mysql:
vi /etc/mysql/my.cnf
[mysqld]
# slave server configuration
server_id = 2
# this is optional, but I find it useful to specify where the relay logs go to control.
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M
Reinicie o MySQL: /etc/init.d/mysql restart
Restaure o backup:
mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql
Conecte-se ao MySQL:
mysql -u root -ppassword
stop slave;
# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;
start slave;
Execute SHOW SLAVE STATUS\G
:
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: ipaddressmaster
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.0000001
Read_Master_Log_Pos: 100
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 1
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 17324288
Relay_Log_Space: 17324425
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.02 sec)
Posteriormente, lembre-se de que a replicação pode falhar por vários motivos. No escravo, você pode monitorar o status executando o comando SHOW SLAVE STATUS \ G; Ou configurar um trabalho cron para monitorar o status e enviar e-mails, se houver falha. Familiarize-se com a saída deste comando. Se a replicação estiver sendo executada corretamente, você deverá ver "Slave_IO_State: Aguardando que o mestre envie o evento".
Depois de obter essa configuração corretamente, posso fornecer um script para monitorar essa replicação.
Aqui está um script para monitorar o log de erros no MySQL. Se você adicionar a linha
[mysqld]
log-error = /var/log/mysql/mysql.err
reinicie o mysql: /etc/init.d/mysql restart
Em seguida, você pode usar o seguinte script para monitorar o arquivo de log. Se o log mudar de alguma maneira, você receberá um email notificando que ocorreu um erro no servidor escravo. Se você deseja que o log de erros seja verificado regularmente, será necessário adicionar esse script ao seu crontab.
Aqui está um exemplo de script: /somepath/monitor_mysql_log.sh
#! /bin/sh
MAIL_TO="addressemail@something.com"
# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err
# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1
# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG
[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO
# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG
Para adicionar ao crontab.
Torne o script executável:
chmod +x /somepath/monitor_mysql_log.sh
Atualize o crontab:
crontab -e
* * * * * /somepath/monitor_mysql_log.sh
E o script será executado a cada minuto.
O script que forneci é um script que acabei de montar rapidamente. Além disso, para que seu servidor possa enviar e-mails, você precisará instalar algo como postfix ou sendmail.