MySQLのテーブル一覧を出してデータベースを棚卸しする方法|SHOW TABLESでサイズ・行数・ストレージエンジンを確認する

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsデーターベース管理 > MySQLのテーブル一覧を出してデータベースを棚卸しする方法|SHOW TABLESでサイズ・行数・ストレージエンジンを確認する
「MySQLに接続したはいいが、このDBにどんなテーブルが入っているのか分からない。」
「運用を引き継いだデータベースの構成を把握するところから始めたい。」

そういった場面で使うのが SHOW TABLES です。テーブル名の一覧を取得するだけでなく、SHOW TABLE STATUS を組み合わせれば、各テーブルのデータサイズ・推定行数・ストレージエンジンをまとめて確認できます。

この記事では、RHEL 9.4(MySQL 8.0.36)で動作確認した手順をベースに、日常的なDB棚卸しの流れを解説します。

この記事のポイント

・SHOW TABLES でデータベース内のテーブル名を一覧表示できる
・SHOW TABLE STATUS でサイズ・行数・ストレージエンジンを一括確認できる
・information_schema.TABLES のSQLで複数DBを横断・ソートして棚卸しできる
・mysql -e オプションでシェルスクリプトから非対話的に実行できる


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

MySQLのテーブル一覧が必要になる場面

データベースの運用でテーブルの棚卸しが必要になる場面は多岐にわたります。

・運用を引き継いだDBの構成を初めて把握したい
・テーブルが肥大化していないかを定期確認したい
・本番とステージング環境でテーブル数が一致しているか突き合わせたい
・ストレージエンジンがMyISAMのまま残っているテーブルがないか確認したい
・バックアップ対象のテーブル一覧をスクリプトで取得したい

こうした場面で中心になるのが SHOW TABLESSHOW TABLE STATUS の2コマンドです。順番に使い方を確認していきましょう。

SHOW TABLESでテーブル一覧を表示する

1. mysqlクライアントに接続してデータベースを選択する

まずmysqlクライアントでMySQLサーバーに接続します。

mysql -u root -p

パスワードを入力してmysql>プロンプトが出たら、対象データベースに切り替えます。

mysql> USE wordpress; Database changed

接続時にDB名を指定する方法もあり、引き継ぎ直後などに手早く確認したい場合に便利です。

mysql -u root -p wordpress

2. SHOW TABLESでテーブル名の一覧を取得する

データベースを選択した状態で SHOW TABLES; を実行します。

mysql> SHOW TABLES; +-----------------------+ | Tables_in_wordpress | +-----------------------+ | wp_commentmeta | | wp_comments | | wp_links | | wp_options | | wp_postmeta | | wp_posts | | wp_term_relationships | | wp_term_taxonomy | | wp_termmeta | | wp_terms | | wp_usermeta | | wp_users | +-----------------------+ 12 rows in set (0.00 sec)

末尾の「12 rows in set」でテーブルの総数が即座に分かります。USE で選択中のDBではなく、別DBを指定して見たい場合は SHOW TABLES FROM DB名; と書けます。

3. SHOW TABLES LIKEでテーブル名を絞り込む

テーブル数が数十~数百になるDBでは、LIKE 句でパターン絞り込みが便利です。SQLの %(任意の文字列)が使えます。

mysql> SHOW TABLES LIKE 'wp_post%'; +----------------------------------+ | Tables_in_wordpress (wp_post%) | +----------------------------------+ | wp_postmeta | | wp_posts | +----------------------------------+ 2 rows in set (0.00 sec)

4. SHOW FULL TABLESでビューとテーブルを区別する

FULL を付けると、ビュー(VIEW)と通常テーブル(BASE TABLE)を区別して表示できます。ビューが混在しているDBの棚卸しで役立ちます。

