Giải pháp của @ Tometzky không hoàn toàn đúng, ít nhất là với pg_dump
của 9.2 . Nó sẽ tạo bảng trong lược đồ mới, nhưng pg_dump
schema-đủ điều kiện cho ALTER TABLE ... OWNER TO
các câu lệnh, vì vậy những câu lệnh đó sẽ không thành công:
postgres=# CREATE DATABASE demo;
\cCREATE DATABASE
postgres=# \c demo
You are now connected to database "demo" as user "postgres".
demo=# CREATE TABLE public.test ( dummy text );
CREATE TABLE
demo=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | test | table | postgres
(1 row)
demo=# \q
$
$ pg_dump -U postgres -f demo.sql demo
$ sed -i 's/^SET search_path = public, pg_catalog;$/SET search_path = testschema, pg_catalog;/' demo.sql
$ grep testschema demo.sql
SET search_path = testschema, pg_catalog;
$ dropdb -U postgres demo
$ createdb -U postgres demo
$ psql -U postgres -c 'CREATE SCHEMA testschema;' demo
CREATE SCHEMA
$ psql -U postgres -f demo.sql -v ON_ERROR_STOP=1 -v QUIET=1 demo
psql:demo.sql:40: ERROR: relation "public.test" does not exist
$ psql demo
demo=> \d testschema.test
Table "testschema.test"
Column | Type | Modifiers
--------+------+-----------
dummy | text |
Bạn cũng sẽ cần phải chỉnh sửa kết xuất để xóa tiêu chuẩn giản đồ trên public.test
hoặc thay đổi nó thành tên lược đồ mới. sed
là một công cụ hữu ích cho việc này.
Tôi có thể thề rằng cách chính xác để làm điều này là với pg_dump -Fc -n public -f dump.dbbackup
rồi đến pg_restore
vào một lược đồ mới, nhưng tôi dường như không thể tìm ra chính xác cách thức ngay bây giờ.
Cập nhật:Không, có vẻ như sed
là đặt cược tốt nhất của bạn. Xem Tôi muốn khôi phục cơ sở dữ liệu bằng một giản đồ khác