39

ローカルの開発サーバーに、postgres 9.1 データベースが設定された django 1.4 アプリがあります。デプロイが成功した後、データをローカル データベースからオンライン データベースに移動したかったので、以下を使用しました。

pg_dump -f dump.sql -Ox database

次に、サーバーで次のように復元します。

psql -1 -f dump.sql database

Web サイト管理者にオンラインでログインしようとすると、「関係 django_session の許可が拒否されました」という例外がスローされます。-Ox スイッチとそのすべての組み合わせを使用して/使用せずにデータをダンプしようとしましたが、成功しませんでした。また、データベースを削除し、settings.py で設定されている正しい所有者を使用して、サーバー上で最初から再作成しています。

復元せずに通常の syndb を実行すると、すべて正常に動作します。

ここで何か不足していますか?

4

3 に答える 3

104

復元後に、データベース内のすべてのオブジェクトの明示的な所有権を所有者に付与する必要があることがわかりました。所有者はスーパーユーザーではありません。データベースの作成時に所有者を設定するだけでは十分ではありません。移行の最終的な解決策は次のようになります。

クライアントで:

pg_dump -f dump.sql -Ox database

サーバー上:

su postgres    
dropdb database
createdb database -O user
psql database -f dump.sql

次に、権限を設定します。

psql database -c "GRANT ALL ON ALL TABLES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to user;"

psql コンソールで sql コマンドを実行することもできますが、このフォームはスクリプトなどに簡単に埋め込むことができます。

于 2012-09-02T14:04:17.860 に答える
2

postgresユーザーからこれを試してください:

sudo su - postgres
pg_dump -f dump.sql -Ox database

-Uまたは、フラグを渡すだけです:

pg_dump -f dump.sql -Ox database -U postgres
于 2012-09-02T02:48:58.303 に答える
0

これが私が私のものを修正した方法です。インポートが行われる宛先サーバーの現在ログインしているユーザーと一致するようにユーザーを変更するだけで、頭痛の種を大幅に節約できました。

私の場合、インポートされたデータベースには x のユーザーがいて (x はそれが実行されているマシンのユーザー名でもありました)、宛先マシンには y のユーザー名があり、postgres ユーザーも y でした。

したがって、Django 設定のデータベース ユーザーとパスワードを、宛先マシンの y ユーザーの詳細と一致するように変更しただけです。

次に、これを行いました:

$ sudo -u postgres psql psql > GRANT ALL PRIVILEGES DATABASE ON mydb TO y;

クールエイドを飲みましょう!

于 2017-08-07T23:17:21.263 に答える