宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「MySQLのユーザーが増えてきて、誰がどのデータベースにアクセスできるのか把握できなくなってきた」
MySQLを運用していると、ユーザー管理が複雑になりがちです。

この記事では、MySQLのユーザー一覧を確認する SELECT user と、権限を確認する SHOW GRANTS の実践的な使い方を解説します。
ユーザーの作成・権限付与・削除まで、現場で使う操作をひととおりカバーします。

【この記事でわかること】

・MySQLのユーザー一覧は SELECT User, Host FROM mysql.user; で確認できる
・ユーザーの権限確認は SHOW GRANTS FOR 'ユーザー'@'ホスト'; を使う
・Host列の % は全ホスト許可を意味し、セキュリティ上の注意が必要
・MariaDB(RHEL/CentOS 7以降のデフォルト)でもSQL文は基本同じ


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

MySQLにログインする

ユーザー管理の操作は、MySQLにログインしてから行います。

# MySQLにrootユーザーでログイン $ mysql -u root -p Enter password: mysql>

ユーザー一覧を表示する

1. mysql.userテーブルからユーザーを確認

# MySQL 5.7以降 / MariaDB 10.4以降 mysql> SELECT User, Host FROM mysql.user; +-----------+-----------+ | User | Host | +-----------+-----------+ | root | localhost | | webapp | % | | readonly | 10.0.0.% | +-----------+-----------+

User列:ユーザー名
Host列:接続を許可するホスト。%は全ホスト、localhostはローカルのみ

※ MySQL 5.6以前では SELECT User, Host, Password FROM mysql.user; でパスワードハッシュも確認できましたが、MySQL 5.7以降ではPassword列が authentication_string に変更されています。

ユーザーの権限を確認する

1. SHOW GRANTSで権限を表示

# 特定ユーザーの権限を表示 mysql> SHOW GRANTS FOR 'webapp'@'%'; +-----------------------------------------------------+ | Grants for webapp@% | +-----------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* ... | +-----------------------------------------------------+

2. 自分自身の権限を確認

# 現在のユーザーの権限を確認 mysql> SHOW GRANTS;

ユーザーの作成と権限付与

1. ユーザーを作成する

# ユーザーを作成(localhostからのみ接続可能) mysql> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password123'; # 全ホストから接続可能なユーザーを作成 mysql> CREATE USER 'newuser'@'%' IDENTIFIED BY 'password123';

2. 権限を付与する

# 特定データベースの全権限を付与 mysql> GRANT ALL PRIVILEGES ON mydb.* TO 'newuser'@'localhost'; # SELECT権限のみ付与(読み取り専用ユーザー) mysql> GRANT SELECT ON mydb.* TO 'readonly'@'10.0.0.%'; # 権限を反映 mysql> FLUSH PRIVILEGES;

3. ユーザーを削除する

# ユーザーを削除 mysql> DROP USER 'newuser'@'localhost';

MariaDBでの操作

RHEL/CentOS 7以降では、MySQLの代わりにMariaDBがデフォルトで採用されています。ユーザー管理のSQL文はほぼ同じですが、認証方式に違いがある場合があります。

# MariaDBにログイン $ mysql -u root -p # MariaDBのバージョン確認 mysql> SELECT VERSION(); # ユーザー一覧(MariaDBでも同じSQL) mysql> SELECT User, Host FROM mysql.user;

MySQLを終了する

mysql> quit Bye

本記事のまとめ

やりたいこと コマンド
MySQLにログイン mysql -u root -p
ユーザー一覧を表示 SELECT User, Host FROM mysql.user;
ユーザーの権限を確認 SHOW GRANTS FOR 'ユーザー'@'ホスト';
ユーザーを作成 CREATE USER 'ユーザー'@'ホスト' IDENTIFIED BY 'パスワード';
権限を付与 GRANT ALL PRIVILEGES ON DB名.* TO 'ユーザー'@'ホスト';
ユーザーを削除 DROP USER 'ユーザー'@'ホスト';

「show users」と検索する人へ:MySQLにこのコマンドはない

PostgreSQLには \du、Oracleには SELECT * FROM dba_users という直感的なコマンドがあるため、MySQLにも SHOW USERS があると思って検索する方がたくさんいます。実際には、MySQL / MariaDBに「SHOW USERS」というSQL文は存在しません。

# こう打つと文法エラーになる mysql> SHOW USERS; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USERS' at line 1

正しいユーザ一覧の取り方は、ここまでで紹介した SELECT User, Host FROM mysql.user; です。

