Created
January 15, 2026 04:08
-
-
Save DaikiSuganuma/cc57348f1331cc0c0fdf15cd58f09304 to your computer and use it in GitHub Desktop.
MariaDB serverを10.11から11.8にアップグレード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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