テーマをCocoonに変更しました!
wordpress

【WordPress】古いwp-config.phpを上書きしてDB接続エラー!ターミナルから復旧した全手順

FavoriteLoadingお気に入り登録
wordpress

WordPressのサイトを開いたら、真っ白な画面に英語で「Error establishing a database connection」。

今回、ConoHa VPS(KUSANAGI)で運用しているサイトで、まさにこの状態になりました。原因はPCに残っていた古い wp-config.php をうっかりアップロードしたことです。

しかも、慌てて「元のファイル」に戻したつもりが、それも古いファイルだったので直らない……という二段構えのやらかしでした。

この記事では、原因の突き止め方から、ターミナル(黒い画面)を使ったデータベースの復旧まで、実際にやった手順をそのまま、初心者の方にも分かるようにまとめます。

今回の環境

項目内容
サーバーConoHa VPS(AlmaLinux 9)
実行環境KUSANAGI
データベースMariaDB 10.11
ファイル操作WinSCP
ターミナルWindowsのターミナル(SSHでrootログイン)

同じVPSに、WordPressサイトが3つ同居している構成です。

何をしていて、何が起きたのか

もともとの作業は、テーマの functions.php などに直書きしていた楽天APIやYouTube APIのキーを、wp-config.php に移すというものでした。キーを公開フォルダ内のファイルに書いておくより、wp-config.php の定数にしたほうが安全だからです。

ここでやらかしたのが次の流れです。

順番やったこと実際に起きていたこと
1PC内の wp-config.php にAPIキーを追記してアップロードそのファイルはサーバー移行前の古いものだった
2サイトを開くとDB接続エラー古いDB名・ユーザー名で接続しようとして失敗
3「元のファイル」に戻してアップロードそれも古いファイルだったので、やっぱりエラー
4ターミナルで原因調査&復旧この記事のメイン部分

サーバー上で動いていた本物の wp-config.php は、この時点で上書きされて消えています。ここから、データベース側の情報を頼りに復旧していきます。

復旧までの全体の流れ

ステップやること使うもの
1他のサイトが動くか確認(DB自体が生きているか)ブラウザ
2wp-config.php の場所を確認WinSCP
3WP_DEBUGで詳しいエラーを出すWinSCP・ブラウザ
4データベースに実在するユーザーとDBを調べるターミナル
5DBユーザーのパスワードを wp-config.php に合わせるターミナル
6wp-config.php のDB名・ユーザー名を書き換えるターミナル
7表示確認・WP_DEBUGを戻すブラウザ・ターミナル
8APIキーを追記し直すWinSCP

ステップ1:他のサイトが表示されるか確認する

最初に確認したいのは、データベース(MariaDB)そのものが止まっていないかです。

同じサーバーに別のWordPressサイトがあるなら、そちらを開いてみてください。

結果考えられる原因
他のサイトも全部エラーデータベース自体が止まっている
他のサイトは表示されるこのサイトの wp-config.php の設定が怪しい

今回は他のサイトは普通に表示されたので、原因はこのサイトの wp-config.php に絞れました。

ステップ2:KUSANAGIの wp-config.php の場所を確認する

KUSANAGIでは、wp-config.php が公開フォルダ(DocumentRoot)の1つ上の階層に置かれています。外からアクセスされにくくするための仕組みです。

ただし、WordPressは次の2か所のどちらにあっても読み込みます。

場所優先度
/home/kusanagi/プロファイル名/DocumentRoot/wp-config.phpこちらが優先
/home/kusanagi/プロファイル名/wp-config.phpDocumentRootに無いときだけ使われる

もし両方にファイルがあると、DocumentRoot側が優先されます。間違った場所にアップロードすると、意図しないファイルが読まれてしまうので要注意です。

今回はDocumentRoot側には無く、1つ上の階層の1つだけでした。

ステップ3:WP_DEBUGで本当の原因を表示させる

「Error establishing a database connection」だけでは、何が悪いのか分かりません。そこで、wp-config.php の次の行を一時的に変更します。

define( 'WP_DEBUG', true );

アップロードしてサイトを再読み込みすると、エラー画面の上に英語の警告文が出ます。今回はこう表示されました。

Access denied for user 'hirochan_sample'@'localhost' (using password: YES)

警告文の意味は、次の表で判断できます。

警告文に含まれる言葉意味
Access denied for userDBのユーザー名かパスワードが違う
Unknown databaseDB名が違う
No such file or directory/Connection refused接続先(DB_HOST)の問題、またはDBが停止中

今回は「Access denied」なので、ユーザー名かパスワードが違うということが分かりました。

