この記事について
| 環境 | さくら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系)。
