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標準ツールによる包括的修復、⑤cronとmailコマンドを組み合わせた自動修復・通知スクリプトで継続監視します。