Skip to content

Instantly share code, notes, and snippets.

@DaikiSuganuma
Created January 15, 2026 04:08
Show Gist options
  • Select an option

  • Save DaikiSuganuma/cc57348f1331cc0c0fdf15cd58f09304 to your computer and use it in GitHub Desktop.

Select an option

Save DaikiSuganuma/cc57348f1331cc0c0fdf15cd58f09304 to your computer and use it in GitHub Desktop.
MariaDB serverを10.11から11.8にアップグレード
#!/bin/sh
# ==============================================================================
# スクリプト名: MariaDB アップグレードオートメーション (FreeBSD pkg版) v3
# 作成日: 2026-01-11
# 対象環境: FreeBSD 14.3-RELEASE / ZFS / sh (Bourne Shell)
#
# 【修正内容】
# - 文字装飾に printf を使用し、FreeBSD sh での表示崩れを修正
# - pkg search の判定ロジックを緩和し、パッケージ検出エラーを解消
#
# 【概要】
# FreeBSDのpkgシステムを使用してインストールされているMariaDB Serverを
# 安全にメジャーバージョンアップグレードするためのスクリプトです。
#
# 【主な処理フロー】
# 1. 事前チェック (権限、パッケージ存在確認)
# 2. 完全バックアップ
# 3. サービス停止 (ダウンタイム開始)
# 4. パッケージ入替
# 5. サービス起動
# 6. 内部データアップグレード (mariadb-upgrade)
# 7. 統計情報の更新 (ANALYZE TABLE)
# 8. 動作確認
# ==============================================================================
# ------------------------------------------------------------------------------
# 設定変数 (環境に合わせて変更してください)
# ------------------------------------------------------------------------------
# [現在] インストールされているMariaDBの短縮バージョン
# 例: mariadb1011-server なら "1011"
CURRENT_PKG_VER="1011"
# [目標] アップグレード先のMariaDB短縮バージョン
TARGET_PKG_VER="118"
# データベース接続ユーザー
DB_USER="root"
# データベース接続パスワード (.my.cnf 推奨のため通常は空欄)
DB_PASS=""
# バックアップ保存先
BACKUP_DIR="/root/db_backup_pre_upgrade"
# サービス名
SERVICE_NAME="mysql-server"
# ------------------------------------------------------------------------------
# 内部関数・ユーティリティ
# ------------------------------------------------------------------------------
# 色定義
BOLD="\033[1m"
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
CYAN="\033[36m"
RESET="\033[0m"
# ログ出力関数 (printfを使用して文字化けを防止)
log() {
printf "${CYAN}[$(date '+%H:%M:%S')]${RESET} $1\n"
}
# 成功メッセージ
msg_ok() {
printf " ${GREEN}OK${RESET}: $1\n"
}
# 警告メッセージ
msg_warn() {
printf " ${YELLOW}WARNING${RESET}: $1\n"
}
# フェーズヘッダー表示
print_phase() {
printf "\n"
printf "${BOLD}==========================================================${RESET}\n"
printf "${BOLD} $1 ${RESET}\n"
printf "${BOLD}==========================================================${RESET}\n"
}
# エラー終了関数
error_exit() {
printf "\n"
printf "${RED}【エラー】 $1${RESET}\n"
printf "処理を中断します。ログや状態を確認してください。\n"
exit 1
}
# DBコマンド実行ラッパー
run_db_cmd() {
if [ -n "$DB_PASS" ]; then
"$@" --user="$DB_USER" --password="$DB_PASS"
else
"$@" --user="$DB_USER"
fi
}
# ------------------------------------------------------------------------------
# メイン処理開始
# ------------------------------------------------------------------------------
# 画面クリア等は行わず、そのまま出力します
printf "${BOLD}MariaDB Upgrade Automation for FreeBSD (v3)${RESET}\n"
printf "Current Version: ${GREEN}mariadb${CURRENT_PKG_VER}${RESET}\n"
printf "Target Version : ${GREEN}mariadb${TARGET_PKG_VER}${RESET}\n"
printf "\n"
# === Phase 1: 事前チェック ===
print_phase "Phase 1: 事前チェック"
# 1. root権限チェック
if [ "$(id -u)" -ne 0 ]; then
error_exit "このスクリプトは root 権限で実行してください。"
fi
# 2. 現在のパッケージ確認
log "現在のパッケージを確認しています..."
if pkg info -e "mariadb${CURRENT_PKG_VER}-server"; then
msg_ok "mariadb${CURRENT_PKG_VER}-server がインストールされています。"
else
error_exit "指定された現在のバージョン mariadb${CURRENT_PKG_VER}-server がインストールされていません。"
fi
# 3. ターゲットパッケージ確認 (ロジック修正版)
log "ターゲットパッケージ (mariadb${TARGET_PKG_VER}-server) を確認しています..."
# 完全一致(-e)ではなく、リストからgrepで探す方式に変更
if pkg search -q "mariadb${TARGET_PKG_VER}-server" | grep -q "^mariadb${TARGET_PKG_VER}-server"; then
msg_ok "リポジトリに mariadb${TARGET_PKG_VER}-server が存在します。"
else
# 詳細なデバッグ情報を表示して終了
printf "${YELLOW}デバッグ: pkg search mariadb の結果:${RESET}\n"
pkg search mariadb | grep server
error_exit "ターゲットバージョン mariadb${TARGET_PKG_VER}-server が見つかりません。上記リストにあるバージョンを指定してください。"
fi
# 4. ディスク容量確認
log "バックアップ先のディスク容量を確認します..."
df -h "$BACKUP_DIR" 2>/dev/null || df -h /root | awk 'NR==2 {print " 空き容量: " $4}'
printf "\n"
printf "${YELLOW}これよりアップグレードプロセスを開始します。${RESET}\n"
printf "${YELLOW}途中、データベースサービスが停止します。よろしいですか?${RESET}\n"
printf "準備ができたら Enter キーを押してください (中断は Ctrl+C)..."
read dummy
# === Phase 2: バックアップ ===
print_phase "Phase 2: 完全バックアップ取得"
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
log "ディレクトリ作成: $BACKUP_DIR"
fi
DUMP_FILE="${BACKUP_DIR}/dump_v${CURRENT_PKG_VER}_$(date +%Y%m%d_%H%M%S).sql.gz"
log "全データベースのダンプを作成中..."
# エラー出力をキャプチャ
if run_db_cmd mariadb-dump --all-databases --routines --triggers --events --single-transaction --quick --hex-blob 2>/tmp/mariadb_dump.err | gzip > "$DUMP_FILE"; then
msg_ok "バックアップ完了: $DUMP_FILE"
else
cat /tmp/mariadb_dump.err
rm -f "$DUMP_FILE"
error_exit "バックアップ作成に失敗しました。"
fi
# === Phase 3: サービス停止とパッケージ入替 ===
print_phase "Phase 3: サービス停止 & パッケージ入替 (ダウンタイム開始)"
log "${YELLOW}データベースサービスを停止します...${RESET}"
service "$SERVICE_NAME" stop
# プロセス停止確認
log "プロセス停止待機中..."
count=0
while pgrep -f "mariadbd" >/dev/null || pgrep -f "mysqld" >/dev/null; do
sleep 1
count=$((count+1))
if [ $count -gt 30 ]; then
msg_warn "強制停止を試みます..."
service "$SERVICE_NAME" onestop
sleep 2
break
fi
done
log "旧パッケージ削除: mariadb${CURRENT_PKG_VER}..."
pkg delete -y "mariadb${CURRENT_PKG_VER}-server" "mariadb${CURRENT_PKG_VER}-client" > /dev/null 2>&1 || error_exit "削除失敗"
log "新パッケージインストール: mariadb${TARGET_PKG_VER}..."
pkg install -y "mariadb${TARGET_PKG_VER}-server" "mariadb${TARGET_PKG_VER}-client" > /dev/null 2>&1 || error_exit "インストール失敗"
msg_ok "パッケージ入替完了。"
# === Phase 4: サービス起動とデータアップグレード ===
print_phase "Phase 4: サービス起動 & データアップグレード"
log "MariaDBサービス起動..."
service "$SERVICE_NAME" start
log "起動確認中..."
count=0
STARTED=0
while [ $count -lt 60 ]; do
if run_db_cmd mariadb-admin ping >/dev/null 2>&1; then
STARTED=1
break
fi
sleep 1
count=$((count+1))
printf "."
done
printf "\n"
if [ $STARTED -eq 0 ]; then
error_exit "起動タイムアウト。/var/log/mysql/mysqld.err を確認してください。"
fi
msg_ok "サービス起動。"
log "mariadb-upgrade 実行..."
if run_db_cmd mariadb-upgrade --force; then
msg_ok "アップグレード処理完了。"
else
msg_warn "mariadb-upgrade がエラーを返しました。出力を確認してください。"
fi
# === Phase 5: 統計情報の更新 ===
print_phase "Phase 5: 統計情報の更新 (ANALYZE TABLE)"
log "統計情報更新 (ANALYZE) ..."
if run_db_cmd mariadb-check --analyze --all-databases > /dev/null; then
msg_ok "統計更新完了。"
else
msg_warn "一部テーブルで更新失敗の可能性があります(処理は継続)。"
fi
# === Phase 6: 完了確認 ===
print_phase "Phase 6: 最終確認"
NEW_VER=$(run_db_cmd mariadb -N -e "SELECT VERSION();")
printf "アップグレード作業完了。\n\n"
printf "----------------------------------------------------------\n"
printf " 旧バージョン: mariadb${CURRENT_PKG_VER}\n"
printf " 新バージョン: ${GREEN}${NEW_VER}${RESET}\n"
printf "----------------------------------------------------------\n"
printf "\n"
printf "WordPressサイトの動作確認を行ってください。\n"
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment