MySQLでユーザー一覧を表示する方法|mysql.userの確認とCURRENT_USERの活用

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, MySQL > MySQLでユーザー一覧を表示する方法|mysql.userの確認とCURRENT_USERの活用
「MySQLでユーザーの一覧を確認したいのに、SHOW USERSと打ったらエラーになった」
MySQL入門者が必ず一度は通る道です。MySQLには SHOW DATABASESSHOW TABLES がありますが、SHOW USERS というコマンドは存在しません。

この記事では、mysql.user テーブルから正しくユーザー一覧を取得する方法と、現在ログイン中のユーザーを確認する CURRENT_USER 関数、さらに権限確認の SHOW GRANTS まで、実務で必要な操作をまとめて解説します。MariaDBとの違いも含めて対応します。

動作確認環境:MySQL 8.0.36 / MariaDB 10.11(RHEL 9.4 / Ubuntu 24.04 LTS)

この記事のポイント

・MySQLに「SHOW USERS」はない。SELECT User, Host FROM mysql.user を使う
CURRENT_USER() で現在のセッションのユーザーを即座に確認できる
SHOW GRANTS FOR 'user'@'host' で付与された権限を確認する
・アカウントロック中ユーザーは account_locked='Y' で絞り込める


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

なぜ「SHOW USERS」は存在しないのか

MySQLにはテーブル一覧を表示する SHOW TABLES、データベース一覧を表示する SHOW DATABASES というコマンドがあります。
では「ユーザー一覧を見たい」と思ったとき、SHOW USERS を打ちたくなるのは自然な発想です。

しかし実際に打つと次のエラーが返ります。

mysql> SHOW USERS; ERROR 1064 (42000): You have an error in your SQL syntax; ...

MySQLはユーザー情報を専用の管理テーブル mysql.user に格納しています。一覧取得には SHOW コマンドではなく、このテーブルに対して SELECT 文を実行します。

mysql.userテーブルからユーザー一覧を取得する

1. 基本的なユーザー一覧の取得

最小構成のSQLは以下の通りです。

mysql> SELECT User, Host FROM mysql.user;

実際のサーバーで実行すると、次のような出力が得られます。

+------------------+-----------+ | User | Host | +------------------+-----------+ | app_user | % | | backup_user | localhost | | root | localhost | | replication_user | 192.168.1.% | +------------------+-----------+ 4 rows in set (0.00 sec)

Host列の意味:
localhost:そのサーバー上からのみ接続可能
%:任意のホストから接続可能(本番環境では注意)
192.168.1.%:指定セグメントのみ接続可能

MySQLのユーザーは「ユーザー名@ホスト名」の組み合わせが一意のアカウントとして扱われます。同じユーザー名でもHostが異なれば別のアカウントです。

2. パスワードの認証プラグインも確認する

MySQL 8.0以降は認証プラグインが caching_sha2_password に変更されています。古いクライアントで接続できない場合は、plugin 列も確認します。

mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------+-----------------------+ | User | Host | plugin | +------------------+-----------+-----------------------+ | app_user | % | caching_sha2_password | | backup_user | localhost | mysql_native_password | | root | localhost | caching_sha2_password | +------------------+-----------+-----------------------+

古いアプリや接続ドライバが caching_sha2_password に対応していない場合は、mysql_native_password に変更が必要です。

3. アカウントロック状態を確認する

セキュリティポリシーで一時的にロックされているアカウントを確認したい場合は account_locked 列を参照します。

# ロックされているユーザーだけを表示する mysql> SELECT User, Host, account_locked FROM mysql.user WHERE account_locked = 'Y';

CURRENT_USERとUSER()で現在のセッションを確認する

1. CURRENT_USER()とUSER()の違い

ログイン中の自分のユーザー情報を確認する関数が2つあります。

mysql> SELECT CURRENT_USER();

+------------------+ | CURRENT_USER() | +------------------+ | app_user@% | +------------------+

mysql> SELECT USER();

+----------------------+ | USER() | +----------------------+ | app_user@192.168.1.10 | +----------------------+

違いのポイント:
CURRENT_USER():認証されたアカウント名(mysql.user に定義されたエントリ)
USER():実際の接続元ホスト(接続したクライアントのIPアドレスまで含む)

通常は CURRENT_USER() を使います。% で定義されたアカウントで接続した場合でも、CURRENT_USER()user@% と返すため、mysql.user テーブルのエントリとの照合がしやすいです。

2. シェルスクリプトから現在のユーザーを確認する

バックアップスクリプトなどでMySQLの接続ユーザーをログに残したい場合は、次のように使います。

# 現在のMySQLユーザーをシェルスクリプトで取得する MYSQL_USER=$(mysql -u backup_user -p'password' -e "SELECT CURRENT_USER();" --skip-column-names 2>/dev/null) echo "接続ユーザー: ${MYSQL_USER}"

SHOW GRANTSで権限を確認する

1. 自分の権限を確認する

mysql> SHOW GRANTS;

または明示的に指定する場合は次の通りです。

mysql> SHOW GRANTS FOR CURRENT_USER();

+-----------------------------------------------------------------------+ | Grants for app_user@% | +-----------------------------------------------------------------------+ | GRANT SELECT, INSERT, UPDATE, DELETE ON `appdb`.* TO `app_user`@`%` | +-----------------------------------------------------------------------+

