Настройка мастера MySQL

Настройку сервера мастера MySQL-master начнем с изменения файла конфигурации /usr/local/etc/my.cnf
Укажем уникальный SERVER-ID сервера (это обязательно!), путь к бинарным логам и имя базы данных для репликации в секции [mysqld]:

Server-id = 1
log-bin =/var/lib/mysql/mysql-bin
replicate-do-db = mydb

Для нормальной работы необходимо иметь достаточно места в разделе где у вас будут лежать бинарные логи.

Создаем пользователя replication с правами «replication slave», под ним будет производится репликация.

master-server@root>GRANT replication slave ON *.* TO "replication"@"192.168.30.5" IDENTIFIED BY "password";

Для принятия изменений перезагрузим MySQL сервер:

master-server@root#service mysql-server restart

Если все прошло успешно, команда «show master status» покажет:

master-server@root> SHOW MASTER STATUS\G
File: mysql-bin.000005
Position: 88
Binlog_Do_DB:
Binlog_Ignore_DB:

Значение position должно увеличиваться по мере того, как вносятся изменения в базу на мастере.

Настройка реплики MySQL
Укажем также SERVER-ID сервера, имя базы для репликации и путь к relay-бинлогам в секции [mysqld] конфигурационного файла, потом перезагрузим MySQL:

Server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = mydb

slave-server@root#service mysql-server restart

Переносим данные

Для начала залочим базу для записи. Для этого можно либо остановить работу приложений, либо установить флаг read_only на мастере. Если у нас есть таблицы MyISAM, сделаем также «flush tables»:

master-server@root> FLUSH TABLES WITH READ LOCK;
master-server@root> SET GLOBAL read_only = ON;

Посмотрим состояние мастера командой «show master status» и запомним значения File и Position (после успешной блокировки мастера они не должны изменятся):

File: mysql-bin.000005
Position: 88

Делаем дамп БД, и после завершения операции снимаем блокировку таблиц мастера:

master-server@root> SET GLOBAL read_only = OFF;
master-server@root> UNLOCK TABLES;

Переносим дамп на реплику и восстанавливаем из него данные.

В завершении запускаем репликацию командами «change master to» и «start slave» и проверяем статус:

slave-server@root> CHANGE MASTER TO MASTER_HOST = "192.168.30.31", MASTER_USER = "replication", MASTER_PASSWORD = "password", MASTER_LOG_FILE = "mysql-bin.000005", MASTER_LOG_POS = 88;

slave-server@root> start slave;

Значения MASTER_LOG_FILE и MASTER_LOG_POS неоходимо брать с мастера.

Проверим как идет репликация:

slave-server@root> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.30.31
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 88
Relay_Log_File: mysql-relay-bin.001252
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mydb,mydb
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: 88
Relay_Log_Space: 235
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: 5

Значения «Slave_IO_Running: Yes» и «Slave_SQL_Running: Yes» — говорит о том, что репликация идет успешно.

P.S.

Если появится ошибка:

1.

ERROR 1201 at line 1: Could not initialize master info
structure; more error messages can be found in the MySQL error log

Тогда пробуем на реплике выполнить следующие команды:

stop slave;
reset slave;
change master to "указать куда" ;
start slave;

2. Ошибка связанная с переполнением раздела

Когда бинарные логи переполняют раздел файловой системы, то необходимо почистить эти логи командами:

show binary logs;
purge binary logs before '2014-09-11 02:20:09'

unix-way