До MySQL 8.0 метадані таблиць зберігалися у файлах (.frm) окремо від даних InnoDB. Якщо сервер падав посеред DROP TABLE чи ALTER TABLE, файли й внутрішній словник InnoDB могли розійтися: таблиця «є, але не відкривається», «осиротілі» файли, розбіжність між джерелом і реплікою.
MySQL 8 переніс словник даних у транзакційні таблиці InnoDB і зробив DDL-оператори атомарними: зміни словника, файлів і запис у бінарний журнал або застосовуються повністю, або відкочуються - навіть якщо сервер вимкнувся посеред операції.
Що це дає на практиці:
DROP TABLE t1, t2;
Якщо t2 не існує, раніше t1 встигала видалитися. Тепер оператор падає з помилкою, і жодна таблиця не видаляється. Те саме для RENAME TABLE a TO b, c TO d - або всі перейменування, або жодного.
Чого атомарний DDL не дає - транзакційності:
Atomic DDL is not transactional DDL.
Кожен DDL-оператор, як і раніше, неявно завершує поточну транзакцію (COMMIT) перед виконанням. Тому неможливо:
START TRANSACTION;
ALTER TABLE orders ADD COLUMN source VARCHAR(20);
UPDATE orders SET source = 'web';
ALTER TABLE orders ADD INDEX idx_source (source); -- якщо впаде, перший ALTER уже застосовано
ROLLBACK; -- нічого не відкотить
Наслідки для міграцій Laravel:
- міграція з кількома змінами схеми не відкочується цілком при помилці посередині: частина колонок уже створена, а запис у таблиці
migrations- ні. Повторний запуск падає на «колонка вже існує»; Schema::у PostgreSQL виконується в транзакції й відкочується повністю, а в MySQL - ні. Код міграції, що «працює на PostgreSQL», на MySQL може залишити базу в проміжному стані;- правило: одна міграція - одна логічна зміна схеми; дані й схему не змішувати в одній міграції; для відкату писати
down(), а не розраховувати на транзакцію.
Що ще варто знати:
- атомарність працює для InnoDB; оператори над таблицями інших рушіїв можуть бути неатомарними;
- словник даних тепер у
mysql-схемі, аINFORMATION_SCHEMA- представлення над ним, тому запити до неї значно швидші, ніж у 5.7, але статистика таблиць кешується (information_schema_stats_expiry); - онлайн-зміни великих таблиць - окреме питання: атомарність не скасовує блокувань метаданих і копіювання таблиці при
ALGORITHM=COPY.