MySql: Настройка репликации
Ок. Это не оригинальная статья. Таких, как эта - полным полно в интернете. Она мне нужна для того, что бы не приходилось каждый раз гуглить когда нужна шпаргалка.
Для начала рекомендую подредактировать фалйл /etc/hosts
следующими строками на обоих серверах:
mysql.master 192.168.10.10
mysql.slave 192.168.10.20
Ip дареса серверов поменяйте на свои.
Для того, что бы настроить репликацию баз в MySql нужно сначала подредактировать конфигурационные файлы /etc/my.cnf
или /etc/mysql/my.cnf
На Master сервере вносим следующие изменения:
[mysqld]
server-id=1
log-bin=mysql-bin
innodb_flush_log_at_trx_commit=1
sync_binlog=1
Перезапускаем mysqld что бы изменеия вступили в силу:
/etc/init.d/mysqld restart
Подключаемся к mysql:
mysql -u root -p
Создаем пользователя для репликации:
GRANT REPLICATION SLAVE ON \*.\* TO 'repl'@'%' IDENTIFIED BY 'password';
Имя пользователя (repl
) и пароль (password
) можно сменить на то, что больше нравится.
Репликация в mysql основывается на данных из так называемого бинарного лога (binlog). Он содержит историю транзакций. Грубо говоря, ведомый (slave) сервер повторяет у себя все действия, которые произошли на master сервере и вызвали изменения в базе или базах данных.
Нужно сделать некий контрольный срез этого лога, тоесть получить текущую позицию записи. Для этого выполните следующую команду:
mysql> show master status;
В результате получаем что-то вот такое:
+---------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+-----------+--------------+------------------+
| binlog.000005 | 849349769 | | |
+---------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
Нас интересует значение к колонке Position
. Нужно его запомнить/скопировать/записать. Именно с этого места начнется дублирование
на новом сервере.
Теперь можно перенести все базы данных с Master сервера на Slave.
На Slave сервере вносим следующие изменения в конфигурационный файл /etc/my.cnf
или /etc/mysql/my.cnf
:
[mysqld]
server-id=2
log-bin=mysql-bin
innodb_flush_log_at_trx_commit=1
sync_binlog=1
slave-skip-errors = 1062
Последняя строка нужна для того что бы избежать ошибок типа:
Last_SQL_Errno: 1062
Last_SQL_Error: Error 'Duplicate entry ... for key 'PRIMARY'' on query.
Перезапускаем mysqld что бы изменеия вступили в силу:
/etc/init.d/mysqld restart
Подключаемся к mysql:
mysql -u root -p
Полагаю, что в этот момент все базы данных были восстановлены на этом сервере. Для того что бы установить роль slave выполните следующую команду:
CHANGE MASTER TO
MASTER_HOST='mysql.master',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='binlog.000005',
MASTER_LOG_POS=849349769;
После этого запускаем slave роль:
START SLAVE;
Проверяем статус slave роли:
show slave status \G;
В выведеной информации находим следующие строки:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Если значения отлличные от Yes
, значит что-то пропустили или что-то пошло не так. Читайте логи mysql и ищите корень зла.