2013-06-17 22 views
35

Tôi có một cơ sở dữ liệu đã được xuất khẩu với pg_dump, nhưng bây giờ khi tôi đang cố gắng để nhập nó một lần nữa với:nhập cơ sở dữ liệu Postgres mà không cần vai trò

psql -d databasename < mydump.sql 

Nó vẫn thất bại cố gắng để cấp vai trò những người mà không làm hiện hữu. (lỗi nói 'Vai trò' xxx 'không tồn tại')

Có cách nào để nhập và đặt tất cả vai trò tự động cho người dùng của tôi không?

Trả lời

30

Hành vi mặc định của quá trình nhập là nó thay thế tất cả các vai trò mà nó không biết với vai trò bạn đang thực hiện việc nhập bằng. Vì vậy, tùy thuộc vào những gì bạn cần cơ sở dữ liệu cho, bạn chỉ có thể được tốt với nhập khẩu nó và với bỏ qua các thông báo lỗi.

Trích dẫn từ http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

Trước khi khôi phục một bãi chứa SQL, tất cả những người dùng sở hữu các đối tượng hoặc đã được cấp quyền truy cập vào các đối tượng trong cơ sở dữ liệu đổ phải đã tồn tại. Nếu không, khôi phục sẽ không tạo lại các đối tượng với quyền sở hữu và/hoặc quyền ban đầu. (Đôi khi điều này là những gì bạn muốn, nhưng thường nó không phải là.)

+2

Từ lần đọc đầu tiên của tôi về câu trả lời này, tôi đã bỏ lỡ phần nói "bạn có thể chỉ cần ổn" Để làm rõ câu trả lời này, lệnh có thể hoạt động khi chạy. Các lỗi được hiển thị không dừng nhập dữ liệu. Các vai trò đã được sử dụng trong nguồn không có trong đích, và bất kỳ dữ liệu nào liên kết với chúng sẽ được liên kết với người dùng đang chạy lệnh. – shanemgrey

8

Vâng, bạn có thể đổ tất cả các "toàn cầu" đối tượng từ nguồn của bạn DB với tùy chọn -g pg_dumpall của:

pg_dumpall -g > globals.sql 

Sau đó chạy globals.sql chống lại mục tiêu của bạn DB trước khi nhập khẩu.

15

Với pg_restore bạn có thể sử dụng tùy chọn --role=rolename để buộc một tên vai trò được sử dụng để thực hiện khôi phục. Nhưng bãi chứa phải là định dạng văn bản không thuần túy.
Ví dụ, bạn có thể đổ với:

pg_dump -F c -Z 9 -f my_file.backup my_database_name 

và hơn bạn có thể khôi phục lại nó với:

pg_restore -d my_database_name --role=my_role_name my_file.backup 

để biết thêm: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

-2

Vâng Bạn chỉ có thể tạo ra vai trò mới với cùng tên mà bạn đang thiếu, và sau đó nhập bãi chứa không có lỗi.

lỗi nói: 'Vai trò 'xxx' không tồn tại' - vì vậy tạo ra nó :)

22

Câu trả lời mà bạn có thể tìm kiếm được thêm --no-owner để lệnh pg_restore. Không giống như câu trả lời được chấp nhận tại thời điểm này, lệnh sẽ tạo mọi đối tượng với người dùng hiện tại ngay cả khi vai trò trong kết xuất không tồn tại trong cơ sở dữ liệu.

Vì vậy, không có phần tử nào bị bỏ qua bởi pg_restore nhưng nếu một số phần tử được nhập bởi người dùng khác nhau, tất cả các bản ghi sẽ hiện chỉ thuộc sở hữu của một người dùng.

+0

Điều này làm việc hoàn hảo, cảm ơn! –