◀ 3.

MySQL/MariaDBのユーザー一覧|User・Host・権限の可視範囲

一覧の調査では、アカウントを変更しない

自分の確認と管理者の一覧・情報公開範囲を分ける図

登録アカウントの一覧、現在接続している自分、付与権限、実際の接続中セッションは別の情報です。mysql.userの行があることだけで接続/全表の操作が可能とは言えず、行が見えないことだけで未登録とも言えません。まず自分で読める情報から確認し、管理者の一覧取得と分けます。

一般利用者:現在の接続と自分の権限

SELECT VERSION() AS server_version, USER() AS presented_identity,
       CURRENT_USER() AS matched_account, DATABASE() AS current_database;
SHOW GRANTS;

通常の直接接続で、USER()とCURRENT_USER()から提示名と照合アカウントを確認します。SHOW GRANTSは自分の権限を読むための手掛かりで、mysql.user全体を読める必要はありません。隔離検体のSELECT利用者は自分のSHOW GRANTSが成功し、mysql.userのSELECTは1142で拒否されました。これは管理情報を見せない設計として正常です。

出力の共有には注意:MariaDB11.8.9の検体ではSHOW GRANTSにIDENTIFIED句/認証ハッシュを含む出力がありました。MySQLと同じ表示だと決めつけず、実際の全文を公開しません。SHOW CREATE USERや認証列の全量取得も通常の質問回答に不要です。必要な項目だけを秘密値を伏せて伝えてください。

管理者:UserとHostだけに限定する

SELECT User, Host
FROM mysql.user
WHERE User IN ('cwiki_w23_reader', 'cwiki_w23_renamed')
ORDER BY User, Host;

既知の対象名だけを絞った検体用SQLです。全件監査が必要な管理者はWHEREの条件を用途に合わせて別に設計します。ORDER BY User,Hostで、同じuserのhost違いも分けて読みます。名前の重複は直ちに不要データを意味しないため、一括DROPへ進みません。

MySQL8.4ではmysql.userはシステム表、MariaDB10.4以降ではmysql.global_privを参照する互換viewです。名前は共通でも列と認証の表現は同じではありません。MySQL用のpassword_expired/account_locked等のSQLをMariaDBへ無条件に流用せず、製品/版を確認します。MariaDBの複数認証をplugin1列だけで完全に説明したとも扱いません。

権限一覧と有効な権限は分けて確認する

information_schema.USER_PRIVILEGESはグローバル権限の情報で、DB単位・表単位・列単位・routineやロールのすべてを一表に集めた一覧ではありません。SCHEMA_PRIVILEGES/TABLE_PRIVILEGESにも対象と可視範囲があります。MySQLのSHOW GRANTSでロールの付与が分かっても、現在の接続で有効になっているロールやその展開とは区別します。MariaDBへMySQLのUSING構文をそのまま適用しません。

表の読取が目的なら、その表のSELECT可否を実際の利用者で確認します。mysql.*全体のSELECTやroot利用を、表示エラーを消すためだけに追加しません。一覧の監査に強い権限が必要なら管理者が必要最小限の結果を返す運用を選べます。

host、ロック、接続状態を読み違えない

%はhost照合の広い条件で、どこからでも必ず接続できる証明ではありません。待受/経路/名前解決/ファイアウォール/TLS/認証/より具体的な照合候補を分けます。MySQL8.4ではhostの%/_ wildcardは非推奨です。10.0.%というパターンから、実際の社内LANやネットワーク境界を断定しません。

アカウントのロック/パスワード期限と、接続中セッションの終了は別です。DROP後に接続が残る問題と、mysql.userの登録行が残ることも同じではありません。別サーバー/host違い/権限不足/削除SQLの成否を確認し、一覧に見えるだけで再DROPしないでください。

他製品の比較は補足として読む

既存のPostgreSQL/Oracle比較コードは残していますが、MySQL/MariaDBの作成・変更手順とは混ぜません。psqlの\dgは\duと同じロール一覧で、グループだけを表示する命令ではありません。PostgreSQLのroleはLOGIN可能か/メンバーシップ/権限を別に見ます。pg_%のunderscoreはLIKEの任意1文字なので、旧例のWHEREを予約prefix判定の厳密な実装とは扱いません。