mysql> SHOW FULL TABLES FROM wordpress; +-----------------------+------------+ | Tables_in_wordpress | Table_type | +-----------------------+------------+ | wp_comments | BASE TABLE | | wp_posts | BASE TABLE | | wp_users | BASE TABLE | | v_recent_posts | VIEW | +-----------------------+------------+ 4 rows in set (0.00 sec)

SHOW TABLE STATUSでサイズ・行数・ストレージエンジンを確認する

テーブル名の一覧だけでなく、各テーブルのデータ量や行数も一緒に把握したい場合は SHOW TABLE STATUS を使います。

1. SHOW TABLE STATUSの基本出力を読む

mysql> SHOW TABLE STATUS FROM wordpress\G *************************** 1. row *************************** Name: wp_posts Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 1482 Avg_row_length: 338 Data_length: 499712 Max_data_length: 0 Index_length: 163840 Data_free: 0 Auto_increment: 3085 Create_time: 2024-03-15 09:23:11 Update_time: 2024-09-01 08:44:19 Check_time: NULL Collation: utf8mb4_unicode_ci Checksum: NULL Create_options: Comment: 1 row in set (0.01 sec)

主要フィールドの読み方は次のとおりです。

Engine:ストレージエンジン(InnoDB / MyISAM 等)
Rows:おおよその行数(InnoDBでは統計情報に基づく推定値)
Data_length:データ部分のバイト数
Index_length:インデックス部分のバイト数
Data_free:断片化(フラグメント)の未使用領域。大きい場合はOPTIMIZE TABLEの検討を
Update_time:最後に更新された日時(InnoDBでは参考値)

2. データサイズ順に並べて大きいテーブルを把握する

\G では全テーブルが縦表示になって見づらいため、実際の棚卸しでは information_schema.TABLES をSQLで絞り込む方が実用的です。

mysql> SELECT table_name, engine, table_rows AS approx_rows, ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb, ROUND(data_free / 1024 / 1024, 2) AS free_mb FROM information_schema.TABLES WHERE table_schema = 'wordpress' ORDER BY total_mb DESC; +-----------------------+--------+-------------+----------+---------+ | table_name | engine | approx_rows | total_mb | free_mb | +-----------------------+--------+-------------+----------+---------+ | wp_posts | InnoDB | 1482 | 0.63 | 0.00 | | wp_options | InnoDB | 523 | 0.59 | 0.00 | | wp_postmeta | InnoDB | 5817 | 0.55 | 0.00 | | wp_comments | InnoDB | 143 | 0.30 | 0.00 | | wp_commentmeta | InnoDB | 214 | 0.09 | 0.00 | | wp_usermeta | InnoDB | 82 | 0.08 | 0.00 | +-----------------------+--------+-------------+----------+---------+ 12 rows in set (0.00 sec)

total_mb の大きいテーブルが肥大化の候補です。free_mb が大きい場合は断片化が進んでいるため、次のコマンドで整理できます。

mysql> OPTIMIZE TABLE wp_postmeta;

3. ストレージエンジンがMyISAMのテーブルを洗い出す

MySQL 5.5以降のデフォルトエンジンはInnoDBですが、古いDBを引き継いだ場合にMyISAMが残っていることがあります。MyISAMはクラッシュリカバリが弱く、レプリケーションでも問題が起きやすいため、先に洗い出しておくことが重要です。

mysql> SELECT table_name, engine FROM information_schema.TABLES WHERE table_schema = 'wordpress' AND engine = 'MyISAM'; Empty set (0.00 sec)

Empty set ならMyISAMなしで安心です。行が返った場合は以下でInnoDBへ変換します。

# MyISAMをInnoDBへ変換(テーブルサイズによっては時間がかかるため、本番は低負荷時に実行) ALTER TABLE テーブル名 ENGINE=InnoDB;

MySQLのテーブル棚卸しはDBを正しく管理する第一歩です。こうした実務的なDB管理も含め、Linuxサーバー運用の「型」を体系的に身につけたい方には、現役サーバー管理者が直接指導する2日間のハンズオンセミナーが最短ルートです。

