PGError: ERROR: quyền bị từ chối đối với mối quan hệ (khi sử dụng Heroku)


76

Gần đây tôi đã trải qua quá trình di chuyển cơ sở dữ liệu như được nêu ở đây:

https://devcenter.heroku.com/articles/migrating-from-shared-database-to-heroku-postgres

Bây giờ tôi thấy một số lỗi trong nhật ký như sau:

PGError: ERROR: quyền bị từ chối đối với mối quan hệ

Bất kỳ ý tưởng về những gì tôi nên làm để sửa chữa nó?


Tôi đã có thứ tương tự. Tôi đã xóa hàng trong DB trên Heroku và phải chờ một vài phút và sau đó nó cho phép tôi di chuyển DB
slindsey3000

Câu trả lời:


163

Tôi đã gặp sự cố tương tự nhưng nguyên nhân gốc rễ là ứng dụng của tôi đang trỏ đến cơ sở dữ liệu nhà phát triển cũ đã vượt quá giới hạn 10.000 hàng.

Mặc dù tôi đã tạo một db Cơ bản mới và sao lưu mọi thứ, ứng dụng vẫn đang trỏ DB dev cũ.

heroku pg:info

Kiểm tra để xem các hàng: 10300/10000 (sau đó bạn gặp sự cố)

Bạn sẽ cần

1) Tạo DB mới với nhiều hàng hơn (Cơ bản hoặc hàng "Sản xuất" -> Heroku dường như đang buộc nâng cấp để kiếm nhiều tiền hơn lỗi lầm)

2) sao lưu DB cũ bằng pgbackups: heroku pg:backups:capture SMALL_DB_NAME

3) khôi phục bản sao lưu vào DB mới: heroku pg:backups:restore BACKUP_ID BIG_DB_NAME(xem các liên kết bên dưới để biết thêm chi tiết)

4) KHUYẾN KHÍCH DB mới thành DB chính cho ứng dụng:heroku pg:promote BIG_DB_NAME

luôn có thể sử dụng:

heroku maintenance:on (để tắt ứng dụng trong khi cập nhật)


heroku maintenance:off


heroku pg:info (để kiểm tra tình trạng)

Nếu đây là sự cố bạn có thể muốn kiểm tra: https://devcenter.heroku.com/articles/heroku-postgres-starter-tier https://devcenter.heroku.com/articles/migrating-from-shared-database -to-heroku-postgres


1
Cảm ơn Ashton - tất cả điều đó một lần nữa hoạt động hoàn hảo.
suttree

Của tôi nói: Hàng: 57845/10000 (Đã thu hồi quyền truy cập ghi)
carbonr

Vâng, điều đó sẽ đưa bạn vượt quá giới hạn. Có vẻ như bạn sẽ phải nâng cấp và tôi hy vọng những hướng dẫn này sẽ hữu ích!
Ashton Thomas

Cảm ơn .. Bạn đã cứu công việc của tôi!
Mário Carvalho

1
@AugustinRiedinger bạn phải đợi khoảng 30 phút, theo stackoverflow.com/a/12710024/6678
Leonid Shevtsov

11

CẬP NHẬT: Câu trả lời của Ashton đóng vai trò quan trọng trong tình huống này, rất đặc trưng cho Heroku. Nếu bạn tìm thấy điều này từ tìm kiếm thông báo lỗi hoặc sự cố PostgreSQL nhưng không sử dụng Heroku, vui lòng tìm các câu hỏi khác có nhiều khả năng áp dụng cho trường hợp của bạn hơn.


Theo phỏng đoán, ID người dùng PostgreSQL mà bạn đang kết nối không phải là chủ sở hữu của các bảng của bạn và bạn đã không đưa ra bất kỳ GRANTtuyên bố rõ ràng nào để cấp cho nó quyền truy cập vào chúng. Không nhìn thấy chính xác những gì bạn đã chạy khi bạn di chuyển, thật khó để nói thêm - và Heroku dù sao cũng giấu nhiều nội dung bên trong.

Hãy tìm hiểu tình hình hiện tại là gì. Thử kết nối với psqlvà chạy:

\dp the_problem_table

và hiển thị các hoán vị được báo cáo. Đồng thời hiển thị kết quả của:

SHOW current_user;

chạy từ psqlvà khi chạy dưới dạng truy vấn SQL từ bên trong ứng dụng của bạn.

Chỉnh sửa câu hỏi của bạn để thêm thông tin đó và nội dung chính xác, đầy đủ của thông báo lỗi mà bạn nhận được .


Heroku không cho phép truy cập cấp thấp vào db của nó
Малъ Скрылевъ

