Как я могу скопировать мою public
схему в ту же базу данных с полной структурой таблицы, данными, функциями, fk, pk и т. Д.
Моя версия Postgres - 8.4
PS Мне нужно скопировать схему, а не базу данных.
Как я могу скопировать мою public
схему в ту же базу данных с полной структурой таблицы, данными, функциями, fk, pk и т. Д.
Моя версия Postgres - 8.4
PS Мне нужно скопировать схему, а не базу данных.
Ответы:
Нет простого способа сделать это в самой pg_dump / pg_restore. Вы можете попробовать следующее, если вы можете временно удалить базу данных.
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 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 символов
public
).
С помощью pgAdmin вы можете сделать следующее. Это довольно руководство, но может быть все, что вам нужно. Подход на основе сценариев был бы гораздо более желательным. Не уверен, насколько хорошо это будет работать, если у вас нет прав администратора, и если ваша база данных велика, но она должна прекрасно работать с базой данных разработки, которая у вас есть только на вашем локальном компьютере.
Щелкните правой кнопкой мыши имя схемы, которую вы хотите скопировать, и выберите Резервное копирование. (Вы можете пойти глубже, чем это и выбрать просто сделать резервную копию структуры вместо обоих).
Дайте файлу резервной копии имя, а также выберите формат. (Я обычно использую Tar.)
Нажмите Резервное копирование.
Щелкните правой кнопкой мыши схему, из которой вы создали резервную копию, выберите свойства и временно переименуйте ее во что-нибудь другое. (например, temprename )
Щелкните корневой каталог схем и щелкните его правой кнопкой мыши в браузере объектов, затем нажмите « Создать новую схему» и присвойте этой схеме имя public . Это будет схема, в которую вы копируете свою резервную копию.
Щелкните правой кнопкой мыши на новой общедоступной схеме, начиная с шага 5., и нажмите "Восстановить" Восстановите файл резервной копии на шаге 3.
Переименуйте новую публичную схему под другим именем (например, newschema ).
Переименуйте схему с изменением временного имени с шага 4 обратно на исходное имя.
Вы могли бы использовать
CREATE DATABASE new_db TEMPLATE = old_db;
Затем отбросьте все схемы, которые вам не нужны:
DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;
Единственный недостаток - все подключения к old_db должны быть определены до того, как вы сможете создать копию (поэтому процесс, выполняющий CREATE DATABASE
инструкцию, должен подключаться, например, к template1)
Если это не вариант, pg_dump / pg_restore - единственный способ сделать это.
в продолжение ответа 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
public
?