Рекомендации по изменению схемы и миграции данных в базу данных без простоя?

Как вы вносите изменения схемы в базу данных без простоя?

Например, скажем, у меня есть база данных PostgreSQL со таблицей, включающей различные пользовательские данные, такие как адреса электронной почты и т. д., все связанные с конкретными пользователями. Если бы я хотел переместить адреса электронной почты в новую выделенную таблицу, мне пришлось бы изменить схему, а затем перенести данные электронной почты в новую таблицу. Как это можно сделать без остановки записи в исходную таблицу? Разумеется, в то время как данные записываются со старой таблицы в новую, новые данные будут по-прежнему записываться в старую таблицу и будут упущены, правильно?

Я предполагаю, что эта проблема возникает довольно часто, но я не могу найти стандартное решение для ее решения.

Эта статья касается проблемы, но я действительно не понять шаг 3. Он говорит, чтобы писать в обе таблицы, а затем перенести старые данные из первой таблицы в новую. Как убедиться, что вы переносите только старые данные?

(Я использую PostgreSQL на Heroku .)

38 голосов | спросил Dan Leary 19 Jam1000000amThu, 19 Jan 2012 02:44:07 +040012 2012, 02:44:07

1 ответ


22

У вас уже есть свой ответ:

  1. Создать новую структуру параллельно
  2. Начать писать в обе структуры
  3. Перенести старые данные в новую структуру
  4. Только писать и читать новую структуру
  5. Удалить старые столбцы

Что касается шага 3 , используйте что-то вроде этого (в одной транзакции):

Вставьте то, чего еще нет:

INSERT INTO new_tbl (old_id, data)
SELECT old_id, data
FROM   old_tbl
WHERE  NOT EXISTS (SELECT * FROM new_tbl WHERE new_tbl.old_id = old_tbl.old_id);

Обновите то, что изменилось за это время:

UPDATE new_tbl
SET    data  = old.data
USING  old_tbl
WHERE  new_tbl.old_id = old_tbl.old_id
AND    new_tbl.data IS DISTINCT FROM old_tbl.data;

Новые данные не будут затронуты, потому что они идентичны в обоих местах.

ответил Erwin Brandstetter 19 Jam1000000amThu, 19 Jan 2012 03:57:35 +040012 2012, 03:57:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132