sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLデータベースをバックアップおよび復元する方法

    実稼働環境では、 PostgreSQLの大小に関係なく データベースはそうかもしれませんが、定期的なバックはデータベース管理の重要な側面です。この記事では、PostgreSQLデータベースをバックアップおよび復元する方法を学習します。

    PostgreSQLデータベースシステムがすでに正常にインストールされていることを前提としています。そうでない場合は、次の記事を読んで PostgreSQLをインストールしてください Linuxディストリビューションで。

    • Ubuntu20.04にPostgreSQLとpgAdmin4をインストールする方法
    • CentOS8にPostgreSQLとpgAdminをインストールする方法
    • RHEL8にPostgreSQLとpgAdminをインストールする方法

    始めましょう…

    単一のPostgreSQLデータベースをバックアップする

    PostgreSQL pg_dumpを提供します データベースのバックアップに役立つユーティリティ。将来簡単に復元できる形式のSQLコマンドを含むデータベースファイルを生成します。

    バックアップするには、 PostgreSQL データベースの場合は、まずデータベースサーバーにログインしてから、 Postgresに切り替えます。 ユーザーアカウントを作成し、 pg_dumpを実行します 次のように(tecmintdbを置き換えます バックアップするデータベースの名前)。デフォルトでは、出力形式はプレーンテキストのSQLスクリプトファイルです。

    $ pg_dump tecmintdb > tecmintdb.sql
    

    pg_dump 他の出力形式もサポートします。 -Fを使用して出力形式を指定できます オプション、ここでc カスタム形式のアーカイブファイル、dを意味します ディレクトリ形式のアーカイブを意味し、t tar形式のアーカイブファイルを意味します。すべての形式がpg_restoreへの入力に適しています。 。

    例:

    $ pg_dump -F c tecmintdb > tecmintdb.dump
    OR
    $ pg_dump -F t tecmintdb > tecmintdb.tar
    

    ディレクトリ出力形式で出力をダンプするには、-fを使用します フラグ(出力ファイルを指定するために使用されます)は、ファイルの代わりにターゲットディレクトリを指定します。 pg_dumpによって作成されるディレクトリ 存在してはなりません。

    $ pg_dump -F d tecmintdb -f tecmintdumpdir	
    

    すべてのPostgreSQLをバックアップするには データベースの場合は、 pg_dumpallを使用します 示されているツール。

    $ pg_dumpall > all_pg_dbs.sql
    

    psqlを使用してダンプを復元できます 示されているように。

    $ pgsql -f all_pg_dbs.sql postgres
    

    PostgreSQLデータベースの復元

    PostgreSQLを復元するには データベースでは、 psqlを使用できます またはpg_restore ユーティリティ。 psql pg_dumpによって作成されたテキストファイルを復元するために使用されます 一方、 pg_restore pg_dumpによって作成されたアーカイブからPostgreSQLデータベースを復元するために使用されます プレーンテキスト以外の形式(カスタム、tar、またはディレクトリ)のいずれか。

    プレーンテキストファイルダンプを復元する方法の例を次に示します。

    $ psql tecmintdb < tecmintdb.sql
    

    上記のように、カスタム形式のダンプは pgsqlのスクリプトではありません 、したがって、 pg_restoreで復元する必要があります 示されているように。

    $ pg_restore -d tecmintdb tecmintdb.dump
    OR
    $ pg_restore -d tecmintdb tecmintdb.tar
    OR
    $ pg_restore -d tecmintdb tecmintdumpdir	
    

    大規模なPostgreSQLデータベースのバックアップ

    バックアップしているデータベースが大きく、かなり小さい出力ファイルを生成したい場合は、 pg_dumpの出力をフィルタリングする必要がある圧縮ダンプを実行できます。 gzipなどの圧縮ツールを介して またはお気に入りのいずれか:

    $ pg_dump tecmintdb | gzip > tecmintdb.gz
    

    データベースが非常に大きい場合は、 number_of_jobsをダンプすることで並行してダンプできます。 -jを同時に使用するテーブル 示されているように、フラグ。

    $ pg_dump -F d -j 5 -f tecmintdumpdir
    

    並列ダンプオプションを使用すると、ダンプの時間が短縮されますが、一方で、データベースサーバーの負荷も増加することに注意してください。

    リモートPostgreSQLデータベースのバックアップ

    pg_dump は通常のPostgreSQLクライアントツールであり、リモートデータベースサーバーでの操作をサポートします。リモートデータベースサーバーを指定するにはpg_dump 連絡する必要があります。コマンドラインオプション-hを使用してください リモートホストと-pを指定します データベースサーバーがリッスンしているリモートポートを指定します。さらに、-Uを使用します 接続するデータベースの役割名を指定するフラグ。

    10.10.20.10を忘れずに交換してください および5432 およびtecmintdb リモートホストのIPアドレスまたはホスト名、データベースポート、データベース名をそれぞれ使用します。

    $ pg_dump -U tecmint -h 10.10.20.10 -p 5432 tecmintdb > tecmintdb.sql
    

    リモートで接続しているユーザーがデータベースにアクセスするために必要な権限を持っていること、およびデータベースサーバーで適切なデータベース認証方法が構成されていることを確認してください。構成されていない場合、次のスクリーンショットに示すようなエラーが発生します。

    pg_dump を使用して、あるサーバーから別のサーバーにデータベースを直接ダンプすることもできます。 およびpsql 示されているユーティリティ。

    $ pg_dump -U tecmint -h 10.10.20.10 tecmintdb | pqsl -U tecmint -h 10.10.20.30 tecmintdb
    

    cronジョブを使用したPostgreSQLデータベースの自動バックアップ

    cron を使用して、定期的にバックアップを実行できます 仕事。 cron ジョブは、サーバー上で実行するさまざまな種類のタスクをスケジュールするために一般的に使用される手段です。

    PostgreSQLを自動化するようにcronジョブを構成できます データベースのバックアップは次のとおりです。 PostgreSQLスーパーユーザーとして次のコマンドを実行する必要があることに注意してください。

    $ mkdir -p /srv/backups/databases
    

    次に、次のコマンドを実行してcrontabを編集し、新しいcronジョブを追加します。

    $ crontab -e
    

    crontabの最後に次の行をコピーして貼り付けます。上記で説明した任意のダンプ形式を使用できます。

    0 0 * * *  pg_dump  -U postgres tecmintdb > /srv/backups/postgres/tecmintdb.sql
    

    ファイルを保存して終了します。

    cronサービスは、再起動せずにこの新しいジョブの実行を自動的に開始します。そして、このcronジョブは毎日深夜に実行されます。これはバックアップタスクの最小限のソリューションです。

    cronジョブをスケジュールする方法の詳細については、「Linuxでcronジョブを作成および管理する方法

    」を参照してください。

    今のところ以上です!データのバックアップをデータベース管理ルーチンの一部にすることをお勧めします。ご質問やご意見がございましたら、以下のフィードバックフォームをご利用ください。詳細については、pg_dumpおよびpg_restoreのリファレンスページを参照してください。


    1. 大規模なクエリ後にpsycopg2がメモリリークしている

    2. MSSQLServerで予約語/キーワードであるテーブル名を作成する

    3. NOW()を日時データ型のデフォルト値として設定しますか?

    4. リレーショナルデータベースでパフォーマンスの問題を説明するにはどうすればよいですか?