2010-11-16 35 views
34

Dear All,
tôi đã lấy một bãi chứa của một cơ sở dữ liệu tên temp1
sử dụng lệnh follwingtôi muốn khôi phục lại cơ sở dữ liệu với một sơ đồ khác nhau

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1 

Bây giờ tôi muốn khôi phục lại các bãi chứa trong một khác nhau cơ sở dữ liệu được gọi là "db_temp", nhưng trong đó tôi chỉ muốn tất cả các bảng sẽ được tạo trong "temp_schema" (không phải lược đồ mặc định trong cơ sở dữ liệu temp1 fms) trong cơ sở dữ liệu "db_temp".

Có cách nào để thực hiện việc này bằng lệnh pg_restore
Bất kỳ phương pháp nào khác cũng được đánh giá cao!
Cảm ơn bạn trước!

+6

tôi không thể chấp nhận rằng điều này vẫn đang diễn ra trong năm 2017 và giải pháp là để hack tệp kết xuất. – Sharky

Trả lời

9

Không có cách nào để tự pg_restore. Những gì bạn có thể làm là sử dụng pg_restore để tạo ra đầu ra SQL, và sau đó gửi thông qua một kịch bản lệnh sed để thay đổi nó. Bạn cần phải cẩn thận về cách bạn viết kịch bản sed đó, vì vậy nó không phù hợp và thay đổi mọi thứ bên trong dữ liệu của bạn.

7

lẽ là phương pháp đơn giản nhất sẽ chỉ đơn giản là đổi tên schema sau khi khôi phục, tức là với SQL sau:

ALTER SCHEMA my_schema RENAME TO temp_schema 

Tôi tin rằng bởi vì bạn đang sử dụng định dạng nén cho đầu ra của pg_dump bạn có thể không thay đổi nó trước khi khôi phục. Tùy chọn sẽ là sử dụng đầu ra mặc định và thực hiện tìm kiếm và thay thế trên tên lược đồ, nhưng điều đó sẽ nguy hiểm và có thể khiến dữ liệu bị hỏng nếu bạn không cẩn thận.

+0

Giải pháp này có thể làm cho rất nhiều lộn xộn không phải là nó – abubacker

+3

Bằng cách nào ?? Câu lệnh SQL là cách an toàn duy nhất để thay đổi tên lược đồ. Các giải pháp khác cũng được đề xuất trong một câu trả lời khác và cả hai chúng tôi giải thích rằng nó là nguy hiểm. Suy giảm kém. – Hamish

+1

Tôi đã thay đổi tên lược đồ nhưng, sau đó, tôi không thể thay đổi đường dẫn serach! Người dùng không thể tìm kiếm bất kỳ bảng nào sau khi đổi tên! –

3

Nếu bạn chỉ có một vài bảng, bạn có thể khôi phục một bảng tại một thời điểm, pg_restore chấp nhận -d database khi bạn chỉ định -t tablename. Tất nhiên, bạn sẽ phải thiết lập lược đồ trước khi khôi phục lại các bảng và sau đó sắp xếp các chỉ mục và các ràng buộc khi bạn hoàn tất việc khôi phục các bảng.

Hoặc, thiết lập máy chủ khác trên một cổng khác, khôi phục bằng máy chủ PostgreSQL mới, đổi tên lược đồ, đổ nó và khôi phục vào cơ sở dữ liệu gốc của bạn. Đây là một chút của một kludge tất nhiên nhưng nó sẽ nhận được công việc làm.

Nếu bạn thích mạo hiểm, bạn có thể thay đổi tên cơ sở dữ liệu trong tệp kết xuất bằng trình chỉnh sửa hex. Tôi nghĩ rằng nó chỉ được đề cập ở một nơi trong bãi chứa và miễn là tên cơ sở dữ liệu mới và cũ là giống nhau nó sẽ làm việc. YMMV, đừng làm bất cứ điều gì như thế này trong môi trường sản xuất, đừng đổ lỗi cho tôi nếu điều này thổi phồng và lên cấp thị trấn nhà của bạn, và tất cả những phần còn lại của những tuyên bố miễn trừ thông thường.

32

Một cách nhanh chóng và dơ bẩn:

1) đổi tên schema mặc định:

alter schema public rename to public_save; 

2) tạo schema mới như schema mặc định:

create schema public; 

3) khôi phục dữ liệu

pg_restore -f pub.backup db_temp [and whatever other options] 

4) renam schemas e theo nhu cầu:

alter schema public rename to temp_schema; 
alter schema public_save rename to public; 
44

Có một giải pháp đơn giản:

  • Tạo đống rác của anh sao lưu ở định dạng SQL đơn giản (dạng "p" bằng cách sử dụng tham số "--format = p" hoặc " p -F ")
  • Sửa pub.backup.sql bạn đổ với soạn thảo yêu thích của bạn và thêm hai dòng sau vào phía trên cùng của tập tin của bạn:

tạo schema myschema;

SET search_path TO myschema;

Bây giờ bạn có thể khôi phục bãi sao lưu của bạn với lệnh

psql -f pub.backup.sql

Các "thiết lập search_path để" lệnh sẽ thiết lập myschema như là mặc định, để các bảng mới và các đối tượng khác được tạo trong lược đồ này, độc lập với lược đồ "mặc định", nơi chúng đã tồn tại trước đó.

+0

Có cách nào gọn gàng để thực sự chỉnh sửa chỉ phần đầu của tệp kết xuất lớn không? Ngay cả những thứ như thế này cũng liên quan đến việc sao chép nó: http: // superuser.com/questions/246837/how-do-i-add-text-to-the-start-of-a-file-in-bash –

+0

@PeterEhrlich Tùy thuộc vào dung lượng tệp của bạn và RAM có sẵn, bạn có thể sử dụng vim để mở tệp kết xuất gzip'd trực tiếp. Nó vẫn được mở rộng trong bộ nhớ nhưng tôi đã có thể mở, chỉnh sửa và lưu một tệp 750MB (.gz) chỉ với một khoảng dừng ngắn khi lưu. YMMV. – David

+0

Tôi tìm thấy bãi của tôi đã có một hoặc nhiều SET search_path TO ...; dòng mà tôi cần phải loại bỏ. Bạn có thể muốn tìm kiếm "search_path" khi chỉnh sửa và trước khi khôi phục. Bạn sẽ có ít nhất một SET search_path TO ...; dòng cho mỗi lược đồ mà từ đó các đối tượng đã được bán phá giá. Sẽ tốt hơn nếu có tùy chọn --không có lược đồ nào hoạt động như tùy chọn --no-owner. – David

0

Đổi tên lược đồ trong cơ sở dữ liệu tạm thời.

Xuất schema:

pg_dump --schema-only --schema=prod > prod.sql 

Create a new database. Khôi phục tệp xuất:

psql -f prod.sql 

ALTER SCHEMA prod RENAME TO somethingelse; 

pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(xóa cơ sở dữ liệu)

Đối với các dữ liệu bạn chỉ có thể sửa đổi các thiết lập search_path ở đầu trang.

Các vấn đề liên quan