Репликация позволяет синхронизировать все изменения базы данных на первичном сервера со вторичным.
Редактируем файл /etc/my.cnf
server-id=1 log_bin=/var/log/mysql/mysql-bin.log
В файл log_bin будут записываться изменения базы.
Параметром binlog_do_db=database возможно контролировать названия баз, для которых изменения будут записываться в файл, однако делать это не рекоммендуется (смотри ссылку)
Сохраняем изменения и перезагружаем сервер MySQL:
service mysql restart
Теперь нужно определить пользователя, который будет выкачивать данные об изменениях.
Для этого заходим в консоль MySQL:
mysql -u root -p
И выполняем команду
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
Отлично! Теперь осталось только сделать дамп базы и перенести на другой сервер.
Предварительно блокируем запись в базу.
В консоли MySQL:
FLUSH TABLES READ LOCK;
Далее нам нужно узнать позицию, с которой начнется репликация.
SHOW MASTER STATUS;
Запоминаем значение поля Position.
Теперь можно делать дамп.
Для этого нужно открыть новое окно, иначе, если произвести какое-либо действие,
база разблокируется автоматически. В новом окне выполняем команду:
mysqldump -u root -p -f db1 > db1.sql
где db1 — название базы, которую надо перенести
Разблокируем базу:
В консоли MySQL:
UNLOCK TABLES;
Готово. Теперь пришло время для второго сервера, на который надо реплицировать данные.
На втором сервере создаем базу, аналогичную первому серверу — db1.
Для этого в консоли MySQL:
CREATE DATABASE db1;
Теперь нужно залить в нее дамп с первого сервера
(Вы ведь уже перенесли файл db1.sql на этот сервер?)
mysql -u root -p -f db1 < db1.sql
Готово! Теперь у нас есть копия базы на втором сервере.
Редактируем конфиг MySQL /etc/my.cnf и выполняем аналогичные первому серверу действия:
server-id=2 relay-log=/var/log/mysql/mysql-relay-bin.log log_bin=/var/log/mysql/mysql-bin.log
Теперь сервер нужно перезагрузить:
service mysql restart
Сервер сконфигурирован и готов к репликации!
Остался один шаг, а именно указание основного сервера.
Для этого нам надо зайти в консоль MySQL и выполнить команду:
CHANGE MASTER TO MASTER_HOST='IP-адрес основного сервера', MASTER_USER='slave_user', MASTER_PASSWORD='pass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=XXX;
Вспоминаем поле Position из «SHOW MASTER STATUS» и вписываем его на место XXX.
И запускаем репликацию:
START SLAVE;
Смотрим состояние:
SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Чтобы остановить репликацию
STOP SLAVE
Готово. Теперь данные будут дублироваться между серверами!
PS: Не забываем, что для передачи используется TCP порт 3306, поэтому не забывайте про фаерволы.