はじめに
MySQLでアプリケーションからデータベース接続を行おうとした際に、GRANT
文を使ってユーザーに権限を与えようとしてエラーが発生することがあります。
本記事では、「ERROR 1410: You are not allowed to create a user with GRANT」というエラーが出たときの原因とその対処方法について、具体的なステップを交えて解説します。
書こうと思ったきっかけ
DockerコンテナからMySQLに接続するFlaskアプリケーションを構築中、MySQLユーザーに権限を与えようとして「ERROR 1410」が発生しました。
一見、正しいユーザーでログインしているにもかかわらず権限付与が失敗する原因を調査し、MySQL 8.x の仕様変更が関係していることがわかりました(自分調べ)。
そこで、同じような環境で困っている方の参考になればと思い、この記事を書くことにしました。
MySQLで「ERROR 1410: You are not allowed to create a user with GRANT」が出たときの対処法
■ 発生したエラー
ERROR 1410 (42000): You are not allowed to create a user with GRANT
このエラーは以下のSQLを実行した際に発生:
GRANT ALL PRIVILEGES ON flask_db.* TO 'root'@'%';
■ 調査と前提条件
-
SELECT CURRENT_USER();
の結果:root@localhost
-
SHOW GRANTS FOR 'root'@'localhost';
の結果:WITH GRANT OPTION
が付与されている
上記より、root@localhost は完全な権限を持っていることが確認できた。
■ 原因
MySQL 8.x 以降のセキュリティ強化により:
-
GRANT ... IDENTIFIED BY
の構文が実行できない -
'user'@'%'
というホスト指定でのGRANT
も制限される場合がある
■ 解決策 (OpenCanvas)
Step 1: ユーザーの新規作成
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
Step 2: 権限の付与
GRANT ALL PRIVILEGES ON flask_db.* TO 'flaskuser'@'%';
FLUSH PRIVILEGES;
Step 3: Flaskアプリ側の修正
app.py
def get_db_connection():
return mysql.connector.connect(
host='192.168.1.11',
user='flaskuser',
password='flaskpass',
database='flask_db'
)
■ ポイント
-
root
ユーザーをアプリに使わない -
%
ホストはDockerなどの外部接続用に適している - ホストの範囲や権限は本番環境では精密に設定する
まとめ
MySQLでユーザー権限を設定する際は、バージョンによる構文の違いやセキュリティ仕様の変更に注意が必要です。
MySQL 8.x以降では、GRANT
とIDENTIFIED BY
を組み合わせることができないなどの制限があり、従来通りの方法ではエラーになることがあります(自分調べ)。
アプリケーション用には専用のユーザーを作成し、必要な権限だけを与えることで、より安全で柔軟な設計が可能になります。
今後も同様のエラーが発生した場合に備えて、手順や原因を明確にしておくことが大切です。この記事が、開発中にMySQLと格闘している方の助けになれば幸いです!