コマンドラインから非対話的にテーブル一覧を取得する

cronやシェルスクリプトで定期的にテーブル数を確認したい場合は、mysql -e オプションで非対話的に実行できます。

# 基本形(パスワードをコマンド引数に渡すとhistoryに残るため注意) mysql -u root -p'パスワード' wordpress -e "SHOW TABLES;"

スクリプト内でのベストプラクティスは、~/.my.cnf にパスワードを記述して露出を避けることです。

# ~/.my.cnf を作成(所有者のみ読み取り可能にする) cat > ~/.my.cnf << 'EOF' [client] user=root password=秘密のパスワード EOF chmod 600 ~/.my.cnf

~/.my.cnf を設置しておけば、パスワード指定なしで実行できます。

#!/bin/bash # テーブル数を毎日記録するcron用スクリプトの例 DB_NAME="wordpress" TABLE_COUNT=$(mysql "$DB_NAME" -e "SHOW TABLES;" | grep -c .) echo "$(date '+%Y-%m-%d'): ${DB_NAME} テーブル数=${TABLE_COUNT}" >> /var/log/mysql-table-count.log

トラブルシュート

「ERROR 1049: Unknown database」が出る

指定したDB名が存在しないときに出るエラーです。

mysql> USE nonexist; ERROR 1049 (42000): Unknown database 'nonexist'

SHOW DATABASES; で実在するDB名を確認してから再実行してください。

mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec)

「ERROR 1044: Access denied」でテーブルが見えない

接続ユーザーが対象DBへのアクセス権を持っていない場合に出ます。

mysql> SHOW TABLES; ERROR 1044 (42000): Access denied for user 'app_user'@'localhost' to database 'mysql'

rootや管理者ユーザーで接続し直すか、必要に応じてSELECT権限を付与します。

# app_user に wordpress DBのSELECT権限を付与する例 GRANT SELECT ON wordpress.* TO 'app_user'@'localhost'; FLUSH PRIVILEGES;

information_schemaのtable_rowsが実際の行数と合わない

InnoDBでは information_schema.TABLESTABLE_ROWS は統計情報に基づく推定値です。正確な行数が必要な場合は SELECT COUNT(*) FROM テーブル名; を使ってください。大量データのテーブルでは時間がかかるので注意が必要です。

本記事のまとめ

やりたいこと コマンド
テーブル一覧を表示する SHOW TABLES;
テーブル名をパターン絞り込みする SHOW TABLES LIKE 'パターン%';
ビューとテーブルを区別して一覧する SHOW FULL TABLES FROM DB名;
サイズ・行数・エンジンを確認する SHOW TABLE STATUS FROM DB名\G
データサイズ順に並べて確認する SELECT table_name, ROUND((data_length+index_length)/1024/1024,2) AS total_mb FROM information_schema.TABLES WHERE table_schema='DB名' ORDER BY total_mb DESC;
MyISAMテーブルを洗い出す SELECT table_name FROM information_schema.TABLES WHERE table_schema='DB名' AND engine='MyISAM';
非対話的にテーブル一覧を取得する mysql DB名 -e "SHOW TABLES;"
MySQLのテーブル棚卸しは、DBの現状を正確に把握するための基本作業です。SHOW TABLES で一覧を取得したら、SHOW TABLE STATUSinformation_schema を組み合わせてサイズや行数の確認まで一気に進めると、問題のあるテーブルを素早く特定できます。

テーブルの棚卸しを定期的にシェルスクリプト化しておくと、データ量の変化を時系列で追えるようになり、容量アラートの設定や肥大化対策のタイミングを判断しやすくなります。

MySQLのテーブル棚卸しができたら、次はLinuxサーバー全体の運用スキルを体系的に固めませんか?

SHOW TABLESやSHOW TABLE STATUSを使ったDB管理も含め、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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

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

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

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

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

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

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

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

この記事を書いた人

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

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

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