Могу ли я восстановить только одну схему из pg_dump всей базы данных? - PullRequest
5 голосов
/ 09 июня 2009

У меня есть резервные копии моей базы данных postgres - всего экземпляра базы данных в одной ночной резервной копии. Можно ли восстановить только одну базу данных из этой резервной копии? Или, если я хочу получить доступ к отдельным базам данных (для миграции или восстановления), нужно ли мне изменить схему резервного копирования базы данных для выполнения отдельных дампов?

Ответы [ 2 ]

13 голосов
/ 11 июня 2009

Вы можете получить доступ к отдельным базам данных из полного дампа кластера баз данных в текстовом формате (pg_dumpall), используя некоторую обработку текста, подобную этой:

awk '/^\\connect database_name/ {flag=1;print;next}
     /^\\connect/ {flag=0}
     flag { print }' \
   < all_databases.sql \
   > database_name.sql

Это получит из файла pg_dumpall все, что находится между "\connect database_name" и следующим "\connect". Но это не очень эффективно.

Но я бы порекомендовал выводить каждую базу данных отдельно, как это:

# Dumping global data (for example roles)
pg_dumpall -g > /var/lib/pgsql/backups/globals.sql

#Dumping indidual databases in tar (uncompressed binary) format
for dbname in
  `
    psql -qXtc "
      select datname from pg_catalog.pg_database
      where datname<>'template0'" template1
  `
do
  pg_dump -b -F t "$dbname" > "/var/lib/pgsql/backups/$dbname.dump"
done

Я предполагаю, что вы имеете в виду "Могу ли я восстановить только одну базу данных из pg_dumpall всего кластера баз данных?"

3 голосов
/ 09 июня 2009

Да, если ваша резервная копия - "архив, созданный pg_dump в одном из форматов, не содержащих текст." - используйте параметр "--schema =" для pg_restore.

С другой стороны, я не уверен, что вы используете правильную терминологию здесь - вы называете кластер БД «экземпляром всей базы данных»; в объяснении вы спрашиваете о «базе данных», но в заголовке вы написали «схема» и т. д.

Редактировать: Теперь, после некоторых размышлений, я полагаю, у вас есть резервная копия кластера, созданная с помощью "pg_dumpall" . «pg_dumpall» создает только обычные текстовые (SQL-команды) резервные копии. В этом случае невозможно восстановить только одну базу данных (или только одну схему из базы данных).

Тогда да, вам нужно изменить процедуру резервного копирования для резервного копирования отдельных баз данных, используя не-текстовый формат (рекомендуется --format = custom).

На самом деле процедура резервного копирования, которую я использую на своих серверах БД, делает именно это.

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