PHP7.3に上げてデータベースのパスワードを変更しても解消しなかった「接続確立エラー」を何とか解決した闘いの記録

1ヵ月以内

この記事の要諦

  • ロリポップでWordPressを運営
  • サーバ契約から10年間放置していたPHPのバージョンをアップしたら、「データベース接続確立エラー」。
  • データベースのパスワード更新するだけでは解決しなかった
  • PHP5.3じゃなく5.2からアップデートしたせいっぽい

こちとらデータベースまわりは素人なので、この問題の解消に半日かかりました。
2020年になってPHP5.2使っている人がどれだけいるのか疑問ですが、記録として留めておきます。

解決方法だけ知りたい方はこちらから。

ロリポップ管理画面からPHPバージョンアップ

テーマやプラグインの互換性は事前にチェックしていたので「後はやるだけだ」とアップデートを実施

さっそく自分のサイトをチェック。


そう来ましたか。


管理画面もこう。

事前調査で「データベースのパスワードも変える必要あるかもよ」という情報を得ていたので、落ち着き払って対処する。

これでold_password形式からnative_password形式への変更が完了。


な、なんだと…。

この時点で冷や汗が垂れてくる。思ったシナリオと違う。

データベース接続情報をチェックする

条件反射でGoogleに「Wordpress データベース接続確立エラー」と問い詰める。結果が出るわ出るわ。

データベース側で持っている接続情報と、wp-config.phpで指定している記述が揃っていないとこうなるらしい。

なーんだそんな事か。


データベース名、ユーザー名、パスワード、ホスト名をチェック。

…1字1句合っている。5回以上チェックしたが間違いない。これとは別の原因のようだ。

MySQLのソケットパスを疑う

検索で引っかかったページを狂ったように見まくっていると、こんな記事が目にとまる。

WordPressでパスワードやデータベース名は合っているのに「データベース接続確立エラー」が出てしまう | Simple is Beautiful.
こういう状況で「まさに自分の事だ」と思う記事に出会うと、マジで救われた気になる。著者に抱きつきたい。

…が、読んでも意味が分からない。MySQLソケットとは何か。自分の環境でmysql.sockとやらの位置を確認するにはどうしたらいいのか。

「MySQL ソケット 確認方法」のようなワードで検索し、色んなページを見まくるが、自分にはバードルが高い。自分はフロントエンドですら趣味レベルなので勘弁してほしい。

ここでひとつ落ち着いて考えてみた。

落ち着いてデバッグしてみる

そういえば、上記ブログからデバッグのコマンドがある事を学んだため、それをやってみる。wp-config.phpのどこかにこれを挿入して実行する。

define('WP_DEBUG', true);

wp-admin にアクセスすると、エラー画面の上にエラー内容を記述してくれる。

自分の場合これやると、フロントページにもエラー内容が表示されてあまり気分が良く無かったのでエラー内容を確認した時だけtrueにした。

こんなエラー内容だった。

Warning: mysqli_real_connect(): (HY000/2000): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD(‘your_existing_password’). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in XXXXX/wp-db.php on line 1531

さっきのブログで紹介されていたエラー文と違う。ここで一旦、MySQLソケットとは違う問題かもしれないとアタリをつけ、頭の向き先をこのエラーのフィックスに切り替える。

どうやらMySQLパスワードの問題らしい

エラー文をGoogleにぶちこむ。さっきのに比べヒットする日本語サイトの数が激減するのでかなり焦る。

PHPで「mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.」エラーが発生した|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~

PHP5.3以降から、MySQLの古い形式(ハッシュ値の長さが16バイト)のパスワードをサポートしなくなったのが原因です。

とのこと。

  • MySQLにはパスワード形式が2種類(新/旧)あり
  • MySQL側では新旧互換する機能を有していたが
  • PHP5.3以降がむしろ旧パスワードを許可していない

色んなサイトを見ていると、恐らくこういう事らしい。

ここで、(PHP5.3からじゃなく)PHP5.2からバージョンアップした事が話をめんどくさくしている事に気付く。

