データベース接続確立エラーとは
wordpress側からDBにアクセスする時に接続できないのが原因で出てしまうエラー
DB移行する時にこの問題にぶち当たることが多いので原因をまとめました。
またエラーに遭遇したら追記するかもです
2019/09/13 追記 MySQL8.0の場合に起こり得るエラーを記載し、内容を更新
原因
wp-config.phpの設定がおかしい
$ cat wp-config.php |grep DB_
このコマンドを入力すればどのユーザーやパスワードでMysqlに接続しに行こうとしているのかがわかる。
もし入れなかったら設定がおかしいので、ユーザー名、DB名、パスワードなどがあっているか確かめる。
wp-config.phpの場所については,wordpressをダウンロードして解凍したディレクトリにあるはず。
DBのユーザーに権限がない
wp-config.phpの設定はあっていて、Mysqlに入ることはできる。
しかし、DBに書き込む権限がないため、エラーが出てしまっている可能性がある。
mysql> show grants for 'user'@'localhost';
これでどの権限が振られているか確かめる。
権限が振られていなかったら
mysql> grant all privileges on db.* to 'user'@'localhost';
これで指定したDBに対して全ての権限が与えられ、接続できるはず。
しかしセキュリティのことを考えると、全部の権限を与えるのは不安である。
wordpressのMysqlユーザーに必要な最低限の権限は
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER
らしいので、面倒でなければこちらを設定した方がいいと思われる。
nginxにルートディレクトリの実行権限がない
$ chown -R user: rootDirectry
nginx.confに設定したuserにルートディレクトリにアクセスする権限を付与しないと、アクセスできず権限エラーが起こる。
mysql.sockの場所が違う
mysql.sockの場所がwp-config.phpに書いてあるpathと違うため起こる。
mysql.sockの場所は、 /etc/my.confに書いてあるので確認
下記のような形で示されている。
socket=/var/lib/mysql/mysql.sock
ここで出てきたディレクトリをwp-config.phpに設定する。
define( 'DB_HOST', 'localhost:/var/lib/mysql/mysql.sock' );
MySQL8.0の認証方式が違う (2019/09/13に追加)
先日久々にこのエラーにぶち当たり、どの原因とも関係がなさそうだったのでmysqlのエラーログを調べたところ、
he server requested authentication method unknown to the client
(サーバーがクライアントに知られていない認証方法を要求しました)
というエラーが出ていました。心当たりがないのでそのままエラー文で調べたところ、
MySQL8.0からセキュリティが強化され、デフォルトのユーザー認証方式がmysql_native_password ではなく、caching_sha2_passwordになっている模様。
このcaching_sha2_passwordがサポートされていないクライアント(phpとか)が引っかかって起こってしまうエラーのようです。
解決方法としては、デフォルトのユーザー認証方式をmysql_native_password に変えて、
ユーザーを再作成します。
mysql> alter user 'user'@'localhost' identified with mysql_native_password by 'userpassword';
また、ユーザーを作成する際に自動的にmysql_native_passwordの方式にするには、my.cnfに
default-authentication-plugin = mysql_native_password
と記載し、 mysqlを再起動
する必要があります。
どうしても解決できない時は
下記の設定を追加するとwp-config.phpに足すとデバッグモードになりブラウザでバグが確認できたりdebug.logが出力されたりする。
debug.logはphpの実行権限がないと出力されないので,あらかじめ権限をつけてdebug.logファイルを作成しておくこと。
define('WP_DEBUG', true) //debugモードonにする
define('WP_DEBUG_LOG', true); //debug.logファイルに記録
define('WP_DEBUG_DISPLAY', false); //ブラウザにエラーを出力する