@ МалъСкрылевъ ... và không có gì ở đây là "mức thấp"
Craig Ringer

psqltrong bối cảnh đó ở mức thấp
Малъ Скрылевъ

@ МалъСкрылевъ Vậy thì bạn không chính xác. Bạn có thể kết nối trực tiếp với cơ sở dữ liệu Heroku với psql. Cách dễ dàng là heroku pg:psqlnhưng bạn cũng có thể sử dụng psqltrực tiếp bằng cách sử dụng chuỗi kết nối cơ sở dữ liệu thu được từ heroku.
Craig Ringer

Sau đó, bạn trả lời không đầy đủ và không bao gồm câu hỏi. Bởi vì nó không đưa ra câu trả lời về cách truy cập psql trên heroku.
Малъ Скрылевъ

10

Các bước dựa trên câu trả lời của Ashton để nâng cấp từ Dev (giới hạn 10k hàng) lên Basic (giới hạn 10 triệu hàng)

kiểm tra các hàng db đã vượt quá giới hạn

heroku pg:info

tắt ứng dụng và công nhân để đảm bảo không có thay đổi db trong quá trình nâng cấp db

heroku maintenance:on
heroku ps:scale worker=0

nếu bạn không có pgbackups

heroku addons:add pgbackups

sao lưu cơ sở dữ liệu và nhận id sao lưu

heroku pg:backups:capture

thêm db với giao diện web

  1. đăng nhập vào https://addons.heroku.com
  2. tìm kiếm "Heroku Postgres"
  3. chọn gói và ứng dụng
  4. thêm nó

xem cấu hình heroku, bạn sẽ thấy URL db mới

heroku config --remote heroku

khôi phục sao lưu vào db mới

heroku pg:backups:restore BACKUP_ID NEW_DB_URL

thay đổi DATABASE_URL

heroku pg:promote NEW_DB_URL

kích hoạt ứng dụng và công nhân

heroku maintenance:off
heroku ps:scale worker=1

Có thể hữu ích khi đề cập rằng lệnh đã thay đổi từ heroku pgbackups:capturethành heroku pg:backups:capture. Chú ý dấu chấm phẩy giữapg:backups
Roshan

6

Sau khi xóa các hàng thừa, bạn sẽ không nhận lại được đặc quyền chèn ngay lập tức. Trong trường hợp đó, hãy xóa các hàng thừa và chỉ chạy heroku pg:infosau đó. Thao tác này sẽ làm mới các đặc quyền của DB của bạn và bạn sẽ lấy lại quyền truy cập sau vài phút. Không bắt buộc phải sao chép DB hiện có thành một DB mới và đặt DB mới làm DB của ứng dụng của bạn.

$ heroku pg:info

=== HEROKU_POSTGRESQL_BRONZE_URL, DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 3/20
PG Version:  9.3.6
Created:     2014-03-01 13:47 UTC
Data Size:   1.25 GB
Tables:      4
Rows:        2098/10000 (Write access revoked) - refreshing
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      grinning-busily-5587

1
Cảm ơn rất nhiều! Nó đã giúp đỡ. Thêm thông tin khác: Tôi phải thêm param --app = APP_NAME, vì DB được kết nối với ứng dụng cụ thể trên Heroku của tôi.
PokatilovArt

@PokatilovArt vui vì nó giúp
manish_s

2

Tôi đã ở trong một tình huống mà tôi đã vượt quá giới hạn số hàng.

Câu trả lời này giải thích cách liệt kê số hàng trong mỗi bảng: http://stackoverflow.com/questions/12701711/heroku-row-count-incorrect

Rất có giá trị để biết.

Bạn có thể vào bảng điều khiển psql thông qua thiết bị đầu cuối, cài đặt kết nối được liệt kê trên bảng điều khiển heroku cho ứng dụng của bạn!


2

Tôi đã gặp sự cố tương tự trên ứng dụng Redmine của mình:

PG::InsufficientPrivilege: ERROR:  permission denied for relation settings
: SELECT  "settings".* FROM "settings"  WHERE "settings"."name" = 'plugin_redmine_wktime' LIMIT 1

Các bước của tôi là:

  1. Tôi đã tạo một bản sao lưu của ứng dụng và cơ sở dữ liệu Redmine cũ.
  2. Tôi đã triển khai phiên bản Redmine mới - nó hoạt động hoàn hảo
  3. Tôi đã khôi phục Redmine cũ làm máy chủ phát triển và tôi gặp lỗi khi cố truy cập trang web chính.

Nguyên nhân của sự cố của tôi chỉ là sai tên người dùng trong config / database.yml của Redmine cũ

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.