Làm cách nào tôi có thể sao chép public
lược đồ của mình vào cùng một cơ sở dữ liệu với cấu trúc bảng đầy đủ, dữ liệu, hàm, fk, pk, v.v.
Phiên bản Postgres của tôi là 8.4
PS Tôi cần sao chép lược đồ KHÔNG phải cơ sở dữ liệu
Làm cách nào tôi có thể sao chép public
lược đồ của mình vào cùng một cơ sở dữ liệu với cấu trúc bảng đầy đủ, dữ liệu, hàm, fk, pk, v.v.
Phiên bản Postgres của tôi là 8.4
PS Tôi cần sao chép lược đồ KHÔNG phải cơ sở dữ liệu
Câu trả lời:
Không có cách nào đơn giản để làm điều này trong chính pg_dump / pg_restore. Bạn có thể thử cách sau nếu bạn có thể xóa cơ sở dữ liệu tạm thời.
pg_dump -n my_schema -f '/path/to/file.pgsql' my_db
. Dễ nhất là superuser ( postgres
) với peer
ủy quyền ít pw trong pg_haba.conf
. Khôi phục sau khi bạn đã đổi tên lược đồ ban đầu : psql my_db -f '/path/to/file.pgsql'
. Nếu bạn có một kết xuất SQL đơn giản, bạn không cần pg_restore
.
pg_dump -n schema_name > dump.sql vi dump.sql # edit the schema name psql: psql -f dump.sql
Nếu bạn bị mắc kẹt với php thì hãy sử dụng các tics back
`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`
hoặc lệnh exec (). Đối với sự thay đổi, bạn có thể sử dụng sed theo cùng một cách.
Dưới đây là 6 ký tự nữa
public
).
Sử dụng pgAdmin bạn có thể làm như sau. Nó khá thủ công, nhưng có thể là tất cả những gì bạn cần. Một cách tiếp cận dựa trên kịch bản sẽ được mong muốn hơn nhiều. Không chắc chắn điều này sẽ hoạt động tốt như thế nào nếu bạn không có quyền truy cập quản trị viên và nếu cơ sở dữ liệu của bạn lớn, nhưng sẽ hoạt động tốt trên cơ sở dữ liệu phát triển mà bạn vừa có trên máy tính cục bộ.
Bấm chuột phải vào tên lược đồ bạn muốn sao chép và bấm Sao lưu. (Bạn có thể đi sâu hơn cái này và chọn chỉ sao lưu cấu trúc thay vì cả hai).
Đặt tên cho tệp sao lưu và cũng chọn một định dạng. (Tôi thường sử dụng Tar.)
Nhấp vào Sao lưu.
Bấm chuột phải vào lược đồ mà bạn đã sao lưu và bấm thuộc tính và đổi tên nó thành một cái khác tạm thời. (ví dụ tên tempr )
Bấm vào lược đồ gốc và bấm chuột phải vào trình duyệt đối tượng và bấm tạo lược đồ mới và đặt tên lược đồ công khai . Đây sẽ là lược đồ bạn đang sao chép vào từ bản sao lưu của bạn.
Bấm chuột phải vào lược đồ mới công khai từ bước 5. và bấm khôi phục. Khôi phục từ tệp sao lưu trong bước 3.
Đổi tên schema mới nào để một tên khác nhau (ví dụ newschema ).
Đổi tên schema temprename thay đổi từ bước 4 trở lại tên gốc.
Bạn đã có thể sử dụng
CREATE DATABASE new_db TEMPLATE = old_db;
Sau đó bỏ tất cả các lược đồ bạn không cần:
DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;
Hạn chế duy nhất là tất cả các kết nối đến old_db phải được xác định trước khi bạn có thể tạo bản sao (vì vậy quá trình chạy CREATE DATABASE
câu lệnh phải kết nối, ví dụ như với template1)
Nếu đó không phải là một tùy chọn, pg_dump / pg_restore là cách duy nhất để làm điều đó.
mở rộng trên câu trả lời của người dùng1113185 , đây là một quy trình làm việc đầy đủ bằng cách sử dụng psql / pg_dump.
Sau đây xuất tất cả các đối tượng old_schema
và nhập chúng vào new_schema
lược đồ mới , như user
, trong dbname
cơ sở dữ liệu:
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
?