◀ 4.

MySQL/MariaDBのDB一覧|SHOW DATABASESと権限の違い

▶

MySQLのDB一覧は、接続中アカウントから見える範囲

まずサーバーへ接続し、SHOW DATABASES;で一覧を確認します。DB名が見えること、既定DBに選べること、表をSELECT/更新できることは別です。見えないDBを作り直したり、一覧を見るためだけにrootへ変更したりしません。

サーバー接続、既定DBの選択と一覧の可視範囲

一覧と既定文字コードを読み取る例

以下のcwiki_w29_*は隔離検体のDB名です。自分の接続先/対象へ置換してください。SHOW DATABASESは可視な全体、後続SELECTは指定した3DBの可視な行だけを返します。DB既定のcharset/collationは既存の全表・全列の設定や変換完了を表しません。

SHOW DATABASES;
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME IN ('cwiki_w29_a', 'cwiki_w29_b', 'cwiki_w29_hidden')
ORDER BY CAST(SCHEMA_NAME AS BINARY);

MySQL8.4では、対象DB/配下objectの権限だけでなく、グローバルSHOW DATABASESや他のstatic global privilege、partial revoke、サーバーのskip-show-database設定によっても結果が変わります。「個別DBへの表権限がないDBは必ず見えない」とは限りません。MariaDBの各版の権限仕様を同一と決めつけません。

隔離検体で比べた「見える」と「使える」

MySQL8.4.13/MariaDB11.8.9で3つのDBを用意し、2DBのitemsだけをSELECT可能にしたreaderにはその2DBが見え、hiddenは見えませんでした。別のshow_readerへSHOW DATABASESだけを付けるとhiddenの名前も見えますが、hiddenのUSE/SELECTは拒否されました。これは本番への権限付与手順ではなく、可視性をアクセス許可と混同しないための検体です。

一覧にない・想定と違う場合

  • SELECT DATABASE()がNULLでもサーバーへの接続自体は成立している場合があります。
  • 同名DBでも別サーバーに接続している可能性があります。接続先の管理情報/接続ID/アカウントを合わせて確認します。
  • 一覧0件/一部だけを不存在や障害と断定しません。フィルタ・大小文字・権限と対象版を確認します。
  • 必要な操作が拒否されたらエラーコードと対象を管理者へ伝えます。通常の確認にCREATE USER/GRANT/FLUSHを追加しません。

対象DBを選ぶ次の手順はUSEによる既定DB選択、表/ビューはテーブル一覧、列/索引等はテーブル定義です。元の確認順とコマンド一覧への導線も保持します。

他製品の一覧・容量の比較は別に読む

PostgreSQLのDBとschema、Oracleのdatabase/PDB/ユーザーschema、SQLiteの接続中/ATTACHされたファイルは同じ概念ではありません。OracleのV$DATABASEをMySQLと同じサーバー上の全DB一覧にしません。既存の比較表は対象を分けて参照します。容量のSUMや表統計はengine/権限/NULL/観測時点に依存し、全ファイル容量・空き容量・その瞬間の正確な行数を保証しません。

既存の接続・一覧資料(製品別の補足)

この記事の要点
  • SHOW DATABASES; を接続先/権限/クライアントの対象版に合わせて実行する
  • information_schema.SCHEMATA を SELECT すると、文字コード・照合順序などメタ情報も取れる
  • シェルから 1 行で取得: mysql -uroot -p -e "SHOW DATABASES;"
  • 一覧の可視範囲はDB/配下object・global権限や設定にも依存し、表示だけで表の操作可否を判断しない
  • PostgreSQL は \l (psql) / SQL Server は sys.databases / Oracle は v$database
  • 特定 DB のテーブル一覧は USE db; SHOW TABLES; または SHOW TABLES FROM db;

SHOW DATABASES — 最も基本

旧例の注意:出力は一例で、システムschemaや表示順/可視DBは接続先/権限/設定で異なります。

SHOW DATABASES;
-- +--------------------+
-- | Database           |
-- +--------------------+
-- | information_schema |
-- | mysql              |
-- | performance_schema |
-- | sys                |
-- | myapp              |
-- +--------------------+

information_schema / mysql / performance_schema / sys は MySQL システムスキーマです。ユーザー作成 DB と区別して見てください。

パターンマッチで絞り込み

旧例の注意:LIKEの%/_とWHEREを区別します。既定DBの選択や個々の表権限を変更する文ではありません。

-- LIKE で絞る
SHOW DATABASES LIKE 'myapp%';

-- システム DB を除外
SHOW DATABASES WHERE `Database` NOT IN ('information_schema','mysql','performance_schema','sys');

information_schema を直接参照

メタ情報(文字コード等)も同時に取りたい場合:

旧例の注意:SCHEMATAは可視なDBの既定属性です。全表/列のcharsetや使用許可を証明せず、後半のフィルタは指定名を除くだけです。

SELECT schema_name AS db,
       default_character_set_name AS charset,
       default_collation_name AS collation
FROM information_schema.SCHEMATA
ORDER BY schema_name;

-- ユーザー DB のみ
SELECT schema_name
FROM information_schema.SCHEMATA
WHERE schema_name NOT IN ('information_schema','mysql','performance_schema','sys');

シェル / スクリプトから

旧例の注意:rootは一覧確認の必須条件ではありません。defaults-fileの位置/読込みと秘密値/権限を確認し、既存設定を上書きしません。

# CLI から 1 行で取得
mysql -uroot -p -e "SHOW DATABASES;"

