web-dev-qa-db-ja.com

PGError:エラー:リレーションの許可が拒否されました(Herokuを使用する場合)

私は最近、ここに概説されているデータベース移行プロセスを経験しました。

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

今、私はこのようなログにいくつかのエラーを見ています:

PGError:エラー:リレーションの許可が拒否されました

私はそれを修正するために何をすべきかについてのアイデアはありますか?

74
suttree

私は同様の問題を抱えていましたが、根本的な原因は私のアプリが10,000行の制限を超えていた古いdevデータベースを指していることでした。

新しい基本データベースを作成し、すべてをバックアップしましたが、アプリはまだ古い開発データベースを指していました。

heroku pg:info

行を確認してください:10300/10000(それから問題があります)

あなたがする必要があります

1)行を増やして新しいDBを作成します(基本または「本番」行-> Herokuは、より多くのお金を稼ぐためにアップグレードを強制しているようです)

2)pgbackupsを使用して古いDBをバックアップします:heroku pg:backups:capture SMALL_DB_NAME

3)バックアップを新しいDBに復元します:heroku pg:backups:restore BACKUP_ID BIG_DB_NAME(詳細については以下のリンクを参照)

4)アプリのプライマリに新しいDBをプロモートします:heroku pg:promote BIG_DB_NAME

常に利用できます:

heroku maintenance:on(更新中にアプリを無効にするため)


heroku maintenance:off


heroku pg:info(ステータスを確認するため)

これが問題である場合は、チェックアウトすることをお勧めします。 https://devcenter.heroku.com/articles/heroku-postgres-starter-tierhttps://devcenter.heroku。 com/articles/migrating-from-shared-database-to-heroku-postgres

160
Ashton Thomas

更新:アシュトンの答えは、このような状況にそれを釘付けにします。これは非常にHeroku固有です。 PostgreSQLエラーメッセージまたは問題の検索でこれを見つけたが、Herokuを使用してnotである場合は、状況に当てはまる可能性が高い他の質問を探してください。


推測では、接続先のPostgreSQLユーザーIDはテーブルの所有者ではなく、テーブルへのアクセスを許可する明示的なGRANTステートメントを発行していません。 exactlyを見たことがなければ、移行したときに実行したものを言うことは難しく、Herokuは内部の多くを非表示にします。

現在の状況を把握しましょう。 psqlで接続して実行してみてください:

\dp the_problem_table

報告された権限を表示します。次の結果も表示します。

SHOW current_user;

psqlから実行し、アプリケーション内からSQLクエリとして実行する場合。

質問を編集して、その情報とエラーメッセージの完全な正確なテキストを追加します。

11
Craig Ringer

Dev(10k行の制限)からBasic(10M行の制限)にアップグレードするAshtonの回答に基づく手順

db行の制限を確認

heroku pg:info

アプリとワーカーを無効にして、データベースのアップグレード中にデータベースが変更されないようにします

heroku maintenance:on
heroku ps:scale worker=0

pgbackupがない場合

heroku addons:add pgbackups

データベースのバックアップとバックアップIDの取得

heroku pg:backups:capture

webインターフェイスでデータベースを追加する

  1. https://addons.heroku.com にログインします
  2. 「Heroku Postgres」を検索
  3. 計画とアプリケーションを選択
  4. それを追加する

heroku configを表示すると、新しいdb URLが表示されるはずです

heroku config --remote heroku

バックアップを新しいデータベースに復元する

heroku pg:backups:restore BACKUP_ID NEW_DB_URL

dATABASE_URLを変更

heroku pg:promote NEW_DB_URL

アプリとワーカーを有効にする

heroku maintenance:off
heroku ps:scale worker=1
9
tomaszbak

余分な行を削除した後、すぐに挿入特権を取り戻すことはできません。その場合、余分な行を削除して、heroku pg:infoを実行します。これにより、DBの権限が更新され、数分でアクセスが回復します。既存のデータベースを新しいデータベースに複製し、新しいデータベースをアプリのデータベースとして設定する必要はありません。

$ 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
5
manish_s

行数の制限を超えた状況にありました。

この回答では、各テーブルの行数をリストする方法について説明しました: http://stackoverflow.com/questions/12701711/heroku-row-count-incorrect

知ることは非常に貴重です。

ターミナルからpsqlコンソールにアクセスすると、接続設定がアプリのherokuダッシュボードにリストされます!

2
user991562

Redmineアプリケーションでも同様の問題が発生しました。

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

私の手順は次のとおりです。

  1. 古いRedmineアプリケーションとデータベースのバックアップを作成しました。
  2. Redmineの新しいバージョンを展開しました-完全に機能しました
  3. 古いRedmineを開発サーバーとして復元しましたが、メインWebページにアクセスしようとするとエラーが発生しました。

私の問題の原因は、古いRedmineのconfig/database.ymlの間違ったユーザー名にありました。

2
Rapekaz