2. 特定ユーザーの権限を確認する(root権限が必要)

# 特定ユーザーの権限を確認する mysql> SHOW GRANTS FOR 'backup_user'@'localhost';

+----------------------------------------------------------------------+ | Grants for backup_user@localhost | +----------------------------------------------------------------------+ | GRANT PROCESS, RELOAD, LOCK TABLES ON *.* TO `backup_user`@`localhost` | | GRANT SELECT ON *.* TO `backup_user`@`localhost` | +----------------------------------------------------------------------+

3. 全ユーザーの権限を一括で確認する(上級Tips)

ユーザー数が多い環境で全権限を一括確認したい場合は、次の方法が使えます。

# mysql.user のGlobalPriv列(JSON形式)から確認する方法(MySQL 8.0以降) mysql> SELECT User, Host, JSON_KEYS(Priv) AS global_privs FROM mysql.global_priv WHERE User != '';

または次のSQL一発で全ユーザーのGRANT文を生成することもできます。

# 全ユーザーのGRANT文を出力するスクリプト(rootで実行) mysql -u root -p -e " SELECT CONCAT('SHOW GRANTS FOR \'', User, '\'@\'', Host, '\';') FROM mysql.user WHERE User != '' " --skip-column-names | mysql -u root -p

MariaDBの差異と注意点

LinuxサーバーではMySQLとMariaDBを使い分けているケースが多くあります。基本的なクエリは同じですが、いくつか差異があります。

1. MariaDBのmysql.userテーブル構造の違い

MariaDBではMySQL 8.0の caching_sha2_password が存在せず、authentication_string 列にハッシュが格納されます。

# MariaDB 10.11での確認 MariaDB [(none)]> SELECT User, Host, plugin, password_expired FROM mysql.user;

2. MariaDBのアカウントロック確認

# MariaDBでのロック状態確認(account_locked列あり) MariaDB [(none)]> SELECT User, Host, account_locked FROM mysql.user WHERE account_locked = 'Y';

MySQLとMariaDBの主な差異まとめ

項目 MySQL 8.0 MariaDB 10.11
デフォルト認証プラグイン caching_sha2_password mysql_native_password
ユーザー一覧取得SQL SELECT User, Host FROM mysql.user 同じSQL
権限確認 SHOW GRANTS FOR 'user'@'host' 同じコマンド
ロック確認列 account_locked account_locked(同じ)
グローバル権限の格納形式 JSON形式(global_priv 列形式(互換性あり)

よくあるエラーとトラブルシュート

「ERROR 1142: SELECT command denied」が出る

mysql.user へのアクセスには SELECT ON mysql.user 権限またはグローバルな管理者権限が必要です。一般ユーザーでログイン中にこのエラーが出た場合は、root権限を持つユーザーで再ログインしてください。

# 一般ユーザーで接続してエラーになる例 mysql -u app_user -p mysql> SELECT User, Host FROM mysql.user; ERROR 1142 (42000): SELECT command denied to user 'app_user'@'localhost' for table 'user' # rootで接続し直す mysql -u root -p

Hostが「%」のユーザーがいても接続できない

% はワイルドカードですが、MySQLサーバーが bind-address でローカルホストのみのリスニングになっている場合は、外部からの接続自体が拒否されます。

# bind-addressの確認(外部接続を許可する場合は0.0.0.0または特定IP) grep bind-address /etc/my.cnf /etc/my.cnf.d/mariadb-server.cnf 2>/dev/null

外部接続を有効化するには bind-address = 0.0.0.0(または接続を受け付けるIPアドレス)に設定し、MySQLを再起動します。ただし、ファイアウォールでポート3306の制御も必ず行ってください。

パスワードが空のユーザーが存在する

古いインストール環境では authentication_string が空のユーザーが残っていることがあります。これはセキュリティリスクになるため、確認と削除が必要です。

# パスワードが未設定のユーザーを確認する(MySQL 8.0) mysql> SELECT User, Host, authentication_string FROM mysql.user WHERE authentication_string = '' AND User != ''; # 不要なユーザーを削除する mysql> DROP USER ''@'localhost';

本記事のまとめ

MySQLのユーザー管理でよく使う操作をまとめました。
やりたいこと コマンド・SQL
ユーザー一覧を表示する SELECT User, Host FROM mysql.user
認証プラグインも確認する SELECT User, Host, plugin FROM mysql.user
ロック中のユーザーを確認する SELECT User, Host FROM mysql.user WHERE account_locked = 'Y'
現在のセッションユーザーを確認する SELECT CURRENT_USER()
自分の権限を確認する SHOW GRANTS FOR CURRENT_USER()
特定ユーザーの権限を確認する SHOW GRANTS FOR 'user'@'host'

MySQLのユーザー管理は、サーバー運用の基本中の基本です。特に本番環境では「誰がどのホストからどのデータベースに接続できるか」を定期的に見直す習慣をつけてください。不要なユーザーや過剰な権限は、セキュリティリスクの温床になります。

Linux全般のコマンド・設定の解説は Linux 基本コマンドの解説Linux ポート確認の全コマンド もあわせて参照してください。

MySQLを含むLinuxサーバー運用を体系的に学びたい方へ

ユーザー管理やセキュリティ設定は、個別に調べるより体系的に学ぶと理解が深まります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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

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

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

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

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

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

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

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

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

この記事を書いた人

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

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

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