# パスワードを .my.cnf 等に書いておくと対話なしで
mysql --defaults-file=~/.my.cnf -e "SHOW DATABASES;"

# ヘッダなし・タブ区切り(パイプ処理向き)
mysql -uroot -p -N -B -e "SHOW DATABASES;"

# mysqlshow ユーティリティ
mysqlshow -uroot -p
mysqlshow -uroot -p myapp        # myapp のテーブル一覧

# ホスト指定
mysql -h dbhost -P 3306 -uuser -p -e "SHOW DATABASES;"

テーブル一覧も合わせて

旧例の注意:SHOW TABLESはビューも含みます。容量の全schema集計は可視範囲/engine/NULLに依存し、全物理ファイル容量や即時回収量ではありません。

-- 接続中の DB のテーブル一覧
SHOW TABLES;

-- 別 DB のテーブル一覧
SHOW TABLES FROM myapp;

-- ビューも含む詳細
SHOW FULL TABLES FROM myapp;
-- +-------------+------------+
-- | Tables_in_…  | Table_type |
-- +-------------+------------+
-- | users       | BASE TABLE |
-- | user_stats  | VIEW       |

-- information_schema 経由
SELECT table_schema, table_name, table_type, engine
FROM information_schema.TABLES
WHERE table_schema = 'myapp'
ORDER BY table_name;

-- DB のサイズも一緒に
SELECT table_schema AS db,
       ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
GROUP BY table_schema
ORDER BY size_mb DESC;

他 DBMS での「DB 一覧」

DBMSDB 一覧テーブル一覧
MySQL / MariaDBSHOW DATABASESSHOW TABLES
PostgreSQL (psql)\l または \list\dt
PostgreSQL (SQL)SELECT datname FROM pg_databaseSELECT * FROM pg_tables WHERE schemaname='public'
SQL ServerSELECT name FROM sys.databasesSELECT name FROM sys.tables
OracleSELECT name FROM v$database (接続中databaseの情報。全PDB/全schemaの一覧と同一ではない)SELECT table_name FROM all_tables
SQLite.databases (CLI).tables / SELECT name FROM sqlite_master WHERE type='table'

※ Oracle の場合 1 つの「データベース」内に複数のスキーマ(ユーザー)が存在する設計のため、概念が MySQL とずれます。MySQL の DB ≒ Oracle のスキーマ。

JDBC / プログラムから

旧例の注意:JDBCのcatalog/schema対応はdriver/製品/版に依存します。全DBMSで同じ意味の一覧と扱いません。

// Java の例
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
    DatabaseMetaData meta = conn.getMetaData();
    try (ResultSet rs = meta.getCatalogs()) {       // MySQL は CATALOG = DB
        while (rs.next()) {
            System.out.println(rs.getString("TABLE_CAT"));
        }
    }
}

旧例の注意:PyMySQLの固定root/password例は転用しません。接続先/TLSと接続解放を管理し、全出力を公開しません。

# Python (PyMySQL)
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='xxx')
with conn.cursor() as cur:
    cur.execute("SHOW DATABASES")
    for (db,) in cur.fetchall():
        print(db)

権限が見えない DB を確認

旧例の注意:GRANT/FLUSHは一覧の読取ではありません。root/新規権限を定型追加せず、通常のGRANT後にFLUSHを要するという案内にも使いません。

-- 現在のユーザー
SELECT CURRENT_USER();

-- 自分が持つ権限を確認
SHOW GRANTS;

-- root で他ユーザーに権限付与
GRANT SELECT ON myapp.* TO 'reader'@'%';
FLUSH PRIVILEGES;

FAQ

Q: ある DB だけ SHOW DATABASES に出てこない
A: 接続先/フィルタ/可視権限と設定を確認します。名前が見えることと表を使えることは別で、一覧取得だけのためにroot/権限追加へ切り替えません。

Q: 接続している DB を確認したい
A: SELECT DATABASE(); で現在の DB 名が返ります。NULL なら未選択。

Q: 大文字小文字
A: Linux の MySQL はデフォルトで DB 名・テーブル名が大小区別。lower_case_table_names 設定で挙動が変わります(変更は再初期化必要)。

元の書式付きコマンド

元例の注意:元のコマンド表示です。DB名は置換箇所で、既定DB/接続先/権限を確認します。表一覧は未選択ならFROM指定を使い、USEはサーバーへの再接続とは区別します。

show databases;

元の確認順と次のページ

元の確認表を保持します。DB一覧を見ただけでは既定DBは選択されないので、SHOW TABLESの前にUSEで選ぶかFROMで指定します。

順番 やること
1 MYSQLへの接続で接続する
2 show databases; を実行する
3 対象DBを決めて use やテーブル確認へ進む

検証範囲と一次資料

新規の小規模MySQL8.4.13/MariaDB11.8.9検体の同一接続/別接続、限定権限と各製品の同梱CLIで検証した範囲です。全言語driver/GUI/接続pool/実SSH経路/各OSの導入や証明書運用・PG/Oracle/SQL Serverの旧例の実行成功を保証しません。本番のschema/認証/設定を変更していません。

子ページ

子ページはありません

同階層のページ
  1. MySQLの起動(Windows)
  2. MySQLの起動、停止、再起動(Linux)
  3. MYSQL への接続
  4. データベース一覧の表示
  5. データベースへの接続
  6. テーブル一覧を表示
  7. テーブル定義を確認
  8. ユーザーおよびパスワード一覧の確認

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