PostgreSQL: Làm thế nào để tạo bản sao đầy đủ của lược đồ cơ sở dữ liệu trong cùng một cơ sở dữ liệu?


26

Làm cách nào tôi có thể sao chép publiclượ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


Bạn có nhiều lược đồ hơn, hay chỉ public?
a_horse_with_no_name

Tôi có các lược đồ công khai và demo. Và tôi cần sao chép bản demo để tạo tài khoản demo ...

Đây sẽ là một điều hữu ích để có thể làm.
Kuberchaun

Câu trả lời:


19

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.

  1. Lấy một lược đồ công khai của bạn bằng cách sử dụng pg_dump
  2. chạy "ALTER SCHema công khai RENAME TO public_copy"
  3. Khôi phục kết xuất lược đồ công khai của bạn từ bước 1 bằng pg_restore

Làm thế nào tôi có thể truy cập vào pg_dump và pg_restore thông qua PHP?

Điều đó phụ thuộc vào nơi bạn đang chạy cơ sở dữ liệu. Bạn có thể truy cập pg_dump và pg_restore từ shell trên máy chủ của bạn. Nếu bạn không có quyền truy cập shell thì bạn có thể thử sử dụng PHP shell_exec , nếu không, bạn sẽ cần xem xét một phương thức sao lưu thay thế, có thể sử dụng Công cụ GUI

1
+1 Đó là giải pháp thông minh nhất cho đến nay. Lệnh Shell sẽ trông giống như thế này ( có thêm trong hướng dẫn ) : 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.
Erwin Brandstetter

Có một cách dễ dàng, xem câu trả lời của tôi. pg_dump hỗ trợ khóa -n để chọn lược đồ. Sau đó, chỉ cần chỉnh sửa tên lược đồ trong bãi chứa và tải lại.
Scott Marlowe

2
Chỉ cần đổi tên lược đồ sẽ không cập nhật các tham chiếu bên trong các hàm: gist.github.com/pschultz/5387172 . Thay thế tên là bãi chứa đáng tin cậy hơn nhiều nếu bạn tìm kiếm và thay thế đúng.
Peter

9
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


1
Sẽ an toàn hơn khi đổi tên lược đồ và tải lại lược đồ gốc đã sao lưu, đặc biệt khi tên lược đồ có thể xuất hiện dưới dạng nội dung (ví dụ public).
artm

7

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ộ.

  1. 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).

  2. Đặ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.)

  3. Nhấp vào Sao lưu.

  4. 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 )

  5. 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.

  6. 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.

  7. Đổi tên schema mới nào để một tên khác nhau (ví dụ newschema ).

  8. Đổi tên schema temprename thay đổi từ bước 4 trở lại tên gốc.


Lược đồ mới được tạo trong bước 5 phải có cùng tên với lược đồ bạn đã sao lưu, nếu không pgAdmin sẽ không khôi phục bất cứ điều gì.
Cao Minh Từ

5

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 DATABASEcâ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 đó.


1
Trước khi tôi hỏi câu hỏi này, tôi đã sử dụng một phương pháp tương tự để sao chép cơ sở dữ liệu. Nhưng nó dành rất nhiều thời gian và tôi nghĩ rằng việc nhân bản lược đồ duy nhất nhanh hơn nhiều ...

@sigra: Phương pháp a_horse của nhân bản nhanh nhất có sẵn cho cơ sở dữ liệu, vì các file thực tế có thể chỉ cần sao chép, mà tiết kiệm rất nhiều chi phí. Tôi nghi ngờ một kết xuất và tải lại lược đồ sẽ nhanh hơn trừ khi lược đồ chỉ là một phần nhỏ của toàn bộ db. Vì vậy, +1 cho câu trả lời này ngay cả khi nó không trả lời câu hỏi thực tế.
Erwin Brandstetter

Đó là rất nhiều công việc để sao chép một lược đồ duy nhất. đổ lược đồ, đổi tên nó trong bãi chứa và tải lại nhanh hơn nhiều.
Scott Marlowe

@ScottMarlowe: phụ thuộc vào lược đồ lớn nhất. Nếu cái lớn nhất là một trong những cái bị rơi, thì tôi đồng ý.
a_horse_with_no_name

2

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_schemavà nhập chúng vào new_schemalược đồ mới , như user, trong dbnamecơ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.