Crmgo Блог

Реплікація MySQL

Реплікація MySQL

Налаштування майстра Обов’язково вкажіть унікальний ID сервера, шлях для бінарних журналів та ім’я бази даних для реплікації в секції [mysqld]: server-id = 1 log-bin = /var/lib/mysql/mysql-bin replicate-do-db = testdb Переконайтеся, що на диску достатньо місця для бінарних журналів. Додамо…

Реплікація MySQL
Налаштування майстра

Обов'язково вкажіть унікальний ID сервера, шлях для бінарних логів та ім'я БД для реплікації в секції [mysqld]:
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb

Переконайтеся, що у вас достатньо місця на диску для бінарних логів.

Додамо користувача replication, під правами якого буде виконуватися реплікація. Достатньо привілею "replication slave ":
mysql@master> GRANT replication slave ON "testdb".* TO "replication"@"192.168.1.102" IDENTIFIED BY "password";

Перезавантажимо MySQL, щоб зміни в конфігурації набули чинності:
root@master# service mysqld restart

Якщо все пройшло успішно, команда "show master status " повинна показати приблизно наступне:
mysql@master> SHOW MASTER STATUS\G
File: mysql-bin.000003
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

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

Налаштування репліки

Вкажіть 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 = testdb

root@replica# service mysqld restart

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

Тут нам доведеться заблокувати БД для запису. Для цього можна або зупинити роботу додатків, або скористатися встановленням прапорця read_only на майстрі (увага: на користувачів з привілеєм SUPER цей прапорець не діє). Якщо у нас є таблиці MyISAM, зробимо також "flush tables":
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;

Подивимося стан майстра командою «show master status» і запам'ятаємо значення File і Position (після успішної блокування майстра вони не повинні змінюватися):
File: mysql-bin.000003
Position: 98

Робимо дамп БД, і після завершення операції знімаємо блокування майстра:
mysql@master> SET GLOBAL read_only = OFF;

Переносимо дамп на репліку та відновлюємо з нього дані.
Нарешті, запускаємо реплікацію командами "change master to" і "start slave" і подивимося, чи все пройшло добре:
mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.1.101 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000003 ", MASTER_LOG_POS = 98;
mysql@replica> start slave;

Значення MASTER_LOG_FILE і MASTER_LOG_POS ми беремо з майстра.

Подивимося, як йде реплікація командою "show slave status ":
mysql@replica> SHOW SLAVE STATUS\G

Стаття взята з хабра і перевірена на практиці.

зіткнувся з помилкою [ERROR] Failed to initialize the master info structure

вирішується: RESET SLAVE;

Друга проблема - (не створювалися таблиці InnoDB) вирішилася видаленням логів .. 0 ..01

Якщо потрібно виключити деякі таблиці з реплікації, вписуємо їх у конфіг:

replicate-wild-ignore-table=base.mw_words_positions
replicate-wild-ignore-table=base.mw_sotrudniki_log

Пропускати помилки:

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; мені не допомогло,

а ось додавання в my.cnf

slave-skip-errors= <код помилки або all>

вирішило проблему.

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.