OracleのDBA_USERSは管理情報の参照権限が必要で、CURRENTのコンテナも重要です。ACCOUNT_STATUSがOPENでもCREATE SESSIONや対象PDB・接続先の条件まで満たす保証ではありません。AUTHENTICATION_TYPEは認証の種類で、MySQLのplugin名ではありません。ロック理由の調査と解除/パスワード再設定を分け、表示のためだけに変更しません。これら他製品の旧全SQLを今回実行したわけではありません。

元のmysql.userの短い例と列の説明も注意付きで戻しています。作成はユーザー作成、変更はRENAME USERで、一覧調査と分けて進めてください。

旧例の注意:他製品の比較は補足です。SHOW GRANTS等の出力をそのまま公開せず、製品別の認証情報と可視範囲を確認します。

この記事の要点
  • MySQL: SELECT user, host FROM mysql.user; が基本。管理情報を読む権限が必要な場合は管理者に確認
  • 権限の中身は SHOW GRANTS FOR "user"@"host"; で 1 ユーザーずつ確認
  • information_schema.USER_PRIVILEGESはグローバル権限の情報で、全スコープ/有効ロールの一覧ではない
  • PostgreSQL: \du または SELECT * FROM pg_roles;
  • Oracle: SELECT username, account_status FROM dba_users; — ACCOUNT_STATUSを確認。AUTHENTICATION_TYPEはMySQLの認証plugin名ではない

MySQL の場合

基本: mysql.user テーブル

旧例の注意:出力は旧模式例です。%から全IPの接続成功、10.0.%から社内LANだけと断定できません。認証とネットワーク経路は別です。

-- 全ユーザー (アカウント = user + host のセット)
SELECT user, host FROM mysql.user;

-- +------------------+-----------+
-- | user             | host      |
-- +------------------+-----------+
-- | root             | localhost |
-- | mysql.sys        | localhost |
-- | mysql.session    | localhost |
-- | app_user         | %         |   ← 全 IP から接続可
-- | readonly         | 10.0.%    |   ← 社内 LAN のみ
-- +------------------+-----------+

MySQL は ユーザー名と接続元ホスト名の組み合わせでアカウントを管理します。同じ app_user でも 'app_user'@'localhost' と 'app_user'@'%' は別アカウント扱い。

認証プラグインや有効期限も見る

旧例の注意:これはMySQL用の列指定例で、MariaDBと全版の共通構文ではありません。表示例のroot/systemアカウントのplugin/状態も全環境の実測ではありません。

-- MySQL 5.7 以降
SELECT user, host, plugin, password_expired, account_locked
FROM mysql.user
ORDER BY user, host;

-- +-----------+-----------+-----------------------+------------------+----------------+
-- | user      | host      | plugin                | password_expired | account_locked |
-- +-----------+-----------+-----------------------+------------------+----------------+
-- | root      | localhost | caching_sha2_password | N                | N              |
-- | mysql.sys | localhost | caching_sha2_password | N                | Y              |  ← ロック中
-- +-----------+-----------+-----------------------+------------------+----------------+

個別の権限を確認

旧例の注意:MariaDBでは認証ハッシュを含む出力があり、公開しません。MySQLでもロール付与/展開/有効状態は別に確認します。

SHOW GRANTS FOR 'app_user'@'%';

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

-- 現在ログイン中の自分の権限
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER();

information_schema 経由

旧例の注意:USER_PRIVILEGESは全権限の一括一覧ではありません。集計の順序やGROUP_CONCATの上限/可視範囲にも注意し、schema/table/column/roleを混同しません。

-- 全権限を行で取得
SELECT * FROM information_schema.USER_PRIVILEGES;

-- グローバル権限の集計
SELECT GRANTEE, GROUP_CONCAT(PRIVILEGE_TYPE) AS privs
FROM   information_schema.USER_PRIVILEGES
GROUP  BY GRANTEE;

-- スキーマレベル権限
SELECT * FROM information_schema.SCHEMA_PRIVILEGES;

