Debian 実稼働サーバーで PostgreSQL をアップグレードするための完全なソリューション

Debian 実稼働サーバーで PostgreSQL をアップグレードするための完全なソリューション

私はいくつかの Web サイトで Debian 6 (Squeeze) を運用しています。PostgreSQL 9.0 の機能を使用できるように、postgresql バックポートを使用することにしました。9.0 のままで、そのメジャー バージョンへの更新を受け取ると思っていました。

残念ながら、Squueze バックポートは PostgreSQL 9.1 に更新されたため、おそらく 9.0 への更新は受信されないでしょう。

9.1 にアップグレードする予定ですが、自動的には行われないことはわかっています。

公式の pg_upgrade と debian の pg_upgradecluster について読みましたが、アップグレードの完全なガイドがあれば幸いです。

  1. 実行すべき手順は何ですか (最初に apt-get install postgresql、次に pg_upgradecluster、最後に古いクラスターを削除します)? 手順のリストがあると便利です。
  2. 考えられる障害シナリオは何ですか?
  3. 失敗に備え、それに対処するにはどうすればよいでしょうか?

データベースを停止できるのは数時間だけなので、準備しておきたい

答え1

状況や環境に合わせた段階的なアップグレード プロセスを提供するのはかなり困難です。
以下にいくつかの重要な点を取り上げましたが、実際にはプロセスを環境に合わせて調整する必要があります。


ステップ 0 では、アップグレードが必要かどうかを決定します。Postgres 9.1 には、同期レプリケーションや、必要な場合には便利なその他の優れた機能が多数含まれていますが、必要がない場合はすぐにアップグレードする必要はありません。

ステップ 1: データベースが大きい場合は、時間がかかることを想定してください。バックアップ用にデータをコピーするという単純なプロセス
でも、pg_upgradeしばらく時間がかかります。16 GB のデータベースでは、pg_dump/pg_restore に 1 時間以上、pg_upgrade に約 10 ~ 20 分かかります。

ステップ2、9.1 リリースノート必要なものが壊れていないこと、使用しているものが変更されていないことを確認してください。
データベースのアップグレードによって実稼働システムが破壊され、1 か月が台無しになることはありません。

ステップ3、Postgresマニュアルのアップグレードセクション必読です。

ステップ 4 (Debian 固有のものをここに挿入しますが、それは私の得意分野ではありません :-)

ステップ 5: アップグレード プランを作成します。

ステップ6、アップグレード計画をテストする(技術的にはオプションですが、強く推奨)。

ステップ 7: 運用システムでアップグレードを実行します。


標準的な注意事項が適用されます:

  • アップグレードするとデータベースが破壊される可能性があります。バックアップを作成してください。
    • 必ず復元できることを確認してください。
    • 復元できることを確認してくださいバイナリデータベース システムも同様です。
      (可能であれば、古い Debian パッケージを保持してください。古いデータベース バイナリがなくなったためにアップグレードの失敗から取り消せない人を見たことがありますが、これは実に悲しい光景です。)

  • 予想よりも時間がかかります。これを考慮に入れて計画を立ててください。
    私の会社の DB アップグレード ポリシーは、「金曜日の午後 6 時に開始します。日曜日の午前 9 時までに動作しない場合はロールバックします。」です。

  • スクラッチ モンキーをマウントする
    データが本当に重要な場合は、そのコピーを別の場所に復元し、アップグレード パスをテストします。
    はい、私は 16 GB のデータベースでこれを行います。 うまく機能する方法が見つかったら、160 GB のデータベースでもこれを行います :-)

答え2

これは基本的にステップ 4 です ---checkパスが正しいことを確認するオプションも追加されています。私のインストールはリポジトリから行われ、ファイルには標準の Debian パスがあります。

[email protected]:~$ /usr/lib/postgresql/9.1/bin/pg_upgrade --old-datadir /var/lib/postgresql/9.0/main --new-datadir /var/lib/postgresql/9.1/main --old-bindir /usr/lib/postgresql/9.0/bin/ --new-bindir /usr/lib/postgresql/9.1/bin/ --check

上記は失敗しました - 両方のサーバーを同じポートで実行していると一貫して表示されました。

次の方法が機能するようです:

pg_dumpall -p 5432 | psql -d postgres -p 6543

これは便利です

関連情報