ステップ4:ターミナルでデータベースに入る

ここからは、SSHでサーバーにrootでログインして作業します。

MariaDBに入る

mysql -u root -p

「Enter password:」と聞かれますが、何も入力せずにそのままEnterでOKです。

最近のMariaDBは、rootが「サーバーにrootでログインしている人だけ通す(unix_socket認証)」設定になっていることが多く、この場合はパスワードが不要です。実際に今回の環境では、rootのパスワードそのものが無効になっていました。

確認したい場合は、次のコマンドで分かります。

mysql -e "SHOW GRANTS FOR 'root'@'localhost';"

結果に「USING ‘invalid’ OR unix_socket」と出ていれば、パスワードは無効で、ターミナルからだけ入れる設定です。/root/.my.cnf などに古いパスワードが残っていても、使われていません。

この設定の場合、実は -u root -p を付けずに、mysql だけで入れます。

次の表示に変われば、入れています。

MariaDB [(none)]>

抜けるときは exit と入力してEnterです。

ステップ5:データベースに実在するユーザーとDBを調べる

最初は「wp-config.php のパスワードに、DB側を合わせればいい」と考えて、パスワード変更を試しました。ところが、次のエラーが出ました。

ERROR 1396 (HY000) at line 1: Operation ALTER USER failed for 'hirochan_sample'@'localhost'

このエラーは、そのユーザーがデータベースに存在しないという意味です。つまり、パスワードどころかユーザー名から違っていたわけです。

wp-config.php に書かれている設定を確認

パスワード以外の設定だけを表示するコマンドです。

grep -E "DB_NAME|DB_USER|DB_HOST" /home/kusanagi/プロファイル名/wp-config.php

データベースに実際にあるユーザーとDBを確認

mysql -u root -p -e "SELECT user,host FROM mysql.user; SHOW DATABASES;"

この2つを見比べると、ズレが一目で分かりました。

項目wp-config.php(古いファイル)実際のデータベース
ユーザー名hirochan_samplesample_user
DB名hirochan_samplesample_wp

サーバー移行のときに、DB名とユーザー名を新しくしていたんですね。PCに残っていたのは、その移行前の wp-config.phpでした。

ステップ6:DBユーザーのパスワードを wp-config.php に合わせる

本物の wp-config.php が消えてしまったので、正しいパスワードは分かりません。そこで逆に、今の wp-config.php に書いてあるパスワードを正として、データベース側のパスワードを変更します。

パスワードを自動で読み取る

パスワードを手でコピーするとミスしやすいので、wp-config.php から自動で読み取って、PWという入れ物に入れます。

PW=$(grep "DB_PASSWORD" /home/kusanagi/プロファイル名/wp-config.php | sed -E "s/.*DB_PASSWORD'[[:space:]]*,[[:space:]]*'([^']*)'.*/\1/")

何も表示されなければ成功です。ちゃんと読み取れたか、文字数だけを表示して確認します(パスワード自体は画面に出ません)。

