2026年5月22日

2026年5月22日

WordPressのデータベース接続エラーを解決する方法

はじめに

WordPressのサイトを開いたら「データベース接続確立エラー」の白いページが表示される・wp-config.phpのデータベース設定(ホスト・ユーザー・パスワード・DB名)は正しいはずなのに接続できない・MySQLサーバーが高負荷で応答していない・wp_postswp_optionsテーブルが破損してWordPressが起動しないといった問題は、認証情報の不一致・MySQL接続数の上限・テーブルの破損・MySQLサービスの停止が原因です。

症状・原因

  • wp-config.phpDB_USERに許可されているホストからの接続でない(localhost127.0.0.1の違い)
  • MySQLのmax_connectionsに達しており新規接続を拒否している
  • MyISAMテーブルがクラッシュしてwp_optionsが読み取れない
  • レンタルサーバーでデータベースホスト名がlocalhostでなく独自のホスト名になっている

解決手順

ステップ1:データベース接続エラーを診断する

# MySQLへの接続テスト
wp eval "
global \$wpdb;
if (\$wpdb->last_error) {
    echo 'DB Error: ' . \$wpdb->last_error . PHP_EOL;
} else {
    echo 'DB Connection: OK' . PHP_EOL;
}
echo 'DB Host: ' . DB_HOST . PHP_EOL;
echo 'DB Name: ' . DB_NAME . PHP_EOL;
echo 'DB User: ' . DB_USER . PHP_EOL;
"

# MySQLの接続数を確認(root権限が必要)
wp eval "
global \$wpdb;
\$max = \$wpdb->get_var(\"SHOW VARIABLES LIKE 'max_connections'\");
\$cur = \$wpdb->get_var(\"SHOW STATUS LIKE 'Threads_connected'\");
echo 'Max connections: ' . \$max . PHP_EOL;
echo 'Current connections: ' . \$cur . PHP_EOL;
"

# テーブルの状態を確認
wp db query "CHECK TABLE wp_posts, wp_options, wp_users"

# MySQLプロセスリストを確認
wp db query "SHOW PROCESSLIST"

ステップ2:wp-config.phpの接続設定を修正する

// wp-config.php: データベース接続の正しい設定

// 基本設定
define('DB_NAME',     'wordpress_db');
define('DB_USER',     'wordpress_user');
define('DB_PASS',     'strong_password_here');

// DB_HOST の設定パターン
// ① ローカル接続(最も一般的)
define('DB_HOST', 'localhost');

// ② ソケット接続(localhost が効かない場合)
define('DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock');

// ③ TCP接続(ソケットが使えない場合)
define('DB_HOST', '127.0.0.1');

// ④ ポート指定(デフォルト3306以外の場合)
define('DB_HOST', 'localhost:3307');

// ⑤ リモートMySQLサーバー(レンタルサーバー等)
define('DB_HOST', 'mysql1234.db.sakura.ne.jp');

define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');
# mysqlコマンドで直接接続テスト
# mysql -h localhost -u wordpress_user -p wordpress_db -e "SELECT 1"

# WP-CLIでDB接続確認
wp db check

ステップ3:破損したテーブルを修復する

# データベース全体を修復
wp db repair

# 特定テーブルを修復
wp db query "REPAIR TABLE wp_posts"
wp db query "REPAIR TABLE wp_options"
wp db query "REPAIR TABLE wp_postmeta"

# MyISAMテーブルをmysqlcheckで修復
wp eval "
echo 'DB Name: ' . DB_NAME . PHP_EOL;
echo 'DB Host: ' . DB_HOST . PHP_EOL;
"
# mysqlcheck -h localhost -u root -p --repair --all-databases

# InnoDBテーブルを最適化
wp db query "OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options, wp_usermeta"

# wp_optionsテーブルのautoloadデータを確認
wp eval "
global \$wpdb;
\$total = \$wpdb->get_var(\"SELECT SUM(LENGTH(option_value)) FROM {\$wpdb->options} WHERE autoload='yes'\");
echo 'Autoload data size: ' . round(\$total / 1024 / 1024, 2) . ' MB' . PHP_EOL;
"

ステップ4:MySQLのパフォーマンスを最適化する

// wp-config.php: データベース接続の最適化

// 永続DB接続(高トラフィックサイトで注意が必要)
// define('DB_HOST', 'p:localhost');  // 'p:' プレフィックスで永続接続

// functions.php: wpdbのクエリログでスロークエリを特定
add_action('init', function(): void {
    if (WP_DEBUG && current_user_can('manage_options')) {
        global $wpdb;
        $wpdb->show_errors();
        $wpdb->save_queries = true;
    }
});

add_action('shutdown', function(): void {
    if (!WP_DEBUG || !current_user_can('manage_options')) {
        return;
    }
    global $wpdb;
    if (!$wpdb->save_queries) {
        return;
    }
    $slow = array_filter($wpdb->queries, fn($q) => $q[1] > 0.05);  // 50ms以上
    foreach ($slow as $query) {
        error_log(sprintf('Slow query (%.3fs): %s', $query[1], $query[0]));
    }
});

ステップ5:データベースの長期保守とバックアップ戦略

# 定期的なデータベース最適化
wp db optimize

# 古いリビジョンを削除してDBサイズを削減
wp eval "
global \$wpdb;
\$deleted = \$wpdb->query(
    \"DELETE FROM {\$wpdb->posts} WHERE post_type = 'revision'\"
);
// 孤立したpostmetaを削除
\$wpdb->query(
    \"DELETE pm FROM {\$wpdb->postmeta} pm
     LEFT JOIN {\$wpdb->posts} p ON p.ID = pm.post_id
     WHERE p.ID IS NULL\"
);
echo 'Revisions deleted: ' . \$deleted . PHP_EOL;
"

# MySQLのバイナリログを確認(更新履歴)
wp db query "SHOW BINARY LOGS"

# バックアップ前にDBを最適化
wp db export --add-drop-table /tmp/optimized-backup.sql

# データベースのサイズを確認
wp db size
wp db size --tables --format=table

注意事項

  • DB_HOSTlocalhostから127.0.0.1に変更するとTCP接続になりソケット接続より少し遅くなります。localhostでエラーが出る場合のみ変更してください
  • REPAIR TABLEはMyISAMテーブルに有効です。InnoDBテーブルが破損した場合はMySQLのinnodb_force_recoveryを段階的に上げてダンプを取得してから再インポートする必要があります
  • MySQLのmax_connectionsに達している場合はアプリケーション側でコネクションプールを使うか、MySQLの設定ファイルでmax_connectionsを増やしてください

まとめ

WordPressデータベース接続エラーの解決は①$wpdb->last_errorでエラー内容確認・DB_HOST/DB_USER/DB_NAMEの設定値を出力・max_connectionsと現在の接続数を確認・SHOW PROCESSLISTでクエリ状況を把握、②wp-config.phpDB_HOSTlocalhost127.0.0.1・ソケットパス・レンタルサーバーのホスト名の4パターンで試行、③wp db repairREPAIR TABLEOPTIMIZE TABLEでテーブルを修復・mysqlcheck --repair --all-databasesで全テーブル修復、④$wpdb->save_queries=trueでスロークエリを特定・50ms以上のクエリをerror_logに記録、⑤wp db optimize・リビジョン削除・孤立したpostmeta削除・wp db exportでバックアップ・wp db size --tablesでサイズ確認の手順で解決します。

お気軽にご相談ください

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