Postgresアップデート


PostgreSQL 13から17への安全なアップグレード手順
事前準備(必須)
1. 現在の環境確認
sql-- PostgreSQLバージョン確認
SELECT version();

-- データベース一覧確認
\l

-- 接続中のユーザー確認
SELECT * FROM pg_stat_activity;
2. 完全バックアップの取得
bash# 全データベースのバックアップ
pg_dumpall -U postgres -h localhost > /backup/postgresql_13_full_backup.sql

# 個別データベースのバックアップ(重要なDBがある場合)
pg_dump -U postgres -d your_database_name > /backup/your_database_backup.sql

# バックアップファイルの確認
ls -la /backup/
3. 設定ファイルのバックアップ
bash# postgresql.confのバックアップ
cp /etc/postgresql/13/main/postgresql.conf /backup/postgresql.conf.backup

# pg_hba.confのバックアップ
cp /etc/postgresql/13/main/pg_hba.conf /backup/pg_hba.conf.backup

# その他設定ファイル
cp -r /etc/postgresql/13/ /backup/postgresql_13_config/
4. 拡張機能の確認
sql-- インストール済み拡張機能の確認
SELECT * FROM pg_extension;

-- 拡張機能の詳細情報
\dx+
PostgreSQL 17のインストール
5. PostgreSQL 17のパッケージインストール
bash# Ubuntu/Debianの場合
# PostgreSQL公式リポジトリの追加
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

# パッケージリストの更新
sudo apt update

# PostgreSQL 17のインストール
sudo apt install postgresql-17 postgresql-client-17 postgresql-contrib-17

# CentOS/RHEL/Fedoraの場合
# PostgreSQL公式リポジトリの追加
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# PostgreSQL 17のインストール
sudo dnf install postgresql17-server postgresql17-contrib
6. PostgreSQL 17の初期化(まだ開始しない)
bash# Ubuntu/Debianの場合は自動で初期化される
# CentOS/RHELの場合のみ手動初期化が必要
sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
アップグレード実行
7. 両バージョンのサービス停止
bash# PostgreSQL 13の停止
sudo systemctl stop postgresql@13-main  # Ubuntu/Debian
# または
sudo systemctl stop postgresql-13       # CentOS/RHEL

# PostgreSQL 17の停止(念のため)
sudo systemctl stop postgresql@17-main  # Ubuntu/Debian
# または
sudo systemctl stop postgresql-17       # CentOS/RHEL
8. pg_upgradeを使用したアップグレード
bash# postgres ユーザーに切り替え
sudo -u postgres -i

# アップグレードの互換性チェック(重要)
/usr/lib/postgresql/17/bin/pg_upgrade \
    --old-datadir=/var/lib/postgresql/13/main \
    --new-datadir=/var/lib/postgresql/17/main \
    --old-bindir=/usr/lib/postgresql/13/bin \
    --new-bindir=/usr/lib/postgresql/17/bin \
    --old-options '-c config_file=/etc/postgresql/13/main/postgresql.conf' \
    --new-options '-c config_file=/etc/postgresql/17/main/postgresql.conf' \
    --check

# チェックが成功したら実際のアップグレード実行
/usr/lib/postgresql/17/bin/pg_upgrade \
    --old-datadir=/var/lib/postgresql/13/main \
    --new-datadir=/var/lib/postgresql/17/main \
    --old-bindir=/usr/lib/postgresql/13/bin \
    --new-bindir=/usr/lib/postgresql/17/bin \
    --old-options '-c config_file=/etc/postgresql/13/main/postgresql.conf' \
    --new-options '-c config_file=/etc/postgresql/17/main/postgresql.conf'
9. 設定ファイルの移行
bash# PostgreSQL 17の設定ファイルに必要な設定を反映
sudo cp /backup/postgresql.conf.backup /etc/postgresql/17/main/postgresql.conf
sudo cp /backup/pg_hba.conf.backup /etc/postgresql/17/main/pg_hba.conf

# ポート番号の調整(必要に応じて)
sudo nano /etc/postgresql/17/main/postgresql.conf
# port = 5432 に設定
アップグレード後の作業
10. PostgreSQL 17の起動と確認
bash# PostgreSQL 17の起動
sudo systemctl start postgresql@17-main  # Ubuntu/Debian
# または
sudo systemctl start postgresql-17       # CentOS/RHEL

# 起動確認
sudo systemctl status postgresql@17-main

# PostgreSQLに接続してバージョン確認
sudo -u postgres psql -c "SELECT version();"
11. データ整合性の確認
sql-- 全データベースの確認
\l

-- 各データベースに接続して確認
\c your_database_name

-- テーブル一覧確認
\dt

-- 重要なテーブルのレコード数確認
SELECT COUNT(*) FROM important_table;

-- 拡張機能の確認
\dx
12. 統計情報の更新
bash# 統計情報の更新(重要)
sudo -u postgres /usr/lib/postgresql/17/bin/vacuumdb --all --analyze-in-stages

# または個別実行
sudo -u postgres psql -d your_database_name -c "ANALYZE;"
13. 自動起動の設定
bash# PostgreSQL 17の自動起動を有効化
sudo systemctl enable postgresql@17-main  # Ubuntu/Debian
# または
sudo systemctl enable postgresql-17       # CentOS/RHEL

# PostgreSQL 13の自動起動を無効化
sudo systemctl disable postgresql@13-main  # Ubuntu/Debian
# または
sudo systemctl disable postgresql-13       # CentOS/RHEL
最終確認とクリーンアップ
14. アプリケーションの動作確認
bash# アプリケーションを再起動して動作確認
# 接続文字列やポート番号の確認
# 重要な機能の動作テスト
15. 古いクラスタのクリーンアップ(慎重に)
bash# 数日間正常動作を確認後に実行
# PostgreSQL 13のデータディレクトリを削除
# sudo rm -rf /var/lib/postgresql/13/

# PostgreSQL 13パッケージの削除(オプション)
# sudo apt remove postgresql-13 postgresql-client-13  # Ubuntu/Debian
# sudo dnf remove postgresql13-server postgresql13     # CentOS/RHEL
トラブル時の復旧手順
問題が発生した場合
bash# PostgreSQL 17を停止
sudo systemctl stop postgresql@17-main

# PostgreSQL 13を再起動
sudo systemctl start postgresql@13-main

# バックアップからの復元
sudo -u postgres psql < /backup/postgresql_13_full_backup.sql
重要な注意点

事前テスト: 本番環境での実行前に、必ずテスト環境で同じ手順を実行する
メンテナンス時間: アップグレードは必ずメンテナンス時間中に実行する
監視: アップグレード後数日間は特に注意深く監視する
バックアップ保持: 古いバックアップは最低1週間は保持する
拡張機能: カスタム拡張機能がある場合は、PostgreSQL 17対応版が必要

所要時間の目安

小規模DB(1GB未満): 30分〜1時間
中規模DB(1-10GB): 1-3時間
大規模DB(10GB以上): 3時間以上

アップグレード時間はデータサイズとハードウェア性能に大きく依存します。