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


26

如何将public架构完整的表结构,数据,函数,fk,pk等复制到同一数据库中。
我的Postgres版本是8.4
PS,我需要复制架构 NOT数据库


您是否有更多架构,还是只有public
a_horse_with_no_name 2012年

我有公共和演示模式。我需要复制演示来创建模拟帐户...

这将是一件方便的事。
Kuberchaun 2012年

Answers:


19

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

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

如何通过PHP访问pg_dump和pg_restore?

这取决于您在哪里运行数据库。您可以从服务器上的Shell访问pg_dump和pg_restore。如果您没有外壳程序访问权限,则可以尝试使用PHPs shell_exec,否则,您需要研究一种备用备份方法,也许使用PostgreSQL GUI工具

1
+1这是迄今为止最明智的解决方案。Shell命令会是这个样子(多在手动pg_dump -n my_schema -f '/path/to/file.pgsql' my_db。在中,postgres通过无密码peer授权作为超级用户()最容易pg_haba.conf。重命名原始架构后还原psql my_db -f '/path/to/file.pgsql'。如果你有一个简单的SQL转储,你就不会需要pg_restore
Erwin Brandstetter,2012年

有一个简单的方法,请参阅我的答案。pg_dump支持-n开关来选择一个模式。然后只需在转储中编辑架构名称并重新加载即可。
Scott Marlowe

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感到困惑,则可以使用任一back tic

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

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

这里还有6个字符


1
重命名架构并加载备份的原始架构更安全,尤其是在架构名称可能显示为内容(例如public)的情况下。
artm 2015年

7

使用pgAdmin,您可以执行以下操作。这是相当手工的,但可能只是您所需要的。基于脚本的方法将更为可取。不知道如果没有管理员访问权限并且数据库很大,但是在本地计算机上拥有的开发数据库上也可以正常工作,这种方法的效果如何。

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

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

  3. 单击备份。

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

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

  6. 右键单击第5步中的新架构公共。然后单击“还原”。在步骤3中从备份文件还原。

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

  8. 将模式temprename的更改从步骤4 重命名回原始名称。


在第5步中创建的新模式必须与您备份的模式名称相同,否则pgAdmin将不会恢复任何内容。
Cao Minh Tu

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。
Erwin Brandstetter,2012年

克隆单个模式需要大量工作。转储模式,在转储中重命名并重新加载要快得多。
Scott Marlowe'1

@ScottMarlowe:取决于最大的架构。如果最大的是掉落的之一,那么我同意。
a_horse_with_no_name 2012年

2

扩展到user1113185 answer,这是使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.