如何将我的public模式复制到具有完整表结构、数据、函数、fk、pk 等的同一个数据库中。
我的 Postgres 版本是 8.4
PS 我需要复制模式而不是数据库
小智 26
在 pg_dump/pg_restore 本身中没有简单的方法可以做到这一点。如果您能够暂时删除数据库,您可以尝试以下操作。
Run Code Online (Sandbox Code Playgroud)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`
Run Code Online (Sandbox Code Playgroud)
或 exec() 命令。对于更改,您可以以相同的方式使用 sed。
这里还有 6 个字符
使用 pgAdmin,您可以执行以下操作。这是非常手动的,但可能是您所需要的。基于脚本的方法会更可取。如果您没有管理员访问权限并且您的数据库很大,则不确定这将如何工作,但在您本地计算机上仅有的开发数据库上应该可以正常工作。
右键单击要复制的架构名称,然后单击备份。(您可以比这更深入,并选择只备份结构而不是两者)。
为备份文件命名并选择一种格式。(我通常使用 Tar。)
单击备份。
右键单击您从中备份的架构,然后单击属性并将其临时重命名为其他名称。(例如temprename)
单击模式根并在对象浏览器中右键单击它,然后单击创建新模式并将模式命名为public。这将是您从备份复制到的架构。
右键单击第 5 步中的新架构public,然后单击恢复。从步骤 3 中的备份文件还原。
将新架构public重命名为不同的名称(例如newschema)。
将步骤 4 中的架构temprename更改重命名为原始名称。
你可以用
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 是唯一的方法。
扩展 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)
| 归档时间: |
|
| 查看次数: |
85297 次 |
| 最近记录: |