echo ${#PW}

「15」のように数字が出ればOK。「0」なら読み取りに失敗しています。

DBユーザーのパスワードを変更

実在するユーザー(今回は sample_user)のパスワードを、読み取ったものに変更します。

mysql -u root -p -e "ALTER USER 'sample_user'@'localhost' IDENTIFIED BY '$PW'; FLUSH PRIVILEGES;"

パスワードを聞かれたら、ステップ4と同じように入力してEnter。何も表示されずに元の画面に戻れば成功です。

ちなみに FLUSH PRIVILEGES は「変更した権限を今すぐ反映して」という命令です。

ステップ7:wp-config.php のDB名・ユーザー名を書き換える

ファイルを開かずに、ターミナルから直接書き換えます。sed は「文字を置き換える」コマンドです。

sed -i "s/'DB_NAME', 'hirochan_sample'/'DB_NAME', 'sample_wp'/; s/'DB_USER', 'hirochan_sample'/'DB_USER', 'sample_user'/" /home/kusanagi/プロファイル名/wp-config.php

何も表示されなければ書き換え完了です。確認してみます。

grep -E "DB_NAME|DB_USER|table_prefix" /home/kusanagi/プロファイル名/wp-config.php

ここでtable_prefix(テーブル名の頭文字)も一緒に確認しているのがポイントです。古いファイルだと、ここも違っている可能性があるからです。

ステップ8:表示確認と後片付け

サイトを再読み込みして、結果を確認します。

結果対応
いつものサイトが表示される復旧完了
WordPressのインストール画面が出る絶対にインストールを進めない。table_prefixが違うので、DB内のテーブル名に合わせて修正する
まだDB接続エラーWP_DEBUGの警告文を確認し直す

今回は無事にサイトが表示されました。

WP_DEBUGを元に戻す

WP_DEBUGを true のままにしておくと、訪問者にも警告文が見えてしまいます。必ず false に戻しましょう。

sed -i "s/'WP_DEBUG', true/'WP_DEBUG', false/" /home/kusanagi/プロファイル名/wp-config.php

ログアウトされていたら

古い wp-config.php は、ログイン用の鍵(SALT)も昔のものです。管理画面から一度ログアウトされることがありますが、普通にログインし直せばOKです。

ステップ9:本来やりたかった作業をやり直す

最後に、もともとの目的だったAPIキーの追記をやり直します。今度は事故防止のため、PCのファイルは使わず、サーバー上のファイルを直接編集しました。

  1. WinSCPで、サーバー上の wp-config.php をまずPCにダウンロード(これが本物のバックアップ)
  2. サーバー上の wp-config.php をダブルクリックして直接開く
  3. 「That’s all, stop editing!」の行のに定数を追記して保存
/* APIキー */
define( 'MYSITE_RAKUTEN_APP_ID',     'ここにアプリID' );
define( 'MYSITE_RAKUTEN_ACCESS_KEY', 'ここにアクセスキー' );
define( 'MYSITE_YOUTUBE_KEYS', array(
  'ここにAPIキー1',
  'ここにAPIキー2',
) );

テーマやプラグイン側では、この定数を読み込むように書き換えておけば、キーを公開フォルダのファイルに直書きせずに済みます。

ターミナル操作でハマったところ

今回、ターミナルに慣れていないせいでつまずいたポイントもまとめておきます。

ハマりどころ原因と対策
コマンドが2回くっついて貼られるターミナルでは右クリックも「貼り付け」になるため。Ctrl + V で貼った後に右クリックすると2回分になる。貼り付けは Ctrl + V だけにする
貼り間違えたEnterを押す前なら、Ctrl + C で行ごと取り消せる
パスワード入力で何も表示されない仕様なので問題なし。見えなくても入力されている
wp-config.php がShift_JISになっていた英数字だけのファイルに日本語コメントを足して保存すると、エディターがShift_JISで保存することがある。file コマンドで確認し、iconv でUTF-8に変換。コメントは英語で書くのが安全
ERROR 1064 が出たコマンドがくっついたことによる文法エラー。実害はないので貼り直せばOK

いちばん効いたのは、貼り付けたらEnterを押す前に、コマンドが1つだけか目で確認するという習慣でした。

また、スクリーンショットで相談するときは、パスワードが写っていないか必ず確認しましょう。エラー文の中にパスワードがそのまま表示されることがあります。

再発防止のために

対策理由
wp-config.php は毎回サーバーから直接開いて編集するPCのファイルが最新とは限らない
PCに残った古い wp-config.php は削除するか名前を変える今回のような取り違えを防ぐ
サーバー移行後は、新しい wp-config.php をバックアップし直す移行前のバックアップは、移行後には使えない
バックアップのファイル名に日付を入れるどれが最新か一目で分かる

まとめ

「Error establishing a database connection」は焦るエラーですが、順番に切り分ければ落ち着いて直せます。

  1. 他のサイトが動くか見て、DB自体の問題かを切り分ける
  2. WP_DEBUGで、本当のエラー内容を表示させる
  3. wp-config.php の中身と、DBに実在するユーザー・DBを見比べる
  4. ズレている方を合わせる
  5. WP_DEBUGを戻すのを忘れない

そして何より、wp-config.php をいじる前は、サーバー上の「今動いているファイル」をバックアップする。これに尽きます。

今回はうっかりミスでしたが、おかげでターミナルからデータベースを直す方法が身につきました。同じエラーで困っている方の参考になればうれしいです。

気になる中古パソコン

パソコン

Supported by Rakuten Web Service

コメント

📖目次
タイトルとURLをコピーしました
PR

当サイトは、Amazon、楽天アソシエイト・他プログラムの参加者です。リンクを通じて商品を購入すると、紹介料を得る場合があります。

⚠ 免責事項

本記事は、筆者が実際に行った作業を記録したものです。サーバーの環境や設定によっては、同じ手順でも結果が異なる場合があります。

作業を行う際は、事前にバックアップを取ったうえで、ご自身の責任で実施してください。本記事の内容を参考にしたことによって生じたトラブルや損害について、当サイトは一切の責任を負いかねますので、あらかじめご了承ください。