だったら「新しい形式のパスワードを発行すればいいんじゃないか」と考え、phpMyAdminからデータベースパスワードを再発行してみる。
再発行の際に「MySQL4.1以上」か「MySQL4.0 互換」かを選択するが、バックエンドの素人には何が正しいのか分からないのでとりあえず両方試してみる。試す度に wp-config.php の記述も変える必要があるのでかなり面倒くさい。

結局5回くらいパスワードを変えて検証、という事を繰り返したが、解決しない。多分これで解決するだろうと思っていたので、結構落ち込む。
というか今思えば、「解決するだろう」というよりは「解決して欲しい」という願いに近かったような気もする。

レンタルサーバーでmy.cnfの書き換えは出来ない

改めて、片っ端からブログを読み漁ってみる。だいたいどの解説記事にも、この問題を解決するために「my.cnf の設定を old_password を無効化するよう変更する」と書いてある。
こちとら「my.cnf とは…?」という人間なので、またググる単語が増える。Chromeのタブが増える増える。

レンタルサーバーでは my.cnf は書き換え出来ない事はすぐ分かった。間借り状態のレンタルサーバーでは my.cnf の設定は他のユーザーのデータベースにも影響するものらしい。

では次に、ロリポップで old_passward の制御設定を変更できるかどうかを知りたいとひたすらGoogleしてみたが、それっぽい記事は出てこなかった。自分の検索内容がおかしいのだろう。

その中で、本家ロリポップがこんな事を言っている。

利用データベースが MySQL5.0 の場合
ユーザー専用ページの〔サポート〕よりご連絡ください。
PHP7.1以上を利用のドメインで簡単インストール、サイト表示ができません。

恐る恐る自分のMySQLのバージョンを確認したところバッチリ5.0。
MySQL4 / 5.1 / 5.6 の場合は解決方法が書かれているのに、5.0だけ匙を投げられている現場を目撃し、いよいよ手段が無いんじゃないかという気がしてくる。

この段階で、エラーが出てから3時間が経つ。

ここで仕事の電話会議をする

もともと予定されていた案件ミーティングを行う。
この時点で死ぬほど焦っていたのでそれどころじゃない気もしたが、いざ人と話して「それは、大変ですね…」とか言われると、なんだか気分が落ち着いて良かった。

新しく別のデータベースを用意する事を思い付く

ちょっと休憩したのが良かったのか、MySQL自体の変更が出来ないなら、いっその事新しいデータベースを作ればいいのではと思いついた。

たまたま自分が契約しているのがデータベースを複数作れるプランだった事は知っていた。後は、うまくデータベースの移行ができるかどうか。というかこれがダメだったらもう手立てがさっぱり分からない。

ロリポップ! でデータベースをMySQL5.6.11にアップデートする手順
こういった記事を見まくる。記事で書かれている内容に従い、

  1. 現データベースのphpMyAdminからエクスポートを行い
  2. ロリポップの管理画面から新しいデータベースを作成し
  3. 新データベースのphpMyAdminでインポートを行い
  4. wp-config.php を新データベースの接続情報に書き換える

という事をやってみる。頭では「現データベースには手を加えてないから安全のはず」と分かっていても、データベースをいじるのは怖すぎて手が震えた。

実は1回、エクスポートがうまく行っておらず、新データベースに接続してWordPressの管理画面を開いたらインストールから始まってしまい、一番焦ったりもした。

というか、WordPressを10年運用してきてデータベースのバックアップなど1回もした事が無かったので、これを機に無理やり経験できて良かった。

復旧しました


おあああああああ。
や…やりました…。

くっそ焦りながらも「多分この顛末を記事にするだろうな」と思って撮っていたスクリーンショットのおかげで、時系列が振り返られるというメリットがあります笑。

  • 16:28頃 : PHPのバージョンアップを実行
  • 16:35頃 : データベース接続エラーに気付く
  • 21:20頃 : 新データベースのphpMyAdminでインポート作業

という事で、復旧にちょうど5時間くらい費やしました。うち1時間は元同僚との打ち合わせですが。

結論

  • 今日1日だけでデータベースの事に2倍くらい詳しくなれた
  • PHPやMySQLのバージョンにはもうちょっと気をつけなさい
  • 様々な体験記をインターネットに残してくれた先人マジリスペクト

疲れました。