Звичайна репліка застосовує зміни майже миттєво - разом із помилками. DROP TABLE orders чи UPDATE users SET email = ... без WHERE за мілісекунди стає катастрофою і на всіх репліках.
Відкладена репліка навмисно застосовує зміни із затримкою:
STOP REPLICA;
CHANGE REPLICATION SOURCE TO SOURCE_DELAY = 3600; -- секунди
START REPLICA;
Репліка отримує події одразу (вони зберігаються в її журналі ретрансляції), але застосовує кожну транзакцію не раніше ніж через годину після коміту на джерелі.
Сценарій порятунку. О 14:32 хтось виконав DROP TABLE orders. Відкладена репліка застосувала дані лише до 13:32.
- Негайно зупинити застосування на відкладеній репліці, поки вона не дійшла до 14:32:
STOP REPLICA SQL_THREAD;
- Знайти в бінарному журналі позицію чи GTID шкідливої транзакції.
- Довести репліку до моменту перед аварією:
START REPLICA SQL_THREAD UNTIL SQL_BEFORE_GTIDS = '3e11fa47-...:98765';
-- або UNTIL SOURCE_LOG_FILE = 'binlog.000057', SOURCE_LOG_POS = 48211337
- Тепер репліка містить стан бази за мить до
DROP. Далі:- вивантажити звідти таблицю
ordersі повернути на джерело (а зміни, що відбулися після 14:32, у видаленій таблиці не існують - тож втрачено лише нові замовлення за час аварії); - або, якщо пошкоджено багато, підвищити відкладену репліку до джерела, пропустивши шкідливу транзакцію.
- вивантажити звідти таблицю
Порівняно з відновленням з бекапу: нічний бекап + програвання журналів для великої бази - години. Відкладена репліка вже містить майже все потрібне, лишається догнати хвилини.
Як обрати затримку: вона має бути більшою за час, за який ви помітите проблему й зреагуєте. Година - типовий вибір, для систем без чергових - більше.
Що треба знати:
- відкладена репліка не підходить для читання застосунком і для автоматичного перемикання при відмові джерела - її дані застарілі за визначенням. Інструменти перемикання треба налаштувати, щоб вони її ігнорували;
SHOW REPLICA STATUSпоказуєSQL_DelayіSQL_Remaining_Delay, а затримка в моніторингу виглядатиме як постійне відставання - для цієї репліки сповіщення налаштовують окремо;- вона не замінює бекапи: якщо помилку помітили через дві години при затримці в одну, вона вже не допоможе.