-- テーブルレベル権限
SELECT * FROM information_schema.TABLE_PRIVILEGES;

PostgreSQL の場合

psql のメタコマンド

旧例の注意:旧コメントの「dgはグループロールのみ」は誤りで、duと同じロール一覧です。出力は旧模式例で、所属情報を全版で同じ形と保証しません。

postgres=# \du
                                     List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 app_user  |                                                            | {}
 readonly  | Cannot login                                               | {ro_group}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \du+      -- 詳細表示 (コメント含む)
postgres=# \dg       -- グループロールのみ

SQL から取得

旧例の注意:pg_%のunderscoreは任意1文字です。table_privilegesを全権限の完全な一覧とは扱わず、LOGIN/所属/継承を別に確認します。

SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin,
       rolconnlimit, rolvaliduntil
FROM   pg_roles
WHERE  rolname NOT LIKE 'pg_%'      -- 内部ロール除外
ORDER BY rolname;

-- 旧 pg_user (LOGIN ロールのみ表示する互換ビュー)
SELECT usename, usesuper, valuntil FROM pg_user;

-- 全権限を一覧
SELECT grantee, table_schema, table_name, privilege_type
FROM   information_schema.table_privileges
WHERE  grantee NOT IN ('postgres', 'PUBLIC')
ORDER BY grantee, table_schema, table_name;

PostgreSQLではユーザー/グループをロールで扱います。LOGIN属性の有無と、他ロールへの所属/権限の継承は別の情報です。グループ用途のロール自体が別ロールのメンバーである必要はありません。

Oracle の場合

旧例の注意:Oracleの管理viewは権限/接続コンテナを確認します。OPENはCREATE SESSIONの許可や接続成功まで保証せず、状態の旧短縮説明を全原因の定義とは扱いません。

-- DBA 権限ユーザーで
SELECT username, account_status, created, default_tablespace,
       authentication_type, profile
FROM   dba_users
ORDER  BY username;

-- ACCOUNT_STATUS で見られる主な状態
-- OPEN                          ... 利用可
-- LOCKED                        ... 管理者がロック
-- EXPIRED                       ... パスワード期限切れ
-- EXPIRED & LOCKED              ... ロック + 期限切れ
-- LOCKED(TIMED)                 ... 連続失敗で自動ロック

-- 一般ユーザーから見える範囲
SELECT username FROM all_users;
SELECT username FROM user_users;       -- 自分自身

-- ユーザーの持つロール
SELECT * FROM dba_role_privs WHERE grantee = 'APP_USER';

-- ユーザーのシステム権限
SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER';

-- ユーザーのオブジェクト権限
SELECT * FROM dba_tab_privs WHERE grantee = 'APP_USER';

DB 間の対応表

旧例の注意:対応表は代表例で、全スコープや有効権限の同一性を保証しません。MySQLの内部role表をMariaDBへ無条件に流用しません。

目的MySQLPostgreSQLOracle
ユーザー一覧SELECT user,host FROM mysql.user\du / pg_rolesdba_users
権限SHOW GRANTS\dp / information_schema.table_privilegesdba_sys_privs / dba_tab_privs
ロール(MySQL 8.0+) mysql.role_edgespg_auth_membersdba_role_privs
現在のユーザーSELECT CURRENT_USER()SELECT current_userSELECT USER FROM dual

削除済みユーザーが残るケース

削除SQLの成否、接続先、host違い、可視範囲を確認します。所有/DEFINERとDROPの条件は製品別で、一律には言えません。以下を一覧取得の続きとして実行しないでください。

  • MySQL: 接続中セッションが残っていると DROP USER しても接続が切れるまで権限が有効に見えることがある
  • PostgreSQL: 旧例のREASSIGN OWNED BY old_user TO new_user;とDROP OWNED BY old_user;は所有/権限へ影響する別操作です。対象DB/共有依存/権限を調べ、一覧表示のために実行しません。
  • Oracle: DROP USER xxx CASCADE で所有スキーマごと削除されるため誤削除に厳重注意

認証プラグインの確認 (MySQL)

