Перейти к содержимому

30. Migrations: Zero-Downtime

Обновление БД без остановки сервиса.

Добавляем новую структуру, не удаляя старую.

-- Добавляем новую колонку
ALTER TABLE users ADD COLUMN full_name VARCHAR(200);
-- Триггер для синхронизации
CREATE TRIGGER sync_full_name
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_full_name();

Приложение использует оба поля одновременно.

// Читаем из старого, пишем в оба
await db.query(`
UPDATE users
SET full_name = first_name || ' ' || last_name,
first_name = $1,
last_name = $2
WHERE id = $3
`, [firstName, lastName, userId]);

Удаляем старую структуру после миграции всех данных.

-- Удаляем старые колонки
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;
  1. Backward compatible миграции
  2. Используйте feature flags для переключения
  3. Тестируйте rollback
  4. Мониторьте производительность после миграции
  5. Blue-Green deployments для критичных изменений

Поздравляем! Вы завершили курс по базам данных! 🎉