MySQL: репликация баз данных

Автор: | 25/02/2013
 

mysqllogoРепликация – есть ни что иное как “синхронизация” двух и/или более баз данных на различных серверах MySQL.

Сам процесс репликации происходит с помощью бинарных логов, ведущихся на MASTER-сервере.

Для их просмотра – используйтеся утилита mysqlbinlog.

Конфигурация сервера MASTER:

# uname -v
FreeBSD 9.0-RELEASE-p3

# pkg_info | grep mysql-server
mysql-server-5.5.30 Multithreaded SQL database (server)

В файл конфигурации сервера MySQL /etc/my.cnf в блок [mysqld] на сервере MASTER добавляем:


server-id = 1
log-bin = mysql-bin
replicate-do-db = testdb1

Обратите внимание, что некоторые из этих строк уже могут в нём присутствовать. В таком случае – закоментируйте или удалите их дубликаты.

Добавим пользователя replication, и назначим ему привелегию REPLICATION SLAVE для базы testdb1:

mysql> GRANT replication slave ON ‘testdb1’.* TO ‘replication’@’%’ identified by ‘password’;

Если доступ нужен ко всем базам – указываем:

mysql> GRANT replication slave ON *.* TO ‘replication’@’%’ identified by ‘password’;

Перезапускаем сервер MySQL:

# service mysql-server restart
Stopping mysql.
Waiting for PIDS: 28563.
Starting mysql.

Проверим – запустился ли он:

# service mysql-server status
mysql is running as pid 14744.

В случае ошибки:

# service mysql-server status
mysql is not running.

Проверяем, что бы указали в /etc/my.cnf или смотрим файл лога. О настройке логгирования MySQL рассказано в статье MySQL: включаем логи.

Проверяем состояние бинарного лога:

mysql> SHOW master STATUSG
*************************** 1. row ***************************
File: mysql-bin.000093
Position: 76302
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

Конфигурация SLAVE-сервера:

Операционная система

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.10
Release:        12.10
Codename:       quantal

Сервер MySQL:

# aptitude show mysql-server
Пакет: mysql-server
Состояние: установлен
Автоматически установлен: нет
Версия: 5.5.29-0ubuntu0.12.10.1

В файл конфигурации /etc/mysql/my.cnf в блок [mysqld] добавляем:

slave
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb1

Перезапускаем сервер:

# service mysql restart
mysql stop/waiting
mysql start/running, process 9524

Останавливаем запись в базы данных на MASTER-сервере:

mysql> SET GLOBAL read_only = ON;

Создаём дамп базы данных:

# mysqldump -u root -p testdb1 > testdb_bak.sql
Enter password:

Снимаем блокировку таблиц:

mysql> SET GLOBAL read_only = OFF;

Создаём базу на SLAVE-сервере:

mysql> create database testdb2;
Query OK, 1 row affected (0.00 sec)

Создаём пользователя userdb1 и назаначаем ему доступ к базе testdb2:

grant all on testdb2.* to ‘userdb1’@’localhost’ identified by ‘password’;
Query OK, 0 rows affected (0.00 sec)

Загружаем дамп в новую базу:

# mysql -u root -p userdb2 < testdb_bak.sql

Устанавливаем параметры репликации на SLAVE-сервере:

mysql> CHANGE MASTER TO MASTER_HOST = “77.120.***.40”, MASTER_USER = “replication”, MASTER_PASSWORD = “password “, MASTER_LOG_FILE = “mysql-bin.000093 “, MASTER_LOG_POS = 1309;
Query OK, 0 rows affected (0.59 sec)

Значения для MASTER_LOG_FILE и MASTER_LOG_POS – берём из команды:

mysql> SHOW SLAVE STATUSG

выполненной на MASTER-сервере.

Запускаем процесс:

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

Если требуется внести какие-либо изменения в настройки репликации на SLAVE-сервере – сначала надо остановить процесс командой:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)

Посмотреть процесс можно командой:

mysql> SHOW SLAVE STATUSG
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 77.120.106.40
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000093
Read_Master_Log_Pos: 4619
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 3563
Relay_Master_Log_File: mysql-bin.000093
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: testdb1
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: 4619
Relay_Log_Space: 3719
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: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)

О том, что процесс идёт нормально – свидетельствует изменение значений:

Master_Log_File: mysql-bin.000093
Read_Master_Log_Pos: 155385

На этом настройка репликации завершена. Теперь – обе базы будут синхронизироваться.

Ссылки по теме:

http://habrahabr.ru
http://phpclub.ru
http://www.opennet.ru