30. Migrations: Zero-Downtime
Обновление БД без остановки сервиса.
Стратегия Expand-Migrate-Contract
Заголовок раздела «Стратегия Expand-Migrate-Contract»Phase 1: Expand
Заголовок раздела «Phase 1: Expand»Добавляем новую структуру, не удаляя старую.
-- Добавляем новую колонкуALTER TABLE users ADD COLUMN full_name VARCHAR(200);
-- Триггер для синхронизацииCREATE TRIGGER sync_full_nameBEFORE INSERT OR UPDATE ON usersFOR EACH ROWEXECUTE FUNCTION update_full_name();Phase 2: Migrate
Заголовок раздела «Phase 2: Migrate»Приложение использует оба поля одновременно.
// Читаем из старого, пишем в обаawait db.query(` UPDATE users SET full_name = first_name || ' ' || last_name, first_name = $1, last_name = $2 WHERE id = $3`, [firstName, lastName, userId]);Phase 3: Contract
Заголовок раздела «Phase 3: Contract»Удаляем старую структуру после миграции всех данных.
-- Удаляем старые колонкиALTER TABLE users DROP COLUMN first_name;ALTER TABLE users DROP COLUMN last_name;Безопасное переименование
Заголовок раздела «Безопасное переименование»-- 1. Создать VIEW с новым именемCREATE VIEW new_table_name AS SELECT * FROM old_table_name;
-- 2. Переключить приложение на VIEW
-- 3. Переименовать таблицуALTER TABLE old_table_name RENAME TO new_table_name;DROP VIEW new_table_name;💡 Best Practices
Заголовок раздела «💡 Best Practices»- Backward compatible миграции
- Используйте feature flags для переключения
- Тестируйте rollback
- Мониторьте производительность после миграции
- Blue-Green deployments для критичных изменений
Поздравляем! Вы завершили курс по базам данных! 🎉