в другую db.table, с учетом того, что эти бд находятся в одном кластере?
pg_dump, fdw, dblink. Сильно других опцый нет.
Вопрос. А нельзя ли это сделать запросами? Типо INSERT INTO db2.table2 ( SELECT FROM db1.table1) CONCURENTLY?
Есть проблема с COPY. Если делать COPY, то команда будет падать, когда столкнется с похожими id-шниками. Т.е. во второй таблице есть часть данных(свеженькие), которые присутствуют в обеих таблицах.
Как я люблю, когда ТЗ обретает новые подробности в процессе решения задачи. Какие ещё неозвученные нюансы существуют? 🤷♂️🤦♂️
Сорян, про это забыл сказать. Что во второую таблицу переодически добавляются новые данные, которые также добавляются в первую. Т.е. по идее, в первой таблице есть несколько миллионов строк, которые отсутствуют во второй. Т.к. добавлены раньше. И, получается, что надо как-то между базами данных выделить эти несколько миллионов запписей. SELECT * FROM t1 JOIN t2 ON t1.id != t2.id; И это дело скопировать с помощью COPY в файл, например. Затем закинуть во вторую таблицу с помощью COPY. Но есть одно НО! Данных дофига. И, если сделать COPY, я боюсь это заблокирует таблицу t1 и положит все. Т.е. хотелось бы это сделать конкурентно.
Ну, можно сперва через copy скопировать одну таблицу в другую БД целиком, положить рядом со второй под другим именем. А затем обычными запросами делать с данными все, что надо. Тут же перенос данных и их обработка - это независимые этапы. Декомпозируйте.
Скажите плз, а COPY блокирует таблицу? Или берет самую не приоритетную блокировку?
А в чем проблема блокировок? У вас переносимая таблица ещё и обновляться продолжает? А что вы будете делать с дельтой по данным, накопленным с момента выгрузки? Вы уже ответили на этот вопрос? Это ещё один нюанс?
Возможно я плохо объяснил. Смотри есть 2 таблицы в разных бд. В обще таблицы сыпятся одни и те же данные, но первая таблица появилась раньше и у нее в начале есть несколько лямов записей, которые отсутствуют во второй таблице, соответстввенно. Ведь вторая появилась позже и в нее данные стали добавляться позже. Т.е. допустим с записи id=99000000 обе таблицы идентичны и дельты не может быть, т.к. даныне в обе добавляются одни и те же. Но первые 99000000 записей присутствуют в таблице t1, но отсутствуют в таблице t2/
Тогда в той бд, где записи есть, создайте через create table as select таблицу с выгрузкой нужных записей, и перенесите ее в целевую бд.
Благодарю, подумаю...
Через fdw -- можно. Да и через dblink в общем тожэ. Вы, кстати, точно базы и схемы не путаете? А то db2.table2 -- это синтаксис для обращения к таблицэ table2 в схеме db2, совсем другое дело.
Вообще, COPY блокирует только DDL (изменение схемы таблицы) и вымарывание старых туплов вакуумом (зато вот это -- во всей базе).
Здорово! Спасибо!
Обсуждают сегодня