2026年5月22日
2026年5月22日
WordPressのデータベース接続エラーを解決する方法
はじめに
WordPressのサイトを開いたら「データベース接続確立エラー」の白いページが表示される・wp-config.phpのデータベース設定(ホスト・ユーザー・パスワード・DB名)は正しいはずなのに接続できない・MySQLサーバーが高負荷で応答していない・wp_postsやwp_optionsテーブルが破損してWordPressが起動しないといった問題は、認証情報の不一致・MySQL接続数の上限・テーブルの破損・MySQLサービスの停止が原因です。
症状・原因
wp-config.phpのDB_USERに許可されているホストからの接続でない(localhostと127.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_HOSTをlocalhostから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.phpのDB_HOSTをlocalhost・127.0.0.1・ソケットパス・レンタルサーバーのホスト名の4パターンで試行、③wp db repair・REPAIR TABLE・OPTIMIZE TABLEでテーブルを修復・mysqlcheck --repair --all-databasesで全テーブル修復、④$wpdb->save_queries=trueでスロークエリを特定・50ms以上のクエリをerror_logに記録、⑤wp db optimize・リビジョン削除・孤立したpostmeta削除・wp db exportでバックアップ・wp db size --tablesでサイズ確認の手順で解決します。