@masterthemac

Можно ли перенести файл с партицией из таблицы в одной БД Postgresql в другую БД?

Дано: есть два сервера с двумя разными БД Postgresql, не реплики. Например БД1 и БД2.
В каждой из БД есть партиционированная таблица T, на обеих БД идентичная по структуре.
Вопрос - можно ли выполнить detach партиции в таблице T на БД1, потом средствами OS перенести файл (именно файл) с этой партицией на сервер с БД2 и импортировать файл с партицией в БД2, после чего приаттачить к T но уже в это БД2.

Суть идеи, которая была у автора - ускорить процесс переноса данных, без дампа и импорта партиций.

Прошу знатоков Postgresql сказать, выполнима ли принципиально идея ниже?
Если невыполнима, то что этому мешает?
Может быть можно "тыкнуть" в какой-то faq на эту тему.
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 2
fzfx
@fzfx
18,5 дм
нет, нельзя.
этому мешает то, что если вы выполните перечисленные шаги, то это ничего не даст в лучшем случае, и "уронит" обе БД в худшем (и наиболее вероятном).
проблемы начинаются с этого шага: "потом средствами OS перенести файл (именно файл)". во-первых, партиция - это не файл, а набор файлов в общем случае (файлов может быть более одного). во-вторых, файлы таблицы-партиции не самодостаточны, в частности, описание самой таблицы-партиции находится в pg_catalog вместе с другими таблицами и неотделимо от них на уровне работы с файловой системой.
так что вам надо смотреть в сторону тех способов миграции данных, которые имеются в документации: снятия и восстановления дампа таблицы-партиции, либо же написания своего кода по миграции данных.
Ответ написан
Комментировать
AshBlade
@AshBlade
Просто хочу быть счастливым
Нельзя это сделать.
Причин много:
1. Все данные хранятся не в 1 файле, а в нескольких
2. В файлах хранятся не вот уже готовые данные, а множество различных кортежей - для MVCC. А без понимания ID транзакции (которая в другой БД будет иной) они бессмысленны. То есть, переложив физически файлы ты получишь белеберду
3. В Postgres нет возможности приаттачить файлы. Есть возможность INSERT/COPY, сдампить, но файлы напрямую нельзя. (нет такой опции в Attach)
4. В файле хранятся не сериализованные в независимом формате данные, а (грубо говоря) структуры C. Как они располагаются зависит от endianess, компилятора и т.д.
5. Даже если ты это все сделаешь, то не факт, что различные OID сойдутся - т.е. таблица будет хранить OID, которого в другой БД не существует

Если хочешь ускорить процесс, но используй pg_dump с ключом -fd (специальный формат), а в pg_restore -j NJOBS - распараллеливание (NJOBS - кол-во воркеров).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы