Рассмотрим настройку репликации MySQL/
Links
- http://dev.mysql.com/doc/refman/5.5/en/replication.html
- http://dev.mysql.com/doc/refman/5.5/en/replication-howto.html
- http://habrahabr.ru/post/56702/
- option_mysqld_log-slave-updates — применяется в случае репликации с репликации.
Решение
Допустим у нас есть два сервера (192.168.10.10 192.168.10.20). Первый будет основным, а второй репликой.
На основном сервере уже крутятся какие-то базы и мы не хотим их трогать.
192.168.10.10 (main)
Правим /etc/mysql/my.snf:
+character-set-server = utf8 +language = /usr/share/mysql/english -bind-address = 127.0.0.1 +bind-address = 0.0.0.0 -#server-id = 1 -#log_bin = /var/log/mysql/mysql-bin.log +server-id = 1 +log_bin = /var/log/mysql/mysql-bin.log
Выполняем команды:
# Выдаем права на репликацию cat | mysql -u root -p'passwd' << EOF CREATE USER 'repl'@'192.168.10.20' IDENTIFIED BY 'replPasswd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.20'; FLUSH PRIVILEGES; EOF # Рестартим сервис, чтоб применить новые параметры /etc/init.d/mysql restart # Останавливаем запись в базу echo "FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;" | mysql -u root -p'passwd' # Узнаем статус реплики echo 'SHOW MASTER STATUS;'|mysql -u root -p'passwd' # Получаем что-то типа: #File Position Binlog_Do_DB Binlog_Ignore_DB #mysql-bin.000002 11463 # Делаем полный dump mysqldump -u root -p'passwd' --all-databases --master-data > dbdump.db # Запускаем запись в базу echo "SET GLOBAL read_only = OFF; UNLOCK TABLES;FLUSH TABLES;"|mysql -u root -p'passwd'
192.168.10.20 (replic)
Правим /etc/mysql/my.snf:
+character-set-server = utf8 +language = /usr/share/mysql/english -bind-address = 127.0.0.1 +bind-address = 0.0.0.0 -#server-id = 1 +server-id = 2
Выполняем:
# Рестартим сервис, чтоб применить новые параметры /etc/init.d/mysql restart # Заливаем созданный dump mysql -u root -p'passwd' < dbdump.db # Потребуется скопировать с мастера пароль в файле /etc/mysql/debian.cnf # Рестартим сервис, чтоб применить новые параметры /etc/init.d/mysql restart # Включаем репликацию cat | mysql -u root -p'passwd' << EOF STOP SLAVE; RESET SLAVE; CHANGE MASTER TO MASTER_HOST='192.168.10.10', MASTER_USER='repl', MASTER_PASSWORD='replPasswd', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=11463; START SLAVE; SHOW SLAVE STATUS\G EOF
192.168.10.30 (replic2)Запускаем еще одну реплику
На мастере добавляем нового пользователя:
CREATE USER 'repl2'@'192.168.10.30' IDENTIFIED BY 'replPasswd'; GRANT REPLICATION SLAVE ON *.* TO 'repl2'@'192.168.10.30'; FLUSH PRIVILEGES;
На реплике, которая уже работает:
cat | mysql -u root -p'passwd' << EOF # Останавливаем репликацию FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON; # Получаем поля SHOW SLAVE STATUS\G EOF
Нас интересуют поля:
- Master_Host:
- Master_Log_File:
- Read_Master_Log_Pos:
На сервере новой реплики правим /etc/mysql/my.snf и /etc/mysql/debian.cnf по аналогии с первой репликой.
/etc/init.d/mysql restart mysqldump -h 192.168.10.20 --all-databases \ --master-data -u root -p'passwd' \ | mysql -u root -p'passwd' cat | mysql -u root -p'passwd' << EOF STOP SLAVE; RESET SLAVE; # Какраз здесь вбиваем поля, которые получили ранее в первой реплике CHANGE MASTER TO MASTER_HOST='192.168.10.10', MASTER_USER='repl2', MASTER_PASSWORD='replPasswd', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=11463; START SLAVE; SHOW SLAVE STATUS\G EOF
Если все работает нормально, то не забываем включить и первую реплику.
SET GLOBAL read_only = OFF; UNLOCK TABLES;FLUSH TABLES; START SLAVE;
trash
# Показать статус слейва SHOW SLAVE STATUS\G # Главное: #Slave_IO_State: Waiting for master to send event #Slave_IO_Running: Yes #Slave_SQL_Running: Yes #Seconds_Behind_Master: 5 # Показать переменные SHOW VARIABLES; # Показать сколько живет бинарный лог (def 10) SHOW VARIABLES LIKE 'expire_logs_days';