[pgsql-jp: 41962] Re: pg_restoreについて

Masahiko Sawada m.sawada0329 @ gmail.com
2017年 9月 11日 (月) 12:17:43 JST


澤田と申します。

2017年9月11日 9:47 TAKATSUKA Haruka <harukat @ postgresql.jp>:
> 高塚です。
>
> 確かに下記の振る舞いが起こりますね。
>
> pubicスキーマから、誰でも利用可能とする「=UC」の権限指定が消えてしまいます。
>
> db1=# SELECT * FROM pg_namespace ;
>       nspname       | nspowner |               nspacl
> --------------------+----------+------------------------------------
>  pg_toast           |       10 |
>  pg_temp_1          |       10 |
>  pg_toast_temp_1    |       10 |
>  pg_catalog         |       10 | {postgres=UC/postgres,=U/postgres}
>  information_schema |       10 | {postgres=UC/postgres,=U/postgres}
>  public             |       10 |
> (6 rows)
>
> こうなっていないといけません。
>
>  public             |       10 | {postgres=UC/postgres,=UC/postgres}
>
> とりあえず GRANT ALL ON SCHEMA public TO public;
> で復旧できるはずです。
>
> 以下の手順だと、元からある public スキーマについて、
>  DROP SCHEMA IF EXISTS public;
>  CREATE SCHEMA public;
> を行うけれども、GRANT が行われません。
>
> バグであろうかと考えられます。

こちらの事象ですが、最近PostgreSQLコミュニティにも報告されています。
# 9.6.3からのバグです。
<https://www.postgresql.org/message-id/20170821104439.1455.12525%40wrigleys.postgresql.org>

パッチも作って投稿しているので、じきに修正されると思います。

9.6.3以降でのワークアラウンドとしては、(-Fcだとしても)pg_dumpに-cオプションを
つけるとで、pg_restore時にGRANT ALL ON SCHEMA public TO PUBLIC;
が実行されると思います。
# 本来pg_dumpの-cオプションは-Fcのときには影響しないと
# なっていますが、これも不具合で、9.6.3以降は影響するようになっています。

以上です。

>
>
> On Sat, 9 Sep 2017 17:38:47 +0900
> TAKATSUKA Haruka <harukat @ postgresql.jp> wrote:
>
>> On Sat, 9 Sep 2017 08:14:40 +0900
>> sato <y_sato_priv @ yahoo.co.jp> wrote:
>>
>> > はじめまして。サトウと申します。
>> > 駄文・長文ご容赦ください。
>> >
>> > pg_dumpで作成したダンプをリストアする
>> > ということを行っております。
>> > やっていることは、postgresでダンプ、リストアを実行し
>> > postgres以外のユーザ(非スーパーユーザ)でそのDBを使用する
>> > ということなのですが、その際に以下のような現象が発生し困っております。
>> >
>> > OS:Windows7
>> > PostgreSQL-9.6.3
>> >
>> > 1.createuser -U postgres user1 でuser1を作成(後ほどpassは設定)
>> > 2.psql -U postgres でPostgreSQLにアクセス
>> > 3.create databaseでDB作成
>> > 4.create tableでtableを作成
>> > 5.alter databaseでDBの所有者をuser1に変更
>> >
>> > この状態でpsql -U user1
>> > databaseとすると、user1でも問題なくDBにアクセスできました。
>> >
>> > ここで
>> > pg_dump -v -Fc -U postgres -f TEST.dump databaseとし
>> > pg_restore -v -e -c --if-exists -Fc -U postgres -d database TEST.dumpとして
>> > リストアした後にuser1でアクセスすると、リレーションがありませんとなってしまいます。
>> > postgresでアクセスするときちんとテーブルが表示され操作もできます。
>> > user1にもすべてのアクセス権をつけて試しましたがリレーションがありませんから変わりませんでした。
>> >
>> > pg_restoreの際に-C(--create)オプションをつけた場合はこの現象は起こりませんでした。
>> >
>> > \dtや\lで確認した限りでは設定に差異は見つけられず、
>> > ネットでスキーマの設定の問題かもとありましたが、
>> > publicスキーマで生成されており、search_pathの設定も
>> > public, "$user"にして試しましたが変化ありませんでした。
>> >
>> > リストアに失敗してしまった場合に元あるDBを消したくないためCオプションは使いたくないと思っております。
>> >
>> > なぜこのような現象が発生するかが見当がつかず詰まっています。
>> > もし解決作をご存知の方がいらっしゃれば、ご教授をお願い致します。
>> >
>
>
>



-- 
--
Masahiko Sawada


pgsql-jp メーリングリストの案内