先日、OSをアップデートしてから Local by flywheel でデータベース接続エラーが頻発するようになりました。
具体的には20個ほど Local で作ったサイトがあったのですが、その半分ぐらいで接続エラーが出てサイトが見れない状態に。いろいろ調べてデータベースのリセットを試みたりしたのですが復旧せず。
万事休すかと思ったのですが、実はLocalはサイトを停止させる毎にデータベースの内容を書き出して保存してくれています。同じ名前で新しくサイトを作ってそのデータベースをインポートすれば全く同じサイトを復活させることができます。
この記事はエラー解消のためにやってダメだったことと、その手順の覚書です。Local で同じようなトラブルで困った方は試してみてください。簡単、確実に復旧できます。
表示されるエラーとやってみたこと
ここはエラーを解決しようと悪戦苦闘した話です。とにかくすぐに復旧させたい人はここは飛ばしてください。
ちなみにどんなエラーが出ていたかですが、Local で稼働させたサイトにアクセスすると
Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /Localへのパス/Local/サイト名/app/public/wp-includes/wp-db.php on line 1653
というPHPの警告と「データベース接続確立エラー」と表示される状態でした。下図のような画面になります。
やってみたこと1: ホスト名を変える
まずエラー名でググるとデータベースのホスト名をlocalho
stから127.0.0.1
に変えるとつながるという情報が沢山でてきます。wp-config.phpはデフォルトでは下記のようになっているはず。
define( 'DB_HOST', 'localhost' );
これを次のように書き換えてみました。
define( 'DB_HOST', '127.0.0.1' );
結果としてはデータベース接続エラーは変わらなかったのですが、phpの警告の内容が変わりました。
Warning: mysqli_real_connect(): (HY000/2002): Connection refused in
見つからないから拒絶に…。
やってみたこと2: ターミナルから操作を試みる
拒絶されるというならターミナルからmysqlにアクセスできるのかと思いやってみると次のようなエラーが。
$ mysgl
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/Users/ユーザー名/Library/Application Support/Local/run/wMAPoFakV/mysql/mysqld.sock' (2
socketを通して接続ができないということのようです。mysqld.sock というファイルの存在は確認し、アクセス権をフルアクセスに変えてみてもダメ。
やってみたこと3: データベースの再起動
いろいろ調べているとmysql.server start
というコマンドでデータベースを再起動できるとう情報をゲット。
これで解決の糸口がつかめるかと思ってやってみると…
ERROR! The server quit without updating PID file (/Users/ユーザ名/Library/Application/******.local.pid).
上記のようなエラーがでるだけで状況は変わらず・・・
やってみたこと4: サイトのエクスポート
このあたりで手に負えないと判断し、閃いた方法が「サイトをエクスポートしてインポートすればなおるのでは?」だったのですが…
エクスポートができませんでした。待てど暮らせど終わらない…。データベースが正常に動いてないようなので仕方ないかもしれません。
万事休すかと思ったのですが、ここでふと Local は毎回データベースを自動的にバックアップしていることを思いだしました。
ということで、長い前振りは終わりでいよいよ本題に入っていきます。
Local のバックアップを利用した復元
- 復旧したいサイトのデータベースのバックアップとwp-content をコピー
- 復旧したいサイトをLocalから削除
- 同じサイト名で新サイトを作成
- wp-content をバックアップしたものと差し替え
- データベースにバックアップをインポート
データベースのバックアップはサイトフォルダ/app/sql/
の中にあるloacl.sql
とういファイルです。たまにこのフォルダの中に大量にテーブル毎のバックアップファイルが保存されている場合がありますが、使うのはlocal.sql
だけで大丈夫なはず。
これとサイトフォルダ/app/public/
の中にあるwp-content
フォルダを別のフォルダに移動するかコピーしておきます。ファイルが大量にある場合は移動の方が時間がかからないです。
あとサイト名も忘れないようにしましょう。
データのバックアップが完了したら、Localからサイトを削除。wp-content等も含め全てのファイルが削除されるので必ずstep1をやってから実行してましょう。
削除が完了したら全く同じ名前でサイトを新規作成します。
余計なトラブルを避けるためPHPやデータベースのバージョンは前と同じにしておきましょう。ユーザー名とパスワードは後で書き換わるので適当でOK。サイト作成後ログインする必要はありません。
ちなみに別の名前にしたい場合、local.sql内のサイト名の部分を全て置換すれば対応できます。
新しく作ったサイトのwp-contentをバックアップしていたものに入れ替えます。
Local のDATABASEタブをクリックしてOPEN ADMINERをクリック。
これでブラウザにadminerの画面が表示されます。
全てのテーブルにチェックを入れて削除をクリック。
これでデータベースが空になるのでインポートをクリック。
インポートからコピーしておいた local.sql を選択して「実行」
データベースの容量が大きいと結構感がかかりますが、無事にインポートが完了するとテーブルが表示されます。
以上で前と全く同じサイトが復活しているはずです。管理画面のログイン情報も前と同じでいけます。
実際の作業は数分で完了するので、データベースを復旧しようとあれこれ悩んだりサイトのエクスポートをするよりもこちらの方が迅速に環境を復活できると思います。
最近はwp-envを使うことが多いのですが、Local もこういう自動バックアップ機能があるなど痒いところに手が届くのは便利だなと改めて思いました。
当面使わないサイトはデータベースとwp-contentの必要な部分だけバックアップして必要な時にインポートするという運用でいけばSSDの容量節約にもなりそうです。
はじめまして!ジョウと申します。突然のコメント失礼いたします。
感謝のお言葉を伝えたくてコメントさせていただきます。LocalのAdminボタンを押しても管理画面が出てこず、エラーが出てきて、途方にくれていました。記事のLocal のバックアップを利用した復元を実施したところ、無事復元できました。
大変感謝しております。貴重な記事を公開していただき、ありがとうございました!
> ジョウさん
お役に立てて良かったです!