1. 「ユーザー一覧」「ユーザ一覧」「user list」全部このSQLで取れる

表記揺れに惑わされる必要はありません。MySQL / MariaDBにおける「ユーザ一覧」「ユーザー一覧」「ユーザー確認」「user list」「ユーザ確認」は、すべて以下の1行で取得できます。

# どの検索クエリで来た人も、答えはこれ1本 mysql> SELECT User, Host FROM mysql.user;

追加でログインアカウント名と認証プラグインも見たいときは、列を増やします。

# 認証方式(plugin列)まで見る mysql> SELECT User, Host, plugin FROM mysql.user; +-----------+-----------+-----------------------+ | User | Host | plugin | +-----------+-----------+-----------------------+ | root | localhost | mysql_native_password | | webapp | % | caching_sha2_password | | readonly | 10.0.0.% | mysql_native_password | +-----------+-----------+-----------------------+

plugin列を見ると、各ユーザがどの認証方式(パスワードチェック方式)を使っているかが分かります。MySQL 8.0以降のデフォルトは caching_sha2_password、MariaDB 10.4以降は mysql_native_password が混在することが多いです。

2. 「show grants」を全ユーザに対して実行する

「特定ユーザの権限確認は SHOW GRANTS FOR …」と説明しましたが、「全ユーザの権限を一括で見たい」というニーズもよくあります。MySQLには一括版のコマンドはないので、シェルで回します。

# 全ユーザの権限を一括表示するシェル版(root権限で実行) $ mysql -u root -p -BNe \ "SELECT CONCAT('SHOW GRANTS FOR ''', User, '''@''', Host, ''';') \ FROM mysql.user" | \ mysql -u root -p

show grants」「mysql 権限確認」で検索する読者の本当の意図はここにあるケースが多いです。1ユーザずつ手打ちで SHOW GRANTS FOR を実行するのは現実的ではないため、運用ではこの一括スクリプトを使ってください。

3. 情報スキーマ経由でも同じ情報が取れる

MySQL 8.0以降では、INFORMATION_SCHEMA.USER_PRIVILEGESSCHEMA_PRIVILEGES から権限情報を取得できます。

# グローバル権限を取得(INFORMATION_SCHEMA経由) mysql> SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE FROM INFORMATION_SCHEMA.USER_PRIVILEGES; +----------------+----------------+--------------+ | GRANTEE | PRIVILEGE_TYPE | IS_GRANTABLE | +----------------+----------------+--------------+ | 'root'@'localhost' | SELECT | YES | | 'webapp'@'%' | SELECT | NO | +----------------+----------------+--------------+

mysql.user テーブルを直接読むよりも、INFORMATION_SCHEMA 経由のほうがバージョン差異の影響を受けにくく、自動化スクリプトには向いています。

MariaDB 10.5・10.6・11.x で変わったこと(2026年版)

2026年現在、RHEL 9 / Rocky Linux 9 / AlmaLinux 9 系には MariaDB 10.5、Ubuntu 22.04 LTS には MariaDB 10.6、Ubuntu 24.04 LTS には MariaDB 10.11、最新ディストリでは MariaDB 11.x が同梱されています。MySQL の代わりに MariaDB を使うサーバーが増えたため、ユーザ確認まわりで「以前と違う」と感じる点が出てきました。

1. SHOW CREATE USER で「実際に発行された CREATE 文」を再現できる

MariaDB 10.4 以降 / MySQL 8.0 以降では、SHOW CREATE USER でユーザの作成時のSQL文を再構成できます。バックアップ・移行時に重宝します。

mysql> SHOW CREATE USER 'webapp'@'%'; +----------------------------------------------------------------+ | CREATE USER for webapp@% | +----------------------------------------------------------------+ | CREATE USER 'webapp'@'%' IDENTIFIED VIA mysql_native_password USING '*ABCDEF...'; | +----------------------------------------------------------------+

このコマンドで得たSQL文を別のサーバで実行すれば、同じユーザを同じパスワードハッシュで再現できます。

2. unix_socket 認証(パスワードを使わない root ログイン)

MariaDB 10.4 以降のディストリ標準パッケージでは、rootユーザのデフォルト認証が unix_socket(OSのrootユーザでのみログイン可)に変わっています。「mysql -u root -p」でパスワードを聞かれず、いきなり通る/通らないの違いがここに起因します。

# OSのrootから(パスワードなしでログイン可) [root@db01 ~]# mysql MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user WHERE User='root'; +------+-----------+-------------+ | User | Host | plugin | +------+-----------+-------------+ | root | localhost | unix_socket | +------+-----------+-------------+ # 一般ユーザから(パスワード認証に切り替えたい場合) $ mysql -u root -p ERROR 1698 (28000): Access denied for user 'root'@'localhost'

