外部サーバーからmysqlに接続できない(Host is not allowed to connect)の対処

この記事について

環境さくらVPS間のサーバー移行(MariaDB / MySQL 5.x系)
目的新サーバーから旧サーバーのmysqlに接続できるようにする
結果接続元ホスト+パスワード付きでGRANTし、userテーブルのパスワード設定を直して接続できた

つまずきポイント要約

  • mysqlはユーザー名+接続元ホストの組で権限管理される。Host is not allowed to connect は接続元ホストが未登録
  • IDENTIFIED BY を付けずに GRANT するとパスワードなしで登録されうる
  • userテーブルを直接確認してパスワード列が入っているか見る。直したら FLUSH PRIVILEGES

事象

新サーバーに移行中にエラーが出た

Fatal error: Uncaught mysqli_sql_exception: Host 'xxxx.vs.sakura.ne.jp' is not allowed to connect to this MySQL server in /var/www/libs/xxx.php:606

外部のmysqlサーバーにアクセスできないようだ

対処(試行錯誤の記録)

現在のrootユーザーの許可されているホストを確認

SELECT Host, User FROM mysql.user WHERE User = 'root';

接続先のmysqlサーバーにアクセスの許可を与える

GRANT ALL PRIVILEGES ON *.* TO 'root'@'123.123.123.123'; 
FLUSH PRIVILEGES;

これだとおそらくmysqlデータベースのuserテーブルにはパスワードなしで登録されて、既存のパスワードを使用してmysqlサーバーに接続してパスワードエラーで接続できない

上記でなく多分こっちが正解↓

GRANT ALL PRIVILEGES ON *.* TO 'root'@'123.123.123.123' IDENTIFIED BY 'password'; 
FLUSH PRIVILEGES;
エラーが変わった
Uncaught Error: Syntax error, unrecognized expression: .

Fatal error: Uncaught mysqli_sql_exception: Access denied for user 'root'@'osxxxx.vs.sakura.ne.jp' (using password: YES) in /var/www/libs/xxxxx.php:606

パスワードもあってるはずなのに特定のサーバーからはログインできない。

mysqlデータベースのuserテーブルを確認して与えた権限が登録できているか確認

赤枠の部分にパスワードが設定されていない

同じパスワードなので上からカラムからコピーしてmysqlをリフレッシュ

FLUSH PRIVILEGES;

アクセスできるようになった

補足

MySQL 8以降は GRANT ... IDENTIFIED BY 構文が廃止されている。CREATE USER 'root'@'IP' IDENTIFIED BY 'password';GRANT ALL PRIVILEGES ON *.* TO 'root'@'IP'; の2段階で行う(この記事の方法はMariaDB / MySQL 5.x系)。

タイトルとURLをコピーしました