2012-04-16 29 views
42

Tôi đang sử dụng Postgres cho dự án django và hiện đang triển khai hệ thống sao lưu/khôi phục cơ sở dữ liệu đơn giản nhất có thể thực hiện pg_dump khi người dùng nhấp vào sao lưu và pg_restore khi họ nhấp vào khôi phục sao lưu.PostgreSQL 9.1 pg_restore lỗi liên quan đến PLPGSQL

Tất cả có vẻ tốt đẹp và dandy cho đến khi nó thực sự cố gắng để thực hiện các pg_restore lúc mà nó mang lại cho lỗi này:

pg_restore: [archiver (db)] Error from TOC entry 3206; 0 0 COMMENT EXTENSION plpgsql pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql Command was: COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';

Tôi đã nhìn vào là những gì plpgsql vv và tôi hiểu rằng, và liên quan đến các lỗi Tôi đã thử cài đặt thủ công "chủ sở hữu của tiện ích mở rộng" cho người dùng thực thi tập lệnh và sở hữu cơ sở dữ liệu nhưng không thay đổi gì, thực sự gây phiền nhiễu vì lỗi của nó cố gắng đặt nhận xét về mọi thứ

Đây là tất cả được tạo tự động bởi pg_dump để dòng bình luận không thể bị xóa và không có cờ để vô hiệu hóa các bình luận (mà tôi nhận thức được), vì vậy tôi thực sự bị mắc kẹt như thế nào để giải quyết vấn đề này.

+0

Nếu bạn kết nối bằng psql và gõ '\ l', bạn thấy gì trong cột" Chủ sở hữu "cho cơ sở dữ liệu đó? Vì plpgsql là một ngôn ngữ không đáng tin cậy, nó chỉ có thể được sửa đổi (và tôi đoán nó sẽ áp dụng ngay cả với nhận xét về nó) bởi chủ sở hữu cơ sở dữ liệu hoặc siêu người dùng cơ sở dữ liệu. – kgrittn

+0

tôi có thể xác nhận rằng chủ sở hữu là của cơ sở dữ liệu là chính xác và phù hợp với người dùng được chỉ định bởi tùy chọn -U của lệnh pg_restor (và pg_dump quá) –

+0

Nó không phải là đơn giản, không may. Tôi có đầu ra pg_dump hy vọng có thể tạo ra các ngôn ngữ và chức năng bằng cách sử dụng các ngôn ngữ đó.Nếu tôi tự tạo ngôn ngữ làm siêu người dùng DB, việc tạo hàm không thành công do lỗi quyền. Nếu không, cài đặt ngôn ngữ thủ tục không thành công do lỗi cho phép. Trong cả hai trường hợp, kích hoạt tiếp tục xuống mà dựa vào những chức năng hiện có cũng không thể được tạo ra, bởi vì các chức năng không tồn tại. – Quixadhal

Trả lời

75

Dường như pg_restore cố khôi phục một số dữ liệu bổ sung mà bạn không sở hữu. Hãy thử thêm tùy chọn -n public vào dòng lệnh pg_restore của bạn. Nó sẽ cho pg_restore khôi phục chỉ nội dung của lược đồ công khai. dòng lệnh của bạn nên trông giống như

pg_restore -U username -c -n public -d database_name 
+6

Tùy chọn này có liên quan đến mất thông tin sau khi khôi phục không? Nghĩa là nó sẽ mất bất kỳ dữ liệu quan trọng nào? – C2H5OH

+7

@ C2H5OH nó phụ thuộc. Khi bản sao lưu cơ sở dữ liệu của bạn chứa nhiều lược đồ, lệnh trên sẽ chỉ nhập giản đồ "công khai" (= mất thông tin). Nếu bạn đổ chứa lược đồ "công khai" chỉ, sau đó bạn không có một vấn đề (tham khảo: pg_dump --exclude-schema). Để kiểm tra xem lược đồ nào trong tệp kết xuất của bạn chạy tệp này: pg_restore -l -F t dumpfile.tar | grep SCHEMA | awk -F "" '{print $ (NF-1)}' - – DanielaWaranie

+1

Điều này đã khắc phục sự cố của tôi với 'pg_restore' đang cố gắng tải trong các tiện ích mở rộng bổ sung, trong trường hợp của chúng tôi, nó không được phép. – nibbex

1

Bạn đang tải vào một DB được tạo bởi một người dùng khác? Nếu có thể, hãy thử khôi phục bằng cách sử dụng cùng một người dùng đã tạo DB và các đối tượng hiện có của nó.

+0

không có mọi thứ được gọi với cờ "-U username" là cùng một người dùng chỉ để chắc chắn –

12

Tôi tìm thấy cách giải quyết sau đây trên trang này:

http://archives.postgresql.org/pgsql-general/2011-10/msg00826.php

Ý tưởng là để sử dụng pg_restore -l để xem nội dung của các kho lưu trữ, grep ra phần mở rộng mà người dùng không có quyền khôi phục và sử dụng pg_restore -L để sử dụng danh sách ưu tiên này khi khôi phục.

Ví dụ:

pg_restore -l ~/database.dump | grep -v "EXTENSION - plpgsql" > ~/restore_elements 
pg_restore -L ~/restore_elements ~/database.dump 
+1

Điều này phù hợp với tôi. Một cảnh báo mặc dù, lệnh thứ hai sẽ in tất cả mọi thứ để 'STDOUT', do đó bạn có thể sẽ muốn chuyển hướng nó vào một tập tin thay thế. – shrx

1

trình cho tôi sau khi lệnh này -

[email protected]:~$ sudo -i -u postgres 
[email protected]:~$ psql 
psql (9.3.5) 
Type "help" for help. 

postgres=# GRANT ALL PRIVILEGES ON DATABASE database_name TO user; 
postgres=# GRANT 
2

Nếu có thể, tôi khuyên bạn nên xóa những nhận xét mà không để khôi phục trước khi tạo bất kỳ bãi.

Bạn có thể làm như vậy bằng cách:

COMMENT ON EXTENSION plpgsql IS null; 

Nếu bạn không muốn làm điều này cho tất cả các cơ sở dữ liệu mới được tạo ra, loại bỏ các bình luận từ DB gọi template1 (CREATE DATABASE… bản sao cơ sở dữ liệu này.)

Dumps được tạo sau đó sẽ khôi phục mà không có lỗi.

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