pgAdmin で pgAgent を使用して PostgreSQL の自動バックアップをスケジュールする方法
序章
pgAgent は、PostgreSQL データベースのジョブをスケジュールするために使用されるツールです。また、Postgres タスクを処理するために特別に構築されているため、よく使用される cron
よりも強力なスケジューリング機能も備えています。たとえば、pgAgent は、バッチ スクリプトやコマンドを繰り返すことなく、複数のステップをスケジュールできます。 pgAdmin がインストールされている場合でも、pgAgent は個別に、特に pgAdmin の拡張機能としてダウンロードする必要があることに注意してください。
このチュートリアルでは、pgAgent をインストールし、pgAdmin グラフィカル ユーザー インターフェイス (GUI) で pgAgent を使用するようにデータベースを構成し、pgAgent をデーモンとしてセットアップしてから、pgAgent を使用してデータベースをバックアップするジョブをスケジュールします。
前提条件
このチュートリアルに従うには、次のものが必要です。
- root 以外の
sudo
が有効なユーザーとファイアウォールでセットアップされた Ubuntu 22.04 サーバー。これを行うには、初期サーバー セットアップ ガイドをお読みください - PostgreSQL がサーバーにインストールされている。これを設定するには、Ubuntu 22.04 で PostgreSQL をインストールして使用する方法に関するガイドに従ってください。このガイドに従って、pgAdmin を PostgreSQL インスタンスに接続するために両方が必要になるため、必ず新しいロールとデータベースを作成してください
- アカウントが設定された状態でインストールされた pgAdmin。これを行うには、Ubuntu 22.04 のサーバー モードで pgAdmin4 をインストールおよび構成する方法に関するチュートリアルに従ってください
ステップ1-pgAgentのインストール
前述のように、pgAdmin をインストールしても、pgAgent は自動的に構成されません。次のコマンドのように apt install
とパッケージ名 pgagent
を実行することで、端末から pgAgent をインストールできます。
- sudo apt install pgagent
pgAgent をインストールしたら、次のステップに進み、pgAdmin で pgAgent を使用するようにデータベースを構成します。
ステップ 2 — pgAgent 用にデータベースを構成する
前提条件に従うと、pgAdmin がセットアップされ、使用できるようになります。 pgAdmin を使用して、pgAgent を使用するようにデータベースを構成できます。 Web ブラウザーを開き、http://your_domain の pgAdmin アプリケーションに移動します。アカウントにログインしたら、左側のパネルのツリー コントロールに移動します。作成した sammy というデータベースを見つけて、リストを展開します。このリストには、拡張機能というオプションがあります。見つけたら、それを右クリックして、[クエリ ツール] オプションを選択します。
pgAgent は、pgAdmin で使用する前に拡張機能をデータベースにロードする必要があります。これを行うには、次のクエリを記述し、横向きの矢印 ▶ をクリックして実行を示し、コマンドを実行します。
- CREATE EXTENSION pgagent;
クエリ ツール機能を使用したこの手順は、次の例に示されています。
[メッセージ] タブの下に、300 ミリ秒で正常に返されたクエリを返す出力があります。これにより、pgAgent 拡張機能が正常に作成されたことが確認されます。
注: 適切な plpgsql
言語がデータベースにロードされていない場合、次のエラー メッセージが表示されます。
OutputERROR: language "plpgsql" does not exist
HINT: Use CREATE EXTENSION to load the language into the database.
SQL state: 42704
これが発生した場合、CREATE LANGUAGE
を実行して、必要な pl/pgsql 手続き型言語をインストールする必要があります。これをインストールするには、次のコマンドを実行します。
- CREATE LANGUAGE plpgsql;
pl/pgsql 言語をインストールすると、下部に Query returned successfully in 231 ms. のようなメッセージが表示されます。この後、前の CREATE EXTENSION pgagent
クエリを再度実行します。
これらのクエリを実行すると、拡張機能の下に、pgagent と plpgsql の 2 つの項目が表示されます。
左側のツリー コントロールに、pgAgent ジョブという新しい項目が表示されます。これは、pgAgent が pgAdmin アカウントに正常にインストールされたことを示します。次に、ジョブを正常に実行できるように、pgAgent をデーモンとしてセットアップします。
注: これらの項目がすぐに表示されない場合は、ブラウザー ページを更新してください。クエリが成功すると表示されるはずです。
ステップ 3 — pgAgent をデーモンとして設定する
pgAgent をインストールして pgAdmin を使用してデータベース用に構成したので、次に pgAgent をサーバー上でデーモンとしてセットアップする必要があります。 デーモン は、バックグラウンドで継続的なプロセスとして実行され、サービス タスクを実行するプログラムです。 pgAgent は、Unix システム上でデーモンとして実行され、通常はデータベース サーバー自体で実行されます。
pgAgent をデーモンとして設定するには、ジョブをスケジュールするときにプロセスが適切に実行されるように、PostgreSQL 接続文字列が必要です。この場合、PostgreSQL libpq 接続文字列を設定しています。これは、ユーザー固有で、設定した特定のパラメーターに接続する文字列を意味します。 PostgreSQL の libpq 接続関数の詳細については、PostgreSQL のドキュメントを参照してください。
接続文字列は、ホスト名、データベース名、およびユーザー名の資格情報を提供します。この例では、ホストは Unix ドメイン ソケットを使用し、データベース名は sammy
、ユーザーは sammy
です。この文字列は、デーモンを開始するために pgagent
コマンドに追加されます。ターミナルで、次のコードを実行します。
- pgagent host=/var/run/postgresql dbname=sammy user=sammy
出力に何も返されず、接続エラー メッセージが表示されない場合、接続文字列のセットアップは成功しています。
接続文字列を作成したら、pgAgent でジョブをスケジュールする準備が整いました。
ステップ 4 — pgAgent を使用したジョブのスケジューリング
pgAgent は、ジョブを実行および管理し、1 つ以上のステップまたはスケジュールのジョブを作成できるスケジューリング エージェントとして機能します。たとえば、ステップは、シェル スクリプトの複数の SQL ステートメントで構成され、次々と連続して実行される場合があります。全体として、pgAgent を使用して、ジョブのスケジュール、管理、変更、または無効化を行うことができます。
このチュートリアルでは、pgAgent を使用して、曜日ごとに 1 分ごとにサミー データベースをバックアップするジョブを作成します。次のように、pgAgent ジョブを右クリックし、[作成] を選択してから [pgAgent ジョブ...] を選択することから始めることができます。
これを行うと、Create - pgAgent Job というタイトルのプロンプトが表示され、General タブで必要な情報の入力を開始できます。この例では、sammy_backup という名前を使用し、このジョブを任意のホストで実行できるようにするため、ホスト エージェントを指定しません。さらに、Job クラスを Routine Maintenance として残します。その他のコメントを含めたい場合は、コメント セクションに自由に記入してください。
次に、[ステップ] タブに移動します。右上隅の + 記号をクリックして、ステップを作成します。この例では、このステップに step1 という名前を付けます。次に、オプションを展開するには、ゴミ箱アイコンの左側にある鉛筆をクリックします。有効?ボタンはデフォルトでオンになっており、このジョブの実行時にこのステップが含まれることを示します。
[種類] オプションでは、SQL またはバッチのいずれかを選択できます。ここではバッチを選択しています。この例でバッチを選択する理由は、これが、データベースに対してスケジュールするバックアップ用に設定する適切な PostgreSQL コマンドを実行するものだからです。 SQL オプションは、生の SQL を実行するジョブをスケジュールするために使用できます。この場合、手順がローカル サーバーで実行されるように [接続タイプ] に [ローカル] を選択しましたが、必要に応じて、任意のリモート ホストに [リモート] を選択することもできます。リモート ホストで行う場合は、[接続文字列] フィールドでその基準を指定する必要があります。手順 1 に従った場合、接続文字列は既に設定され、接続されています。
[データベース] フィールドで、正しいデータベースが選択されていることを確認します。ここでは、sammy を指定しています。 On error オプションを使用すると、ステップの実行時にエラーが発生した場合に pgAgent の応答をカスタマイズできます。この場合、ステップの処理中にエラーが発生した場合に通知しないを選択しました。繰り返しになりますが、メモを追加したい場合は、[コメント] ボックスに追加できます。
同じ [ステップ] タブ内には、[コード] タブもあります。この例のように [バッチ] を選択した場合は、その [コード] タブに移動します。このタブに入ると、PostgreSQL コマンドを挿入するための空の行があります。ここで、独自のバックアップ コマンドをカスタム オプション セットに置き換えることができます。任意の有効なコマンドが受け入れられます。
このチュートリアルでは、pg_dump
コマンドを使用して Postgres データベース sammy をバックアップします。このコマンドには、特定のユーザー名、データベース名、および --clean
フラグを含めます。これは、出力前にデータベース オブジェクトをドロップまたは「クリーニング」することで pg_dump
を支援します。作成されるすべてのコマンド. --file
フラグには、バックアップ ファイルが保存される正確な場所を指定します. このステートメントの最後の部分 date +%Y-% m-%d-%H-%M-%S
は、バックアップごとに日付と複数のファイルを動的に生成することです. そうしないと、バックアップ ファイルが常に上書きされ、既存のファイルが上書きされます. このようにして、スケジュールした指定した時間または日付のバックアップ ファイルのそれぞれを追跡します。完全なコマンドは次のようになります。
pg_dump --username=sammy --dbname=sammy --clean --file=/home/sammy/backup-`date +%Y-%m-%d-%H-%M-%S`.sql
注: バックアップ ファイルを別の場所に保存する場合は、選択したディレクトリへの絶対パスを使用してください。たとえば、~/
は通常、/home/sammy/
のホーム ディレクトリを指しますが、この場合、pg_dump
には次の絶対パスが必要です。 /home/サミー/
.
バックアップ コマンドを追加したら、[スケジュール] というラベルの付いたタブに移動できます。ステップを設定するときと同様に、+ 記号をクリックしてスケジュールを追加し、希望する名前を入力して、ごみ箱アイコンの横にある鉛筆アイコンをクリックしてオプションを展開します。 [全般] タブの下に、入力した名前が表示されます。この例では、schedule1 です。ここでも、Enabled の場合、スケジュールが適切に実行されるように、デフォルトで on スイッチに設定されています。 [開始] および [終了] オプションで、スケジュールされたジョブの開始日と終了日と時刻を指定します。スケジュールされたジョブをテストするため、現在の時刻が Start と End の範囲内にあることを確認してください。必要に応じて、コメントにメモを追加してください。
[繰り返し] タブに進みます。ここで、このスケジュールされたジョブを実行する頻度をカスタマイズできます。週、月、日、時間、または分をできるだけ具体的に指定できます。選択しない場合は、[すべて選択] を選択したのと同じになることに注意してください。したがって、平日を空白のままにすると、スケジュールではすべての平日が考慮されます。同様に、Times では、時間または分を空白のままにすることができます。これは、すべてを選択することと同じです。時間は cron スタイルの形式であることに注意してください。この例では、毎分バックアップを生成するには、毎分 (00 から 59) を選択する必要があります。これを実証するために、[すべて選択] を数分間選択しました。すべての分が表示されますが、空白のままにしても同じ結果が得られます。
ジョブを実行したくない日や時間がある場合は、より詳細なタイム スケジュールを作成するか、[例外] タブに移動してこれを設定できます。
注: ジョブもスケジュールに基づいて実行されるため、ジョブが変更されるたびに、スケジュールされたランタイムが再計算されます。これが発生すると、pgAgent は過去にスケジュールされたランタイム値についてデータベースをポーリングし、そこから、通常は指定された開始時刻の 1 分以内に開始します。問題が発生した場合、pgAgent が再起動すると、設定した通常のスケジュールに戻ります。
実行するスケジュールの設定とカスタマイズが完了したら、[保存] ボタンを押します。新しい pgAgent ジョブが、左側のツリー コントロールにジョブの名前とともに表示されます。この例では、sammy_backup が表示され、その下にスケジュールとステップがリストされています。
pgAgent ジョブが正常に作成されたので、次のステップでは、pgAgent ジョブが正常に実行されていることを確認する方法について学習します。
ステップ 5 — pgAgent ジョブの検証
データベースのバックアップ ファイルを毎分作成するスケジュールされたジョブが、いくつかの方法で機能しているかどうかを確認できます。 pgAdmin では、左側のツリー コントロールに移動し、sammy_backup をクリックします。そこから、[統計] というラベルの付いたタブに進みます。 [統計] ページには、次のようにスケジュールされたジョブの各インスタンスが一覧表示されます。
統計はすぐに表示または更新されない場合があるため、別の場所に移動するか、ブラウザーを更新する必要がある場合があることに注意してください。ジョブは設定された間隔で実行されるようにスケジュールされていることに注意してください。定期的またはより長い日付または時刻を設定する場合は、この点に注意してください。
コマンド ラインからジョブが機能していることを確認したい場合は、ls ~
コマンドを実行してホーム ディレクトリ ファイルを一覧表示できます。このチュートリアルでは、手順 4 で pg_dump
コマンドを記述するときに、このホーム ディレクトリに正確な場所を設定しました。
- ls ~
出力には、保存されているバックアップ ファイルの各インスタンスが一覧表示されます。
ステップ 6 — pgAgent ジョブの変更、無効化、削除、および手動実行 (オプション)
pgAgent は、ジョブの変更または無効化に関して柔軟性を提供します。 pgAdmin を使用して、特定の pgAgent ジョブ (この場合は sammy_backup) に移動できます。次に、右クリックして、リストから [プロパティ] オプションを選択します。ここから、上部の鉛筆アイコンを押してジョブを変更できます。
[プロパティ] で鉛筆アイコンを押すと、[スケジュール] タブに移動して、次のようにジョブを無効にすることができます。
さらに、左側のツリー コントロールから pgAgent ジョブを右クリックすると、DELETE/DROP 選択を選択してジョブを完全に削除できます。ジョブを手動で実行する場合は、同じ手順を繰り返すことができますが、今回はリストから [今すぐ実行] を選択します。
これらは pgAgent を使用してジョブをスケジュールする関数のほんの一部ですが、他にも多くの可能性があります。たとえば、特に pg_dumpall --globals only
コマンドを使用して、データベース内のすべてのユーザーとロールのバックアップを作成するジョブをスケジュールすることができます。より複雑なスクリプトをバッチ ジョブで使用することもできます。詳細については、PostgreSQL wiki ページを参照してください。
結論
pgAgent は、データベースの一貫したバックアップなど、より日常的ではあるが必要な日常業務の一部を削減するのに役立つさまざまなジョブのスケジューリングに役立ちます。このツールの使用に慣れたら、複雑なスケジューリングを必要とするマルチステップ ジョブまたは SQL タスクの作成を試すこともできます。詳細については、pgAdmin Web サイトで公式の pgAgent ドキュメントを参照してください。