2026年8月30日

2026年8月30日

WordPressのデータベースを修復する方法(WP-CLI使用)

はじめに

WP-CLIを使えばSSH経由でコマンドラインからWordPressデータベースを修復できます。phpMyAdminにアクセスできない環境や、スクリプトによる自動修復に適しています。

症状・原因

  • SSH接続はできるがphpMyAdminが使えない環境でDBエラーが発生した
  • Table '...' is marked as crashed エラーが wp-admin/ に表示される
  • wp-cronや定期バッチ処理でDBエラーが散発している
  • 複数サイトで同時にDB修復が必要になった

解決手順

ステップ1:WP-CLIでDBの状態を確認する

# WP-CLI がインストールされているか確認
wp --version

# データベース接続を確認
wp db check

# 詳細なテーブル状態を確認
wp db query "CHECK TABLE wp_posts, wp_postmeta, wp_options,
    wp_users, wp_usermeta, wp_comments, wp_commentmeta,
    wp_terms, wp_term_relationships, wp_term_taxonomy;"

# 問題のあるテーブルだけ抽出
wp db query "SELECT table_name, table_rows, data_free
    FROM information_schema.tables
    WHERE table_schema = DATABASE()
    AND data_free > 0;" 2>&1

# クラッシュしたテーブルを確認
wp db query "SHOW TABLE STATUS WHERE Comment = 'crashed';"

ステップ2:wp db repair コマンドで修復する

# WP-CLI の組み込み修復コマンド
wp db repair

# 特定テーブルのみ修復(wp db queryで直接実行)
wp db query "REPAIR TABLE wp_posts;"
wp db query "REPAIR TABLE wp_options;"
wp db query "REPAIR TABLE wp_users;"

# MyISAM テーブルを一括修復
wp db query "REPAIR TABLE
    wp_posts, wp_postmeta, wp_options,
    wp_users, wp_usermeta, wp_comments,
    wp_commentmeta, wp_terms,
    wp_term_relationships, wp_term_taxonomy;"

# 修復後の確認
wp db check
# Output: Success: Database checked. または エラー一覧

ステップ3:mysqlcheck コマンドで修復する

# mysqlcheck はMySQL/MariaDBに付属のコマンドラインツール

# データベース全体をチェック
mysqlcheck -u wordpress_user -p wordpress_db

# 自動修復オプションで実行
mysqlcheck -u wordpress_user -p --auto-repair wordpress_db

# 全テーブルを最適化も同時に実行
mysqlcheck -u wordpress_user -p --auto-repair --optimize wordpress_db

# wp-config.php からDB認証情報を読み取る(WP-CLI経由)
DB_NAME=$(wp config get DB_NAME)
DB_USER=$(wp config get DB_USER)
DB_PASS=$(wp config get DB_PASSWORD)
DB_HOST=$(wp config get DB_HOST)

mysqlcheck -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" \
    --auto-repair --optimize "$DB_NAME"

ステップ4:InnoDB テーブルをWP-CLIで修復する

# InnoDB はREPAIR TABLEが使えないため ALTER TABLE で再構築

# 全テーブルのエンジンを確認
wp db query "SELECT TABLE_NAME, ENGINE
    FROM information_schema.tables
    WHERE table_schema = DATABASE();"

# InnoDB テーブルを個別に再構築
wp db query "ALTER TABLE wp_posts ENGINE=InnoDB;"
wp db query "ALTER TABLE wp_options ENGINE=InnoDB;"
wp db query "ALTER TABLE wp_postmeta ENGINE=InnoDB;"

# インデックスの再構築
wp db query "ANALYZE TABLE wp_posts;"
wp db query "ANALYZE TABLE wp_options;"

# 修復完了確認
wp db check && echo "DB repair successful"

ステップ5:定期的な自動修復スクリプトを設定する

#!/bin/bash
# /usr/local/bin/wp-db-health-check.sh
# cron: 0 3 * * * /usr/local/bin/wp-db-health-check.sh

WP_PATH="/var/www/html"
LOG_FILE="/var/log/wp-db-health.log"
ADMIN_EMAIL="admin@example.com"

cd "$WP_PATH" || exit 1

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting DB health check" >> "$LOG_FILE"

# チェック実行
CHECK_RESULT=$(wp db check 2>&1)

if echo "$CHECK_RESULT" | grep -q "Error\|crashed\|corrupt"; then
    echo "[$(date)] DB issues detected, starting repair..." >> "$LOG_FILE"
    
    # 修復実行
    REPAIR_RESULT=$(wp db repair 2>&1)
    echo "$REPAIR_RESULT" >> "$LOG_FILE"
    
    # 管理者にメール通知
    echo "WordPressのDBに問題が検出され、自動修復を実行しました。
    
チェック結果:
$CHECK_RESULT

修復結果:
$REPAIR_RESULT

サイト: $(wp option get siteurl)" | mail -s "[WP DB] 自動修復実行" "$ADMIN_EMAIL"
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Health check complete" >> "$LOG_FILE"

注意事項

  • wp db repair は内部で mysqlrepair を実行します。MyISAMエンジンのテーブルにのみ有効で、InnoDBには効果がありません
  • --allow-root オプションはrootユーザーでWP-CLIを実行する際に必要です(wp --allow-root db repair
  • 修復を繰り返しても改善しない場合は、wp db exportでバックアップを取得後、wp db reset && wp db importで再インポートする根本的な解決を検討してください

まとめ

WP-CLIでのDB修復は①wp db checkで接続・テーブル状態確認、②wp db repairまたはwp db query "REPAIR TABLE ..."でMyISAMテーブルを修復、③InnoDBはwp db query "ALTER TABLE ... ENGINE=InnoDB"で再構築・ANALYZE TABLEでインデックス再構築、④mysqlcheck --auto-repair --optimizeでMySQL標準ツールによる包括的修復、⑤cronmailコマンドを組み合わせた自動修復・通知スクリプトで継続監視します。

お気軽にご相談ください

お見積りへ お問い合わせへ