# GTID-реплікація MySQL: налаштування і зміна майстра

> GTID-реплікація MySQL: чим відрізняється від координат бінлогу, як налаштувати і перемкнути репліку на нового майстра без ручного пошуку позиції.

## Чим GTID відрізняється від класичної реплікації за координатами

У класичній схемі реплікації репліка запам'ятовує файл і позицію у бінлозі майстра, звідки продовжувати читання — це пара `MASTER_LOG_FILE` і `MASTER_LOG_POS`. Після зміни майстра ці координати доводиться шукати вручну, звіряючи логи, і помилка на пару байтів псує всю реплікацію.

GTID (Global Transaction Identifier) надає кожній транзакції унікальний ідентифікатор вигляду `server_uuid:номер`. Репліка зберігає набір уже застосованих GTID і під час перемикання сама обчислює, з якої транзакції продовжувати — без ручного пошуку файлу і позиції.

## Як увімкнути GTID на майстрі та репліках

Режим вмикається однаковими параметрами на всіх вузлах:

```
[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = /var/lib/mysql/binlog
server_id = 10
```

Параметр `enforce_gtid_consistency` забороняє конструкції, які не можна однозначно прив'язати до однієї транзакції — наприклад, змішування тимчасових і звичайних таблиць в одному запиті. Вмикати його потрібно до переведення реплікації на GTID, інакше сервер відмовиться запускатися з наявними проблемними запитами в логах.

## Налаштування репліки через MASTER\_AUTO\_POSITION

Замість файлу і позиції репліка вказує лише адресу майстра:

```
CHANGE MASTER TO
  MASTER_HOST='10.0.0.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='strong-pass',
  MASTER_AUTO_POSITION=1;

START SLAVE;
```

Прапорець `MASTER_AUTO_POSITION=1` каже серверу звірити набір GTID на репліці з набором на майстрі і запросити саме відсутні транзакції. Базові кроки налаштування користувача для реплікації та самого каналу описані у статті про [Master-Slave реплікацію](https://www.zevshost.net/uk/kb/mysql-replication-master-slave/).

## Перемикання на нового майстра без втрати позиції

Головна перевага GTID проявляється під час аварії майстра. Порядок дій:

| Крок | Дія |
| --- | --- |
| 1 | Зупинити запис на старому майстрі або підтвердити його недоступність |
| 2 | Обрати репліку з найповнішим набором GTID через SHOW SLAVE STATUS |
| 3 | Виконати CHANGE MASTER TO з адресою нової репліки-майстра |
| 4 | Запустити START SLAVE на інших репліках |
| 5 | Перевірити Seconds\_Behind\_Master і Executed\_Gtid\_Set на кожному вузлі |

Оскільки GTID глобально унікальний для всього кластера, репліки не запросять повторно вже застосовані транзакції і не втратять події між старим і новим майстром, якщо вони перемикалися на актуальну копію.

## Діагностика: розрив у наборі GTID

Найчастіша проблема — errant transaction, транзакція, виконана прямо на репліці в обхід майстра. Вона псує набір GTID і зупиняє реплікацію з помилкою дубліката. Знайти її допомагає порівняння множин:

```
SELECT GTID_SUBTRACT(
  @@GLOBAL.gtid_executed,
  'source-uuid:1-500'
) AS extra_transactions;
```

Якщо результат не порожній, на репліці є транзакції, яких немає на майстрі, — їх потрібно або пропустити через `GTID_NEXT`, або повністю переналаштувати репліку зі свіжого бекапу.

## Часті помилки під час переходу на GTID

Перед увімкненням GTID на проді варто перевірити:

- На всіх вузлах [binlog](https://www.zevshost.net/uk/kb/mysql-binlog-point-in-time/) у форматі ROW, а не STATEMENT.
- server\_id унікальний для кожного вузла кластера, включно з резервними репліками.
- Немає прямих записів на репліки в обхід майстра, які створюють errant transactions.
- Перевірена процедура перемикання на тестовому стенді, а не лише в теорії.

## Чек-лист перед введенням GTID у продакшен

Фінальна перевірка перед перемиканням робочої реплікації:

- gtid\_mode = ON і enforce\_gtid\_consistency = ON на майстрі та всіх репліках.
- CHANGE MASTER TO використовує MASTER\_AUTO\_POSITION=1 всюди.
- Executed\_Gtid\_Set звірений між вузлами і не показує розбіжностей.
- Є свіжий повний бекап на випадок, якщо перемикання піде не за планом.
- Моніторинг Seconds\_Behind\_Master налаштований і надсилає алерт при відставанні.

---

Джерело: https://www.zevshost.net/uk/kb/mysql-gtid-replikaciya/
