PostgreSQL: как создать полную копию схемы базы данных в той же базе данных?


26

Как я могу скопировать мою publicсхему в ту же базу данных с полной структурой таблицы, данными, функциями, fk, pk и т. Д.
Моя версия Postgres - 8.4
PS Мне нужно скопировать схему, а не базу данных.


У вас есть больше схем или только public?
a_horse_with_no_name

У меня есть публичные и демонстрационные схемы. И мне нужно скопировать демо для создания демо-счета ...

Это было бы удобно, чтобы иметь возможность делать.
Куберчаун

Ответы:


19

Нет простого способа сделать это в самой pg_dump / pg_restore. Вы можете попробовать следующее, если вы можете временно удалить базу данных.

  1. Возьмите дамп вашей публичной схемы, используя pg_dump
  2. запустить "ALTER SCHEMA public RENAME TO public_copy"
  3. Восстановите ваш дамп общедоступной схемы, начиная с шага 1, используя pg_restore

Как я могу получить доступ к pg_dump и pg_restore через PHP?

Это зависит от того, где вы работаете с базой данных. Вы можете получить доступ к pg_dump и pg_restore из оболочки на вашем сервере. Если у вас нет доступа к оболочке, вы можете попробовать использовать PHPs shell_exec , в противном случае вам нужно будет найти альтернативный метод резервного копирования, возможно, с помощью PostgreSQL GUI Tool

1
+1 Это пока самое умное решение. Команда Shell будет выглядеть примерно так ( больше в руководстве ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Проще всего как superuser ( postgres) с peerавторизацией без pw в pg_haba.conf. Восстановление после переименования оригинальной схемы: psql my_db -f '/path/to/file.pgsql'. Если у вас простой дамп SQL, он вам не нужен pg_restore.
Эрвин Брандштеттер

Есть простой способ, см. Мой ответ. pg_dump поддерживает ключ -n для выбора схемы. Затем просто отредактируйте имя схемы в дампе и перезагрузите.
Скотт Марлоу

2
Простое переименование схемы не приведет к обновлению ссылок внутри функций: gist.github.com/pschultz/5387172 . Замена имени дампа намного надежнее, если вы правильно выполнили поиск и замену.
Питер

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Если вы застряли с php, используйте тики

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

или команда exec (). Для изменения вы можете использовать sed таким же образом.

Вот еще 6 символов


1
безопаснее переименовать схему и загрузить обратно резервную копию исходной схемы, особенно когда имя схемы может отображаться как содержимое (например public).
artm

7

С помощью pgAdmin вы можете сделать следующее. Это довольно руководство, но может быть все, что вам нужно. Подход на основе сценариев был бы гораздо более желательным. Не уверен, насколько хорошо это будет работать, если у вас нет прав администратора, и если ваша база данных велика, но она должна прекрасно работать с базой данных разработки, которая у вас есть только на вашем локальном компьютере.

  1. Щелкните правой кнопкой мыши имя схемы, которую вы хотите скопировать, и выберите Резервное копирование. (Вы можете пойти глубже, чем это и выбрать просто сделать резервную копию структуры вместо обоих).

  2. Дайте файлу резервной копии имя, а также выберите формат. (Я обычно использую Tar.)

  3. Нажмите Резервное копирование.

  4. Щелкните правой кнопкой мыши схему, из которой вы создали резервную копию, выберите свойства и временно переименуйте ее во что-нибудь другое. (например, temprename )

  5. Щелкните корневой каталог схем и щелкните его правой кнопкой мыши в браузере объектов, затем нажмите « Создать новую схему» и присвойте этой схеме имя public . Это будет схема, в которую вы копируете свою резервную копию.

  6. Щелкните правой кнопкой мыши на новой общедоступной схеме, начиная с шага 5., и нажмите "Восстановить" Восстановите файл резервной копии на шаге 3.

  7. Переименуйте новую публичную схему под другим именем (например, newschema ).

  8. Переименуйте схему с изменением временного имени с шага 4 обратно на исходное имя.


Новая схема, созданная на шаге 5, должна иметь то же имя, что и схема, резервная копия которой вы создали, иначе pgAdmin ничего не восстановит.
Цао Минь Ту

5

Вы могли бы использовать

CREATE DATABASE new_db TEMPLATE = old_db;

Затем отбросьте все схемы, которые вам не нужны:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Единственный недостаток - все подключения к old_db должны быть определены до того, как вы сможете создать копию (поэтому процесс, выполняющий CREATE DATABASEинструкцию, должен подключаться, например, к template1)

Если это не вариант, pg_dump / pg_restore - единственный способ сделать это.


1
Прежде чем задать этот вопрос, я использовал похожий метод клонирования базы данных. Но это тратит много времени, и я думаю, что клонирование только схемы происходит гораздо быстрее ...

@sigra: метод клонирования a_horse является самым быстрым из доступных для баз данных, поскольку реальные файлы можно просто скопировать, что экономит много накладных расходов. Я сомневаюсь, что дамп и перезагрузка схемы будут быстрее, если схема не является лишь небольшой частью всей базы данных. Таким образом, +1 за этот ответ, даже если он не отвечает на фактически заданный вопрос.
Эрвин Брандштеттер

Это большая работа, чтобы клонировать одну схему. выгрузить схему, переименовать ее в дамп и перезагрузить гораздо быстрее.
Скотт Марлоу

@ScottMarlowe: зависит от того, какая схема является самой большой. Если самый большой - один из отброшенных, тогда да, я согласен.
a_horse_with_no_name

2

в продолжение ответа user1113185 , вот полный рабочий процесс с использованием psql / pg_dump.

Следующее экспортирует все объекты old_schemaи импортирует их в новую new_schemaсхему, как userв dbnameбазе данных:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.