旧例の注意:実行しない旧認証変更例です。mysql_native_passwordはMySQL8.4で既定無効/9.0で削除です。LDAP化も導入/資格情報/接続へ影響する別計画であり、plugin確認のためにALTER USERを実行しません。

-- MySQL 8.0 既定: caching_sha2_password
-- 古いクライアントが繋がらない場合 mysql_native_password に戻す
ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'newpass';

-- LDAP 認証 (Enterprise Edition)
ALTER USER 'app'@'%' IDENTIFIED WITH authentication_ldap_simple;

-- 認証プラグインの一覧
SELECT user, host, plugin FROM mysql.user;

FAQ

Q: mysql.user を参照できない
A: 管理情報の参照権限が不足する場合があります。自分のSHOW GRANTSと目的表の操作を先に確認し、全一覧が必要なら管理者へ依頼します。表示のためだけのroot利用やmysql.*全体へのSELECTを追加しません。

Q: 同じ user 名で host が違うレコードがいくつもある
A: userとhostの組が違えば別アカウントです。用途/照合先/依存を調べ、同名が複数あるだけで一括DROPしません。

Q: Oracle で「ロックされたユーザー」を解除したい
A: 旧操作例のALTER USER scott ACCOUNT UNLOCK;やIDENTIFIED BY new_passwordは表示ではなく認証状態の変更です。まず対象コンテナとロック理由を確認し、必要な場合だけ管理者の計画に従います。

元の一覧SQLと列の説明

元例の注意:元v1の書式付きSQLを保持しています。MariaDB10.4以降のmysql.userは互換viewで、現行の両製品共通の物理表という意味ではありません。

SELECT user,host FROM mysql.user;

MySQLでユーザー一覧を表示する方法

MySQL で作成済みユーザーの一覧を確認したい場合は、mysql.user テーブルを参照します。登録済みのuserとhost条件を確認する例で、接続成功やネットワーク到達性を保証するものではありません。

実行例

元例の注意:登録済みアカウントの必要な列だけを読む旧SQLです。権限不足をroot昇格で消さず、管理者へ必要な結果だけ依頼します。

SELECT user, host FROM mysql.user;

このSQLで分かること

  • MySQL に登録されているユーザー名
  • そのアカウントのhost照合条件(経路/TLS/認証/表権限は別確認)
  • ローカル限定か、外部接続も許可されているかの傾向

確認時の見方

元例の注意:列の見方は照合条件の概要で、localhost/外部の文字列だけから接続成功を断定しません。

項目 見方
user MySQL のユーザー名
host localhost 限定か、外部ホスト許可かを確認する

次に見るページ

確認範囲と関連ページ

2026年10月26日確認。掲載した新8SQLをローカルの新規tmpfs MySQL8.4.13/MariaDB11.8.9-ubu2404で実行し、各12/計24試験に成功しました。作成だけの表読取拒否、SELECT許可と書込拒否、IF NOT EXISTS後の旧/別パスワード、別hostの保持、RENAMEの接続/権限/衝突/複数指定/DEFINER viewの差を検査しました。本番アカウント/認証/権限/DB設定には変更していません。全製品/旧版/全認証pluginやTLS実通信、replication、既存pool、全DEFINERオブジェクト、旧比較の全SQLを実行保証するものではありません。新図は900/360pxの静止画で文字枠を確認し、実ブラウザ/実端末の検証とは区別しています。

ユーザー関連の親ページから子ページを選択できます。作成、名前変更、一覧、製品配下のSQL、MySQL/MariaDBも参照してください。

一次資料:MySQL CREATE USERと既存名・秘密情報、MariaDB CREATE USERとhost、MySQL RENAME USERとDEFINER保護、MariaDB RENAME USERの部分成功、権限変更の反映、MySQLアカウント名とhost、MariaDB mysql.userの互換view、MySQL SHOW GRANTSとロール、MariaDB SHOW GRANTS、MySQL旧native認証の廃止、PostgreSQL psqlのロール一覧、PostgreSQLロール、Oracle DBA_USERS。

子ページ

子ページはありません

同階層のページ
  1. ユーザー作成
  2. ユーザー名変更(RENAME USER)
  3. ユーザー一覧の表示

最近更新/作成されたページ