ジョンとの共存など、多くの作業工程で人為的ミスが発生しがちです。本記事では、PostgreSQLのインストール・削除・確認を1本のシェルスクリプトで自動化する方法を解説します。
特定バージョンの導入から、複数バージョンの共存管理、不要なバージョンのアンインストールまでをスムーズに行える仕組みとなっており、現場の手作業を極力排除した再現性の高い構成になっています。
概要と目的
PostgreSQLを複数バージョンで運用している現場では、バージョンごとのポート設定や、重複インストールの防止、削除時の依存関係など、煩雑な作業が日常的に発生します。
手動対応ではヒューマンエラーが避けられず、構成の一貫性が損なわれるケースもあります。
本記事では、こうした問題を解決するために開発したシェルスクリプトの概要と、その運用上の目的について解説します。
PostgreSQLの複数バージョン管理の課題
複数バージョンのPostgreSQLを同一ホスト上で扱う場合、以下のような問題が発生しやすくなります。
- どのバージョンがどのポートで動作しているかを把握しづらい
- 誤って同一ポートに重複インストールしてしまう
- 不要なバージョンの削除が手間で後回しになりがち
このような状況が継続すると、セキュリティパッチの適用漏れや構成管理の煩雑化など、システム全体の安定性に悪影響を及ぼします。
スクリプト導入による運用改善の効果
本スクリプトを導入することで、以下のような具体的な改善効果が得られます。
- 導入済みのPostgreSQLバージョンとポート一覧を自動取得
- 競合ポートを事前に検出してインストールをブロック
- 指定バージョンの安全なアンインストール処理
これにより、バージョン管理の一貫性を維持しつつ、操作ミスを未然に防ぎ、属人化した作業を排除できます
スクリプト設計と仕様
このスクリプトは、PostgreSQLのバージョンごとのインストールや削除、そして既存環境の一覧取得を効率的に行うために設計されています。現場での複数バージョン共存や、ポート競合の問題などを解決する目的で構築されたもので、再利用性とメンテナンス性を重視しています。
前提となる実行環境
Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。
実行環境
BASE_DIR(任意のディレクトリ)
- scripts
- bin(実行スクリプト格納領域)
- <<各種実行スクリプト>>.sh (実行ファイル)
- com(共通スクリプト格納領域)
- logger.shrc(共通ログ出力ファイル)
- utils.shrc(共通関数定義ファイル)
- etc(設定ファイル等の格納領域)
- infraMessage.conf(メッセージ定義ファイル)
- log(スクリプト実行ログの格納領域)
- スクリプト名.log
- tmp(テンポラリ領域)
- rep(レポート出力領域)
- bin(実行スクリプト格納領域)
PostgreSQL自動構成スクリプト
PostgreSQL自動構成スクリプトは、複数バージョンのPostgreSQLを環境に合わせて導入・削除・一覧表示することができる汎用的なツールです。ポート競合の検出や、バージョン別のディレクトリ配置、自動的なサービス登録など、開発環境での運用に必要な基本機能をすべて備えています。クラスタ構成のような複雑な環境には対応していませんが、スタンドアロンでの開発用途には十分な機能を提供します。スクリプトは冪等性を重視して設計されており、安全かつ再現性のある導入作業が可能です。
注意(重要)
本スクリプトは RHEL/AlmaLinux 8 および 9 環境での動作を前提に検証しています。
AlmaLinux 10(RHEL 10 系)では、PostgreSQL 公式 PGDG リポジトリの EL10 向け提供状況によっては、インストールやバージョン共存機能が正常に動作しない場合があります。
AlmaLinux 10 上での実行は動作保証外とし、利用時は自己責任でお願いします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 |
#!/bin/sh #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # # install_postgres.sh # # Description: # PostgreSQL バージョン共存対応の導入/一覧/削除ツール # - RHEL8/9 対応 # - PGDG リポジトリ自動登録(10〜16) # - logger.shrc / utils.shrc に準拠 # # PATCH v1.6b (2025‑08‑04) # * dnf-plugins-core 事前導入 # * makecache / install / initdb に進捗ログ # * ソケット競合確認強化 # * **重複していた os_major 取得行を 1 行に統一** ← NEW # ------------------------------------------------------------------ # <変更履歴> # Ver. 変更管理No. 日付 更新者 変更内容 # 1.0 - 2025/08/04 Bepro 新規作成 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ # ------------------------------------------------------------------ # 初期処理 # ------------------------------------------------------------------ . "$(dirname "$0")/../com/logger.shrc" . "$(dirname "$0")/../com/utils.shrc" setLANG utf-8 runAs root "$@" # ------------------------------------------------------------------ # 変数宣言 # ------------------------------------------------------------------ scope="var" # ------------------------------------------------------------------ # PostgreSQL初期パスワード設定(※任意のパスワードを設定してください) # この変数はインストール直後のpostgresユーザーのログイン用パスワードです。 # セキュリティ上の理由から、ダウンロード後に必ず自分で設定してください。 # ------------------------------------------------------------------ POSTGRES_PASS="P@ssW0rd" # ← ここを任意の安全なパスワードに書き換えてください readonly JOB_OK=0 readonly JOB_WR=1 readonly JOB_ER=2 rc=${JOB_ER} MODE="" VERSION="" PORT="" # ------------------------------------------------------------------ # 関数定義 # ------------------------------------------------------------------ scope="func" usage() { cat << EOF Usage: sh install_postgres.sh -m < install | erase | list > [-v <version>] [-p <port>] Options: -m 処理モード(install, erase, list)※必須 -v PostgreSQLのメジャーバージョン番号(例: 15, 16) -p 使用するポート番号(デフォルト: 5432) EOF exit ${JOB_ER} } terminate() { releaseLock } checkArgs() { case "$MODE" in list) : ;; install|erase) [ -z "$VERSION" ] && usage ;; *) usage ;; esac [ -z "$PORT" ] && PORT=5432 if echo "$PORT" | grep -qE "[^0-9]"; then logOut "ERROR" "ポート番号は数値で指定してください。" exitLog ${JOB_ER} fi if [ -n "$VERSION" ] && [ "$MODE" != "list" ] && [ "$VERSION" -lt 14 ]; then logOut "ERROR" "PostgreSQL ${VERSION} 系はサポート対象外です (14 以上を指定)" exitLog ${JOB_ER} fi } # ------------------------------------------------------------------ # 関数名 :getRepoUrl # 概要 :PostgreSQLのリポジトリURLを取得する # 説明 : # 指定されたバージョンとRHELのバージョンに応じて、対応する # yumリポジトリのrpmパッケージURLを返却する。 # # 引数 :$1 = PostgreSQLバージョン # 戻り値 :標準出力でリポジトリURLを返す # 使用箇所 :installPostgres # ------------------------------------------------------------------ getRepoUrl() { local rhel_ver rhel_ver=$(rpm -E %rhel) echo "https://download.postgresql.org/pub/repos/yum/reporpms/EL-${rhel_ver}-x86_64/pgdg-redhat-repo-latest.noarch.rpm" } # ------------------------------------------------------------------ # 関数名 :installPgRepo # 概要 :PostgreSQL用リポジトリを確認・追加 # 説明 : # 指定バージョンの PostgreSQL リポジトリが未登録であれば、 # 公式リポジトリを取得して自動で登録します。 # 既に有効であればスキップされます。 # # 引数 :なし(グローバル変数 VERSION を参照) # 戻り値 :正常時 0、失敗時は exitLog で強制終了 # 使用箇所 :installPostgres() # ------------------------------------------------------------------ installPgRepo() { logOut "INFO" "PostgreSQL ${VERSION} のPGDGリポジトリを登録します。" case "$VERSION" in 10|11|12|13|14|15|16) ;; *) logOut "ERROR" "PostgreSQL ${VERSION} 系はサポート対象外です"; exitLog ${JOB_ER};; esac # 既存設定削除(外部URL依存のrepoを排除) rm -f /etc/yum.repos.d/pgdg*.repo dnf -y remove pgdg-redhat-repo >/dev/null 2>&1 || true # RHELメジャー取得 local rhel_ver rhel_ver=$(rpm -E %rhel) # GPGキーをローカル固定(失敗時は gpgcheck=0 にフォールバック) local gpg_file="/etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL" local gpg_line="" mkdir -p /etc/pki/rpm-gpg if curl -fsSL -o "${gpg_file}" "https://apt.postgresql.org/pub/repos/yum/keys/PGDG-RPM-GPG-KEY-RHEL"; then rpm --import "${gpg_file}" || { logOut "WARNING" "GPG鍵のimportに失敗。gpgcheck=0へ切替"; gpg_line="gpgcheck=0"; } [ -z "${gpg_line}" ] && gpg_line="gpgcheck=1 gpgkey=file://${gpg_file}" else logOut "WARNING" "GPG鍵の取得に失敗。gpgcheck=0へ切替します。" gpg_line="gpgcheck=0" fi # 外部鍵URLを一切使わない .repo を手動生成 local repo_file="/etc/yum.repos.d/pgdg${VERSION}.repo" cat > "${repo_file}" <<EOF [pgdg${VERSION}] name=PostgreSQL ${VERSION} for RHEL/CentOS ${rhel_ver} - x86_64 baseurl=https://download.postgresql.org/pub/repos/yum/${VERSION}/redhat/rhel-${rhel_ver}-x86_64 enabled=1 ${gpg_line} EOF # EL-9未満のみAppStreamのpostgresqlを無効化 if [ "${rhel_ver}" -lt 10 ]; then dnf -qy module disable postgresql || true fi dnf clean all dnf makecache --disablerepo='*' --enablerepo="pgdg${VERSION}" -y if ! dnf list --available --disablerepo='*' --enablerepo="pgdg${VERSION}" "postgresql${VERSION}-server" >/dev/null 2>&1; then logOut "ERROR" "postgresql${VERSION}-server が見えません(repo設定を確認)" exitLog ${JOB_ER} fi logOut "INFO" "PGDGリポジトリ登録OK(gpgkeyはローカル固定/外部鍵URL非依存)。" } # ------------------------------------------------------------------ # 関数名 :checkPortConflict # 概要 :PostgreSQLポート競合の事前検出 # 説明 : # PostgreSQLインストール前に、指定ポートが既存インスタンスや # 設定ファイルと競合していないかを確認する。 # 以下2点の競合パターンを検出: # - postgresql.conf ファイル内で既に使用されている # - 現在 LISTEN 中のプロセス(postgres)で使用中 # # 引数 :なし(グローバル変数 PORT を使用) # 戻り値 :競合がなければ0、競合があれば exitLog で異常終了 # 使用箇所 :installPostgres 関数内のインストール前検査 # ------------------------------------------------------------------ checkPortConflict() { conf_files=$(find /var/lib/pgsql -type f -name "postgresql.conf" 2>/dev/null) for conf in $conf_files; do used_port=$(grep -E "^port\s*=" "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}') [ -z "$used_port" ] && used_port="5432" if [ "$used_port" = "$PORT" ]; then logOut "ERROR" "指定ポート${PORT}は他バージョンの設定ファイルと競合しています($conf)" exitLog ${JOB_ER} fi done if ss -ltnp 2>/dev/null | grep -q ":${PORT} .*postgres"; then logOut "ERROR" "指定ポート${PORT}は既に PostgreSQL プロセスが LISTEN しています。" exitLog ${JOB_ER} fi } # ------------------------------------------------------------------ # 関数名 :installPostgres # 概要 :PostgreSQLの指定バージョン・ポートへの自動インストール処理 # 説明 : # 指定された PostgreSQL のバージョンとポートに対して、 # pgdg レポジトリ追加、dnf によるパッケージインストール、initdb、 # postgresql.conf のポート書き換え、systemd 起動、初期パスワード設定までを自動化。 # 主な処理内容: # - 同一バージョンの既インストールを検出してブロック # - 指定ポートの競合チェック(checkPortConflict) # - pgdg リポジトリの有効化とキャッシュ更新 # - PostgreSQL 本体のインストールと initdb # - 設定ファイルのポート書き換えと systemctl 起動 # - postgresユーザーの初期パスワード設定 # # 引数 :なし(グローバル変数 VERSION, PORT を使用) # 戻り値 :正常終了なら rc=${JOB_OK}、エラー時は exitLog で強制終了 # 使用箇所 :mainプロセス(install 指定時) # ------------------------------------------------------------------ installPostgres() { checkPortConflict # ------------------------------------------------------------------ # PostgreSQL同一バージョンのインストールチェック # ------------------------------------------------------------------ if rpm -q "postgresql${VERSION}-server" >/dev/null 2>&1; then logOut "WARNING" "PostgreSQL ${VERSION} は既にインストールされています。同一バージョンの再インストールは許可されていません。" exitLog ${JOB_ER} fi if ! dnf list --quiet --disablerepo='*' --enablerepo="pgdg*" postgresql${VERSION}-server >/dev/null 2>&1; then installPgRepo logOut "INFO" "dnf makecache を実行してキャッシュを更新します。" dnf makecache --disablerepo='*' --enablerepo="pgdg*" -y fi logOut "INFO" "(2/3) postgresql${VERSION}-server をダウンロード / インストール中…" if ! dnf -y install --disablerepo='*' --enablerepo="pgdg*" "postgresql${VERSION}-server"; then logOut "ERROR" "指定バージョンのパッケージが取得できません: postgresql${VERSION}-server" exitLog ${JOB_ER} fi logOut "INFO" "(3/3) initdb を実行中…" /usr/pgsql-${VERSION}/bin/postgresql-${VERSION}-setup initdb || exitLog ${JOB_ER} conf_path="/var/lib/pgsql/${VERSION}/data/postgresql.conf" sed -i "s/^#\?port = .*/port = ${PORT}/" "$conf_path" if ss -ltnp 2>/dev/null | grep -q ":${PORT} .*postgres"; then logOut "ERROR" "initdb 後にポート${PORT}が既に使用されています。処理を中止します。" exitLog ${JOB_ER} fi systemctl enable postgresql-${VERSION} systemctl start postgresql-${VERSION} logOut "INFO" "初期ユーザーパスワードを設定します。" query="ALTER USER postgres WITH PASSWORD '${POSTGRES_PASS}';" eval "su - postgres -c \"psql -p ${PORT} -c \\\"${query}\\\"\"" || exitLog ${JOB_ER} logOut "INFO" "PostgreSQL ${VERSION} をポート ${PORT} でインストール完了" rc=${JOB_OK} } # ------------------------------------------------------------------ # 関数名 :erasePostgres # 概要 :PostgreSQLの指定バージョンをアンインストールする # 説明 : # systemd に登録されている指定バージョンの PostgreSQL を停止・無効化し、 # dnf 経由で該当バージョンのすべてのパッケージを削除。 # さらに PostgreSQL データディレクトリも削除する。 # 処理対象は /var/lib/pgsql/${VERSION}。 # ※指定バージョンが未インストールであれば即時エラー終了。 # # 引数 :なし(グローバル変数 VERSION を使用) # 戻り値 :正常終了なら rc=${JOB_OK}、エラー時は exitLog により終了 # 使用箇所 :mainプロセス(-m erase 指定時) # ------------------------------------------------------------------ erasePostgres() { service="postgresql-${VERSION}" if ! systemctl list-unit-files | grep -q "${service}\.service"; then logOut "ERROR" "PostgreSQL ${VERSION} は導入されていません。" exitLog ${JOB_ER} fi systemctl stop "$service" systemctl disable "$service" dnf -y remove "postgresql${VERSION}-*" || true rm -rf "/var/lib/pgsql/${VERSION}" logOut "INFO" "PostgreSQL ${VERSION} を削除しました。" rc=${JOB_OK} } # ------------------------------------------------------------------ # 関数名 :listPostgres # 概要 :インストール済みPostgreSQLインスタンスの一覧表示 # 説明 : # /var/lib/pgsql 以下を探索し、各バージョンの postgresql.conf を検出。 # 検出された設定ファイルごとに以下の情報を抽出して一覧表示する: # - バージョン(パス構造から抽出) # - ポート番号(設定ファイル内の port ディレクティブ) # port が未設定の場合はデフォルトの 5432 とみなす。 # 設定ファイルが1つも見つからなかった場合は未導入と判断。 # # 引数 :なし # 戻り値 :rc=${JOB_OK} # 使用箇所 :mainプロセス(-m list 指定時) # ------------------------------------------------------------------ listPostgres() { confs=$(find /var/lib/pgsql -type f -name "postgresql.conf" 2>/dev/null) if [ -z "$confs" ]; then logOut "INFO" "PostgreSQLは導入されていません。" rc=${JOB_OK} return fi echo "--- Installed PostgreSQL Instances ---" for conf in $confs; do ver=$(echo "$conf" | awk -F/ '{print $(NF-2)}') port=$(grep -E '^port[[:space:]]*=' "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}') [ -z "$port" ] && port="5432" echo "Version: $ver => Port: $port" done rc=${JOB_OK} } # ------------------------------------------------------------------ # pre-process # ------------------------------------------------------------------ scope="pre" startLog trap "terminate" 0 1 2 3 15 while getopts "m:v:p:" opt; do case "$opt" in m) MODE="$OPTARG" ;; v) VERSION="$OPTARG" ;; p) PORT="$OPTARG" ;; *) usage ;; esac done checkArgs "$@" if acquireLock; then logOut "INFO" "Lock acquired." else abort "Lock acquisition failed." fi # ------------------------------------------------------------------ # main-process # ------------------------------------------------------------------ scope="main" case "$MODE" in install) installPostgres ;; erase) erasePostgres ;; list) listPostgres ;; *) usage ;; esac # ------------------------------------------------------------------ # post-process # ------------------------------------------------------------------ scope="post" exitLog $rc |
パスワードはソースコード内の変数 POSTGRES_PASS に設定してください。環境やセキュリティポリシーに応じて、必要に応じて変更してください。
ディレクトリ構成と依存ファイル
スクリプトは特定のディレクトリ構成を前提とし、共通関数やログ出力処理を読み込むことで一貫した動作を確保しています。
ディレクトリ | 役割 |
---|---|
scripts/bin | 実行スクリプト本体(install_postgres.shなど)を配置 |
scripts/com | 共通関数ファイル(utils.shrc, logger.shrc)を配置 |
scripts/tmp | ロックファイルなど一時ファイルの格納場所 |
依存ファイルとして以下を必ず配置しておく必要があります。
- logger.shrc:ログ出力を制御
- utils.shrc:共通関数(runAs, getOsなど)を提供
処理モードと引数仕様
このスクリプトは処理モードを引数で指定し、動作内容を切り替える方式を採用しています。
モード | 説明 |
---|---|
install | 指定されたバージョンのPostgreSQLを導入 |
erase | 指定されたバージョンのPostgreSQLを削除 |
list | 導入済みバージョンとポートの一覧を表示 |
引数の指定例は以下のとおりです。
sh install_postgres.sh -m install -v 14 -p 5433
オプション | 必須 | 説明 |
---|---|---|
-m | 必須 | 実行モード(install, erase, list) |
-v | install, erase時に必須 | PostgreSQLのバージョン(例:14) |
-p | install時に任意 | 使用するポート番号(未指定時は5432) |
グローバル変数とログ出力方式
スクリプト内ではジョブステータスや一貫性を保つためのグローバル変数を定義し、ログ出力はlogger.shrcに準拠しています。
主なグローバル変数の定義は以下の通りです。
変数名 | 用途 |
---|---|
JOB_OK | 正常終了時の戻り値(0) |
JOB_ER | 異常終了時の戻り値(1) |
LOCK_FILE | 同時実行防止用ロックファイル |
ログ出力は以下の形式で統一されており、ログレベル、処理ステージ、メッセージが記録されます。
logOut "INFO" "PostgreSQL 14 のインストールを開始します"
logOut "ERROR" "指定ポート5432はすでに使用されています"
このように、ログ出力は自作loggerに集約されており、トレース性とデバッグ性を確保しています。
今回は開発環境における個別のデータベース利用を想定しているため、同一バージョンのPostgreSQLを複数クラスタとして並列にインストールするような構成には対応しておりません。
処理ロジックの詳細
このセクションでは、PostgreSQLインストールスクリプトにおける各モードの処理ロジックについて詳しく説明します。 install、 erase、 list の各モードはそれぞれ異なる目的で動作し、環境や指定パラメータに応じて適切に切り替わる仕組みになっています。
installモードの処理フロー
installモードでは、指定されたバージョンのPostgreSQLをインストールし、ポート番号の競合チェックや初期設定を自動で行います。バージョンやポート指定がない場合のデフォルト値にも対応しています。
sh install_postgres.sh -m install -v 14 -p 5433
指定バージョンのPostgreSQLリポジトリ追加とパッケージ導入
導入モードの処理
- 同一ポート利用中のインスタンスチェック
- 初期化・設定ファイルの配置
- systemdへの登録およびサービス起動
- postgresユーザーの初期パスワード設定
eraseモードの処理フロー
eraseモードでは、指定バージョンのPostgreSQLをシステムから削除します。バージョンを指定しない場合は処理エラーとなるため、必ず明示的にバージョンを与える必要があります。
sh install_postgres.sh -m erase -v 14
処理の主な内容は以下のとおりです。
削除モードの処理
- 該当バージョンのサービス停止とsystemd登録解除
- インストールされたバイナリと設定ファイルの削除
- データディレクトリのバックアップおよび削除
- 競合ポートの再確認(使用中であれば削除を中止)
listモードの処理フロー
listモードは、現在導入済みのPostgreSQLバージョンと、それぞれが使用しているポート番号を一覧表示する機能です。導入されていない場合は適切なメッセージを出力します。
sh install_postgres.sh -m list
処理内容は以下の通りです。
一覧モードの処理
- /var/lib/pgsql 以下に存在する postgresql.conf を再帰的に検索
- 設定ファイルからポート番号とバージョンを抽出
- インストールバージョンとポートを表形式で出力
ポート競合の検出ロジック
PostgreSQLは同一ポートで複数インスタンスを起動することができないため、ポート競合のチェックは必須です。本スクリプトでは install および erase モードの両方でこのチェックが実施されます。
競合チェックの具体的なロジックは以下のとおりです。
競合検出ロジック
- /var/lib/pgsql 以下の postgresql.conf を検索
- 該当ファイル内の port = 行を抽出し、数値を取得
- 要求ポートと一致した場合は競合と判定
- 該当するバージョン・設定ファイル名と共にエラーメッセージを出力
grep -E "^port\s*=" "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}'
この処理により、異なるバージョンであってもポートが重複している場合には即座にエラーを返し、安全性を確保しています。
実行例と活用パターン
このセクションでは、PostgreSQLのインストール・削除・一覧表示といった基本操作に加え、複数バージョンの共存に関する注意点について、具体的なコマンド例を用いて解説します。すべての操作は、専用スクリプトを用いて簡潔に実行できます。
PostgreSQLをインストールする例
PostgreSQLを指定バージョン・任意ポートでインストールするには、下記のように実行します。
sh install_postgres.sh -m install -v 14 -p 5433
バージョン14を5433ポートでインストールする例です。ポート番号の指定がない場合はデフォルトで5432が使用されます。既存のバージョンとポートが競合していないかはスクリプト内で自動的に検出されます。
特定バージョンを削除する例
インストール済みの特定バージョンを削除するには、以下のようにバージョンを指定します。
sh install_postgres.sh -m erase -v 14
必ず-vオプションで削除対象のバージョンを明示してください。削除時にも、競合チェックロジックが走り、安全な削除が実施されます。
導入済みバージョンを一覧表示する例
現在導入されているPostgreSQLのバージョンと使用ポートを一覧表示するには、次のように実行します。
sh install_postgres.sh -m list
出力例:
--- Installed PostgreSQL Instances ---
Version: 15 => Port: 5432
Version: 16 => Port: 5434
Version: 14 => Port: 5433
このコマンドにより、スクリプトが/var/lib/pgsql/配下を探索し、見つかったすべてのインスタンスに対して設定ファイルを読み取り、ポート番号とバージョンの情報を表示します。
複数バージョン共存時の注意点
PostgreSQLは複数バージョンを同一ホスト上に共存させることが可能ですが、ポート競合とパス競合に注意が必要です。スクリプトでは下記のようなロジックで事前検出を行っています。
- 全バージョンの設定ファイル`postgresql.conf`を探索
- 各設定ファイルから`port`値を抽出し、重複をチェック
- 競合が見つかった場合はエラーを出力し、処理を中断
そのため、複数バージョンを導入する際は、必ず-pオプションで異なるポート番号を明示的に指定してください。