メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
MySQL のアクセス制御モデルは、認証(あなたが誰か)と認可(あなたが何をできるか)を分離します。ユーザーアカウントを作成し、それとは別に権限を付与します。

ユーザーの作成

@'localhost' の部分はホスト制限です。このアカウントはローカルマシンからしか接続できません。よくあるホストのパターンは次のとおりです。 'alice'@'localhost' と 'alice'@'%' は、ユーザー名が同じでも 2 つの別々のアカウントです。

権限の付与

権限の対象は database.table 記法を使います。
  • *.* — すべてのデータベースのすべてのテーブル(グローバル)
  • myapp.* — myapp データベースのすべてのテーブル
  • myapp.orders — orders テーブルのみ

権限レベル

よく使う権限は次のとおりです。

付与内容の表示

権限の取り消し

付与されたことのない権限を取り消すと、ERROR 1141: There is no such grant defined for user が返ります。ユーザーは他のレベルで付与された権限を保持します。SELECT ON myapp.* を取り消しても、SELECT ON myapp.orders が別に付与されていれば、それは削除されません。

パスワードの変更

次回ログイン時にパスワードの変更を強制します。

ロール(MySQL 8.0 以降)

ロールは、名前の付いた権限の集まりです。各ユーザーに個別の権限を付与する代わりに、ロールを付与します。
ユーザーがロールの権限を使うには、ロールを有効化する(またはデフォルトとして設定する)必要があります。

ユーザーの削除

ユーザーを削除すると、そのすべての権限が自動的に取り消され、すべてのロールから外されます。ユーザーが接続中であれば、そのセッションは終了するまで続きます。

最小権限のベストプラクティス

各アカウントには必要な権限だけを与えます。
  • アプリケーションの読み取りレプリカ: SELECT のみ
  • アプリケーションの書き込みアカウント: SELECT、INSERT、UPDATE、DELETE
  • アプリケーションのスキーマアカウント(マイグレーション): CREATE、ALTER、DROP、INDEX を追加
  • DBA アカウント: *.* に対する ALL PRIVILEGES
  • アプリケーションアカウントには SUPER や ALL を決して付与しない
ホストはできる限り厳しく制限します。app.example.com 上のアプリケーションは、'appuser'@'%' ではなく 'appuser'@'app.example.com' を使うべきです。

よくある質問

MySQL は権限を自動的にフラッシュしますか?

CREATE USER、GRANT、REVOKE、ALTER USER によるすべての変更はすぐに反映されます。FLUSH PRIVILEGES は不要です。FLUSH PRIVILEGES が必要なのは、権限テーブルを INSERT/UPDATE で直接変更した場合だけです(そうすべきではありません)。

localhost と 127.0.0.1 の違いは何ですか?

MySQL の localhost は、ネットワークのループバックではなく、Unix ソケット接続(ローカルのファイルソケット)を指します。127.0.0.1 は TCP ループバックです。同じマシン上でもクライアントが TCP で接続するなら、ホスト制限には 127.0.0.1 を使ってください。

トラブルシューティング

関連項目