パスワード認証に戻したい場合は、rootユーザのpluginを mysql_native_password に変更します。

# OSのrootからログインして変更 MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('your_password'); MariaDB [(none)]> FLUSH PRIVILEGES;

3. MariaDB 11.x 以降の主な変化(運用視点)

MariaDB 11.0 ~ 11.4 で、MySQLとの差異がさらに広がっています。ユーザ管理関連で覚えておきたいポイントを整理します。

項目 MariaDB 11.x の挙動
デフォルト認証プラグイン mysql_native_password(互換性重視)。MySQL 8.0+ は caching_sha2_password
ROLE(ロール) MariaDB 10.0以降サポート。CREATE ROLEでロール作成、GRANTで割り当て
SHOW USERSの代替 MariaDB独自の mysql.global_priv テーブル(10.4以降)も併用可
passwordless root 11.x でも unix_socket がデフォルトのまま

4. MariaDB 10.4+ で global_priv テーブルから一覧を取る

MariaDB 10.4 以降では、mysql.user はビュー扱いになり、実体は mysql.global_priv テーブルにあります。SHOW CREATE TABLE mysql.user を見ると確認できます。MariaDB固有の機能(パスワード有効期限・パスワード履歴など)はこちらに格納されています。

# MariaDB 10.4+ で実体テーブルを直接見る MariaDB [(none)]> SELECT User, Host, JSON_DETAILED(Priv) FROM mysql.global_priv;

ただし運用上は、互換性のある SELECT User, Host FROM mysql.user; を使い続けるのが安全です。global_priv はMariaDB固有のため、MySQLに移行する可能性がある環境では避けてください。

5. MariaDBバージョン早見表(2026年5月時点)

ユーザ管理で迷ったら、まず自サーバのバージョンを確認します。

ディストリ 同梱DB 確認コマンド
RHEL 9 / Rocky 9 / AlmaLinux 9 MariaDB 10.5 mysql --version または SELECT VERSION();
RHEL 10 / Rocky 10 MariaDB 10.11 SELECT VERSION();
Ubuntu 22.04 LTS MariaDB 10.6 SELECT VERSION();
Ubuntu 24.04 LTS MariaDB 10.11 SELECT VERSION();
MariaDB公式リポジトリ MariaDB 11.4 LTS(2024-) SELECT VERSION();

※最終更新: 2026-05-11(show users代替・全ユーザ一括grants・MariaDB 10.5/10.6/11.x対応・unix_socket認証を追加)

mysql.user テーブルから authentication_string を含めてユーザー詳細を取得する|権限とパスワードハッシュの一括確認

「MySQL ユーザー一覧」で辿り着く方の多くは、User と Host だけでは足りず、パスワードのハッシュと付与済みの権限まで一括で確認したいケースだと思います。mysql.user テーブルを直接 SELECT すれば、グローバル権限の Y/N、認証プラグイン、パスワードハッシュまで一発で取れます。

# ユーザー / ホスト / 認証プラグイン / パスワードハッシュをまとめて取得
mysql> SELECT User, Host, plugin, authentication_string
    -> FROM mysql.user
    -> ORDER BY User, Host;
+------------------+-----------+-----------------------+-------------------------------------------+
| User             | Host      | plugin                | authentication_string                     |
+------------------+-----------+-----------------------+-------------------------------------------+
| app_user         | %         | mysql_native_password | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
| root             | localhost | caching_sha2_password | $A$005$...                                |
+------------------+-----------+-----------------------+-------------------------------------------+

付与済みのデータベース単位の権限を一覧で見たいなら mysql.db も併用します。

# データベース単位の付与状況を確認
mysql> SELECT Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv
    -> FROM mysql.db
    -> WHERE User = 'app_user';

私もアカウント棚卸しのときに SHOW GRANTS を1ユーザーずつ叩いていた時期があり、20アカウントを超えた瞬間に手が動かなくなりました。mysql.usermysql.db を SELECT する方法を覚えると、Excel に貼り付けて棚卸し表を作るのも楽になります。

# SHOW GRANTS を全ユーザー分まとめて生成するワンライナー
mysql> SELECT CONCAT('SHOW GRANTS FOR ''', User, '''@''', Host, ''';') AS query
    -> FROM mysql.user;

MySQLのユーザー管理をもっと深く学びたい方へ

権限設定を誤るとデータベース全体がセキュリティリスクにさらされます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。