2016-11-14 4 views
0

AWS RDSに複数のPostgreSQLインスタンスがあります。災害復旧ポリシーに準拠するために、各データベースのオンプレミスコピーを維持する必要があります。私は正常にpg_dumpとpg_restoreを使用してデータベーススキーマとテーブルをオンプレミスサーバにエクスポートしていますが、私はロールとテーブルスペースのエクスポートに失敗しています。私はこれがpg_dumpallを使用することによってのみ可能であることを発見しましたが、これにはスーパーユーザーのアクセスが必要であり、RDSでは許可されていないため、データベースのこれらの側面を社内のサーバーにどのようにエクスポートできますか?AWS pg_dumpにグローバルが含まれていない

私はpg_dumpコマンド:

Pg_dump -h {AWS Endpoint} -U {Master Username}-p 5432 -F c -f C:\AWS_Backups\{filename}.dmp {database name} 

私にpg_restoreコマンド:私はしかし、彼らは「グローバルに対処していない、自分のPostgreSQLデータベースをエクスポートできるようにpg_dumpを使用している人々の複数の例を発見した

pg_restore -h {AWS Endpoint} -p 5432 -U {Master Username} -d {database name} {filename}.dmp 

"これはpg_dumpを使って無視されます。私はドキュメンテーションを誤解しましたか?私のpg_restoreを実行した後、私のログインはデータベース上に作成されませんでした。

FULLデータベース(グローバルを含む)を私たちのオフサイトの場所に届けるためのお手伝いをさせていただきます。

+3

'pg_dump'にはグローバルは含まれません。 '--globals-only'オプションで' pg_dumpall'を使う必要があります。 –

+0

これは私が見つけたことですが、AWSのオプションではありません。なぜなら、スーパーユーザーのアクセスが必要なためです。 pg_dumpallを実行しようとすると、「pg_authid関連のパーミッションが拒否されました」というエラーが表示されます。 AWSの限界を乗り越えることができたのは誰ですか? – Wendy

+0

AWSの制限ではなく、設計によるものだと思います。私は間違っている可能性がある。 –

答えて

1

オンラインのどこにでも私の質問に対する回答が見つかりませんでした。他の人がこの問題を経験しているかもしれない場合に備えて、私は私の "解決策"の概要を投稿すると思った。私は私の膝に到達するために私の肘の周りに行くが、これは私が出ているオプションです: - 各PostgreSQLデータベース内に

  1. は、テーブルを作成します(ロールの1、およびログインのための1つのI 2を作成しました) AWS。この表には、CREATE、GRANT、REVOKEなどを行うためにSQLを動的に作成するために必要なすべての列が必要です。
  2. すべてのロール、ログイン、権限および権限をこの表に挿入します。これらは、どこにでも散らばっているが、ここで私が使用したものです:
    • pg_auth_membersの(役割とログインの関係)
    • 以下のようにpg_roles(役割はと権限すなわち、親を継承などにログインすることができますログイン)(
    • information_schema.role_usage_grantsをスキーマ特権)
    • information_schema.role_table_grants(表特権)
    • information_schema.role_routine_grants(機能権限)
  3. ギャップを埋めるために、以下のWebページで巧妙なクエリがあり、組み込み関数を使用してアクセスをチェックします。あなたは具体的に、私は一度、すべてのデータの
  4. database_privs機能の変化を使用
    • https://vibhorkumar.wordpress.com/2012/07/29/list-user-privileges-in-postgresqlppas-9-1/
    • をテーブルをループしており、一度に行を処理するこれらのテーブルであり、あなたpg_dumpを実行すると、各データベースからその情報がオンプレミスの場所に抽出されます。私はこれをPythonスクリプトを通して行いました。
    • サーバーでは、表のデータを使用して、CREATE、GRANT、REVOKEなどのスクリプトを実行するために必要なSQL文を動的に作成します。 aで保存してください。SQLファイルを使用して、データベースに対して実行するPythonスクリプトを指示し、AWSのロールとログインを再作成することができます。
    • AWSのpg_auth_idテーブルにアクセスすることができないため、私はAWSからパスワードを取り出す方法が見つけられませんでした。これらをパスワードマネージャーに保存し、CREATE ROLEステートメントを作成すると、デフォルトに更新されます。

私はプロセスを完了していませんが、pg_dumpallの機能がないため実行可能なオプションを追跡するのに数日かかりました。もし誰かが私の論理に何か欠陥を見ている、またはより良い解決策を持っているなら、私はそれについて読むことが大好きです。がんばろう!

0

解決策:私はGithubアカウントに実際の解決策を掲載しました。

バイナリをコンパイルして代わりに使用する必要がありますが、動作します。何か問題があれば、お気軽にコメントしてください。

hereの内部動作の詳細を読むことができます。

+0

こんにちは。それはとても印象的です。共有していただきありがとうございます。それを通過するまでには時間がかかるかもしれません。したがって、このコードはpg_dumpallを手動でスクリプト化し、.sqlファイルに保存しますか?それはソースデータベースを変更しますか?それとも、ターゲットデータベース上で実行するコードを模擬していますか? – Wendy

+0

(1)そのWIP。 (2)DBに何も変更を加えることはありません(そうでなければ、練習全体がmootです)(3)私のブログにはすぐにアップデートを投稿しますが、悲しいことに、今のところ私が提供できるものはThatGuyFromDelhiです。 com。ありがとうございます –

+0

AWS RDS postgresのほとんどのデータベースで動作するはずですが、上記の回答のURLをコミットの代わりにブランチに更新しました。 –

関連する問題