MySQL入門者が必ず一度は通る道です。MySQLには
SHOW DATABASES や SHOW 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' で絞り込める
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ「SHOW USERS」は存在しないのか
MySQLにはテーブル一覧を表示するSHOW TABLES、データベース一覧を表示する SHOW DATABASES というコマンドがあります。では「ユーザー一覧を見たい」と思ったとき、
SHOW USERS を打ちたくなるのは自然な発想です。しかし実際に打つと次のエラーが返ります。
mysql> SHOW USERS; ERROR 1064 (42000): You have an error in your SQL syntax; ...
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)
・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 != '';
# 全ユーザーの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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:EC2インスタンスのhostnameを永続変更する方法|Amazon Linux 2・2023対応の手順と注意点
- 前のページへ:Linux初心者向けインストール基礎知識|ディストロ選定からデュアルブート・仮想環境まで
- この記事の属するカテゴリ:Linuxtips・MySQLへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます