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時間以上
アップグレード時間はデータサイズとハードウェア性能に大きく依存します。