PostgreSQL:如何在同一数据库中创建数据库模式的完整副本?

sig*_*gra 28 postgresql

如何将我的public模式复制到具有完整表结构、数据、函数、fk、pk 等的同一个数据库中。
我的 Postgres 版本是 8.4
PS 我需要复制模式而不是数据库

小智 26

在 pg_dump/pg_restore 本身中没有简单的方法可以做到这一点。如果您能够暂时删除数据库,您可以尝试以下操作。

  1. 使用pg_dump转储您的公共模式
  2. 运行“ALTER SCHEMA public RENAME TO public_copy”
  3. 使用pg_restore从步骤 1 恢复公共模式的转储

  • 简单地重命名架构不会更新函数内的引用:https://gist.github.com/pschultz/5387172。如果您的搜索和替换正确,则替换名称是转储更可靠。 (2认同)

Sco*_*owe 9

pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用 php 然后使用 back tic

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`
Run Code Online (Sandbox Code Playgroud)

或 exec() 命令。对于更改,您可以以相同的方式使用 sed。

这里还有 6 个字符

  • 重命名模式并加载备份的原始模式会更安全,特别是当模式名称可能显示为内容时(例如“public”)。 (2认同)

Kub*_*aun 7

使用 pgAdmin,您可以执行以下操作。这是非常手动的,但可能是您所需要的。基于脚本的方法会更可取。如果您没有管理员访问权限并且您的数据库很大,则不确定这将如何工作,但在您本地计算机上仅有的开发数据库上应该可以正常工作。

  1. 右键单击要复制的架构名称,然后单击备份。(您可以比这更深入,并选择只备份结构而不是两者)。

  2. 为备份文件命名并选择一种格式。(我通常使用 Tar。)

  3. 单击备份。

  4. 右键单击您从中备份的架构,然后单击属性并将其临时重命名为其他名称。(例如temprename

  5. 单击模式根并在对象浏览器中右键单击它,然后单击创建新模式并将模式命名为public。这将是您从备份复制到的架构。

  6. 右键单击第 5 步中的新架构public,然后单击恢复。从步骤 3 中的备份文件还原。

  7. 将新架构public重命名为不同的名称(例如newschema)。

  8. 将步骤 4 中的架构temprename更改重命名为原始名称。


a_h*_*ame 5

你可以用

CREATE DATABASE new_db TEMPLATE = old_db;
Run Code Online (Sandbox Code Playgroud)

然后删除您不需要的所有模式:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是必须在创建副本之前确定与 old_db 的所有连接(因此运行该CREATE DATABASE语句的进程必须连接到例如 template1)

如果这不是一个选项,pg_dump/pg_restore 是唯一的方法。


dwe*_*lle 5

扩展 user1113185答案,这是使用 psql/pg_dump 的完整工作流程。

以下导出 的所有对象old_schema并将它们导入到数据库中的新new_schema模式,如:userdbname

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
Run Code Online (Sandbox Code Playgroud)