удалить табличные пространства из pg_dump - PullRequest
1 голос
/ 27 февраля 2012

Я пытаюсь написать сценарий для импорта схемы базы данных с удаленного компьютера, который принимает только подключения ssh к локальному.

Мне удалось сделать все, кроме того, чтобы сохранить ту же кодировку, что и в удаленной базе данных.

Я обнаружил, что в решении используется pg_dump с -C (create), и таким образом я смогу создать базу данных с той же кодировкой, но я столкнулся с проблемой ... в удаленной базе данных есть табличное пространство и я не хочу его импортировать.

Я знаю, что в последних версиях psql уже есть аргумент no-tablespace ... но мне повезло, мне не разрешено обновлять версию postgres.

Может кто-нибудь сказать мне способ удалить все вхождения табличного пространства в дампе sql? как с sed или что-то.

Большое спасибо!

1 Ответ

4 голосов
/ 27 февраля 2012

Я использовал для переключения табличных пространств между установками, пропуская pg_dump через sed, где я изменил предложение TABLESPACE.

Вы также можете просто удалить его и дополнительно удалить CREATE TABLESPACE .. из файла дампа любым редактором, и вы можете загрузить его в другой кластер БД.

Я давно перешел на более новые версии, где я могу использовать опцию --no-tablespaces. В зависимости от вашей настройки, команда оболочки может выглядеть примерно так в Linux - от всей души, только тестируемый краткий:

pgdump -h 123.456.7.89 -p 5432 mydb \
| sed \
 -e' /^CREATE TABLESPACE /  d' \
 -e 's/ *TABLESPACE .*;/;/' \
 -e 's/SET default_tablespace = .*;/SET default_tablespace = '';/'
| psql -p5432 mylocaldb
  • -e' /^CREATE TABLESPACE / d' ... удалить строки, начинающиеся с "CREATE TABLESPACE".

  • -e 's/ *TABLESPACE .*;/;/' ... обрезать предложение tablespace (всегда в конце строки в выводе pg_dump) из операторов CREATE TABLE или CREATE INDEX.

  • -e "s/SET default_tablespace = .*;/SET default_tablespace = '';" .. покончить с любым другим табличным пространством по умолчанию, кроме пустой строки - которое обозначает табличное пространство по умолчанию текущего БД. Обратите внимание на использование двойной кавычки ", поэтому я могу легко вводить одинарные кавычки '.

Если вы знаете название используемого табличного пространства, вы можете сузить его. Существует теоретическая возможность, что строка данных может начинаться как один из поисковых терминов. Впрочем, я никогда не сталкивался с проблемами.

Проверьте страницу, подобную этой для получения дополнительной информации о sed.

...