Як дублювати величезну таблицю postgres?


29

У мене величезна таблиця постгресів (10 ГБ даних - 160 М записів). Таблиця є статичною і на ній не виконуються операції запису. Я хочу скопіювати його, виконати запис, перевстановити його, а потім однією швидкою транзакцією видалити стару та перейменувати нову на оригінальну назву.

Який найшвидший спосіб дублювати такий величезний стіл?

Відповіді:


55

Зазвичай найшвидший спосіб копіювання таблиці - це просто:

CREATE TABLE table2 AS SELECT * FROM table1;

Паралельні INSERT можуть бути швидшими, але лише з дуже швидкою підсистемою диска (коли дані перемежовуються на багатьох дисках). Інакше це буде повільніше.

Після завершення зміни table2він може взяти нове ім'я за допомогою:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

DROP TABLEКоманда повинна монопольна блокування, яка впливає одночасно читач таким чином , ви можете захотіти , щоб передбачити:

  • DROP буде чекати, коли будь-яке очікування, прочитане на столі, від інших транзакцій закінчиться.
  • Будь-яка нова транзакція, яка намагається прочитати цю таблицю тим часом, буде ставити її в очікуванні, а потім вийти з ладу, оскільки оригіналу table1більше не існує. Помилка виглядала б як "не вдалося відкрити зв'язок із OID oid "

Щоб уникнути другого випуску, ви можете перейменувати table1 його old_table1 замість того, щоб викинути його, а потім викинути його лише пізніше за межами транзакції, коли ці читачі будуть виконані з ним. Отже послідовність, що викладена вище, стала б:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
Спасибі людина. Це саме те пояснення, яке я шукав. Знову дякую!
Мілован Зогович

Якщо в таблиці2 визначені індекси, чи працюватимуть вони, як тільки таблиця буде перейменована?
BamaPookie

1
@BamaPookie ознайомтеся з цим, щоб отримати повну схему, включаючи індекси, обмеження та параметри за замовчуванням wiki.postgresql.org/wiki/Clone_schema
Тимофій Вогель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.