Простая репликация БД MySQL

Инструкция по настройки простой репликации с мастер сервера на слэйв сервер.

Данная инстракция описывает работу в связке FreeBSD 8.2 + MySQL 5.1

Настройка мастера
Нам необходимо внести изменения в /usr/local/etc/my.cnf (если его нет, копируем с /usr/local/share/mysql/my-medium.cnf)
Обязательно укажем уникальный ID сервера, путь для бинарных логов и имя БД для репликации в секции [mysqld]:

<

server-id = <span class="nu0">1</span>
 log-bin = <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>mysql-bin
 replicate-do-db = testdb

Убедитесь, что у вас достаточно места на диске для бинарных логов.

Добавим пользователя replication, под правами которого будет производится репликация. Будет достаточно привилегии «replication slave «. В сети часто встречается инструкция такого вида:

mysql@master<span class="sy1">></span> <a href="http://search.mysql.com/search?site=refman-%35%31&q=GRANT"><span class="kw1">GRANT</span></a> replication slave <a href="http://search.mysql.com/search?site=refman-%35%31&q=ON"><span class="kw1">ON</span></a> <span class="st0">"testdb"</span>.<span class="sy1">*</span> <a href="http://search.mysql.com/search?site=refman-%35%31&q=TO"><span class="kw1">TO</span></a> <span class="st0">"replication"</span>@<span class="st0">"192.168.1.1"</span> IDENTIFIED BY <span class="st0">"password"</span><span class="sy2">;</span>

Когда я выполнял у себя эту реализацию — закончилось неудачей. Права на репликацию — административная опция и если у вас не получилось — пробуйте этот вариант:

mysql@master<span class="sy1">></span> <a href="http://search.mysql.com/search?site=refman-%35%31&q=GRANT"><span class="kw1">GRANT</span></a> replication slave <a href="http://search.mysql.com/search?site=refman-%35%31&q=ON"><span class="kw1">ON</span></a> <span class="sy1">*</span>.<span class="sy1">*</span> <a href="http://search.mysql.com/search?site=refman-%35%31&q=TO"><span class="kw1">TO</span></a> <span class="st0">"replication"</span>@<span class="st0">"192.168.1.1"</span> IDENTIFIED BY <span class="st0">"password"</span><span class="sy2">;</span>

Перезагрузим MySQL, чтобы изменения в конфиге вступили в силу:

<

<span class="co4">root@master# </span>service mysql-server restart

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

<

mysql<span class="sy0">@</span>master<span class="sy0">></span> SHOW MASTER STATUS\G
 File: mysql-bin.000003
 Position: <span class="nu0">98</span>
 Binlog_Do_DB:
 Binlog_Ignore_DB:

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

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

<

server-id = <span class="nu0">2</span>
 relay-log = <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>mysql-relay-bin
 relay-log-index = <span class="sy0">/</span>var<span class="sy0">/</span>lib<span class="sy0">/</span>mysql<span class="sy0">/</span>mysql-relay-bin.index
 replicate-do-db = testdb

<

<span class="co4">root@replica# </span>service mysql-server restart

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

<

mysql<span class="sy0">@</span>master<span class="sy0">></span> FLUSH TABLES WITH READ LOCK;
 mysql<span class="sy0">@</span>master<span class="sy0">></span> SET GLOBAL read_only = ON;

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

 File: mysql-bin.000003
 Position: 98

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

<

mysql<span class="sy0">@</span>master<span class="sy0">></span> SET GLOBAL read_only = OFF;
 mysql<span class="sy0">@</span>master<span class="sy0">></span> UNLOCK TABLES;

Переносим дамп на реплику и восстанавливаем из него данные.
Наконец, запускаем репликацию командами «change master to» и «start slave» и посмотрим, все ли прошло хорошо:

<

mysql<span class="sy0">@</span>replica<span class="sy0">></span> CHANGE MASTER TO MASTER_HOST = <span class="st0">"192.168.1.101"</span>, MASTER_USER = <span class="st0">"replication"</span>, MASTER_PASSWORD = <span class="st0">"password"</span>, MASTER_LOG_FILE = <span class="st0">"mysql-bin.000003"</span>, MASTER_LOG_POS = <span class="nu0">98</span>;

<

mysql<span class="sy0">@</span>replica<span class="sy0">></span> start slave;

Значения MASTER_LOG_FILE и MASTER_LOG_POS мы берем с мастера.

Посмотрим, как идет репликация командой «show slave status»:

<

mysql<span class="sy0">@</span>replica<span class="sy0">></span> SHOW SLAVE STATUS\G
 Slave_IO_State: Waiting <span class="kw1">for</span> master to send event
 Master_Host: 192.168.1.101
 Master_User: replication
 Master_Port: <span class="nu0">3306</span>
 Connect_Retry: <span class="nu0">60</span>
 Master_Log_File: mysql-bin.000003
 Read_Master_Log_Pos: <span class="nu0">98</span>
 Relay_Log_File: mysql-relay-bin.001152
 Relay_Log_Pos: <span class="nu0">235</span>
 Relay_Master_Log_File: mysql-bin.000003
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
 Replicate_Do_DB: testdb,testdb
 Replicate_Ignore_DB:
 Replicate_Do_Table:
 Replicate_Ignore_Table:
 Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
 Last_Errno: <span class="nu0">0</span>
 Last_Error:
 Skip_Counter: <span class="nu0">0</span>
 Exec_Master_Log_Pos: <span class="nu0">98</span>
 Relay_Log_Space: <span class="nu0">235</span>
 Until_Condition: None
 Until_Log_File:
 Until_Log_Pos: <span class="nu0">0</span>
 Master_SSL_Allowed: No
 Master_SSL_CA_File:
 Master_SSL_CA_Path:
 Master_SSL_Cert:
 Master_SSL_Cipher:
 Master_SSL_Key:
 Seconds_Behind_Master: <span class="nu0">5</span>

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

Update #1

При появлении ошибки:

<

ERROR <span class="nu0">1201</span> <span class="br0">(</span>HY000<span class="br0">)</span> at line <span class="nu0">1</span>: Could not initialize master info
 structure; <span class="kw2">more</span> error messages can be found <span class="kw1">in</span> the MySQL error log

На slave’е необходимо выполнить следующее:

<

stop slave;
 reset slave;
 change master to…. ;
 start slave;

Update #2

Если бинарные логи переполнили раздел, необходимо воспользоваться следующими командами:

<

show binary logs;
 purge binary logs before <span class="st_h">'2012-07-11 00:00:01'</span>

Источник http://semenushkin.ru/2011/11/11/%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B0%D1%8F-%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B1%D0%B4-mysql/

Запись опубликована в рубрике *mysql, *Unix,*Linux. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91