6

いくつかの大きなオブジェクトが制御不能になっているherokuのpostgresデータベースをクリーンアップしようとしていますが、使用されなくなった大きなオブジェクトを削除したいと思います。

私の開発マシンでは、次のことができます。

select distinct loid from pg_largeobject 
Where loid Not In (select id from table )

それから私は実行します:

SELECT lo_unlink(loid)

それらのIDのそれぞれに。

しかし、herokuでは、選択を実行することはできませんpg_largeobject

select * from pg_largeobject limit 1;

エラーが発生します:

ERROR:  permission denied for relation pg_largeobject

pg_largeobjectこれを回避する方法、または実際にherokuで読み取りアクセス権がない理由についての提案はありますか?

4

1 に答える 1

8

PostgreSQL 9.0 以降、非スーパーユーザーは にアクセスできませんpg_largeobject。これは、リリース ノートに記載されています。

GRANT/REVOKE でラージオブジェクト (BLOB) パーミッションを制御する機能を追加 (KaiGai Kohei)

以前は、すべてのデータベース ユーザーがラージ オブジェクトの読み取りまたは変更を行うことができました。大きなオブジェクトごとに読み取りと書き込みのアクセス許可を付与および取り消すことができるようになり、大きなオブジェクトの所有権が追跡されます。

開発インスタンスで動作する場合は、バージョン8.4以下か、スーパーユーザーとしてログインしていることが原因です。

heroku でスーパーユーザーとしてログインできない場合は、リモート データベースを でダンプし、pg_dumpローカルでリロードし、リークされた OID をローカル スーパーユーザーとして識別し、lo_unlinkコマンドを使用してスクリプトに入れ、最後にこれを再生できます。 heroku インスタンスに対するスクリプト。

アップデート:

\dlpsqlコマンドがデータベースにクエリを実行する方法に基づいて、次のクエリpg_catalog.pg_largeobject_metadataを使用して、すべての大きなオブジェクトの OID と所有権を取得するために使用できるようです。

SELECT oid as "ID",
  pg_catalog.pg_get_userbyid(lomowner) as "Owner",
  pg_catalog.obj_description(oid, 'pg_largeobject') as "Description"
  FROM pg_catalog.pg_largeobject_metadata   ORDER BY oid

したがって、リークされた大きなオブジェクトを見つける最初のクエリは、9.0 以降の非スーパーユーザー向けに次のように変更できます。

select oid from pg_largeobject_metadata
 Where oid Not In (select id from table )

必要に応じて、条件をlomowner追加して、特定のユーザーが所有する大きなオブジェクトをフィルター処理できます。

于 2013-02-22T16:21:02.343 に答える