mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

MySQL - InnoDB 全テーブルのレコード数取得!

[ サーバ構築 ] [ MySQL, bash, シェル ]

こんばんは。

よくある “information schema” からレコード数を取得する方法は、ストレージエンジン MyISAM では正確にレコード数が取得できるが、ストレージエンジン InnoDB では概算値となり正確に取得できない。

以下、コンソールから概算のレコード数を取得する方法と、正確なレコード数を取得するシェルスクリプトの紹介です。

0. 前提条件

  • MySQL 5.6.16 サーバでの作業を想定。(MariaDB でも同様だと思われる)

1. 手順1(概算値)

コンソール上で以下のように実行する。
もちろん、MySQL サーバにログインして SELECT ... の部分を実行してもよい。
また、リモートの MySQL サーバに対して実行したければ、オプション -h<IPアドレス> を追加すればよい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ mysql -uユーザ名 -pパスワード -e "SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'DB名';"
+------------------------------------------+------------+
| table_name                               | table_rows |
+------------------------------------------+------------+
| dat_Chois                                |        261 |
| dat_DoshaDetail1s                        |      32375 |
| dat_DoshaDetail2s                        |       1974 |
| dat_Doshas                               |        961 |
| dat_Gaikyos                              |      91833 |
            :
    ===< 途中省略 >===
            :
| mst_WeatherForecastRelations             |        171 |
| mst_WeatherForecastTelops                |        122 |
| mst_WeatherForecastWeeklyRelations       |         91 |
| mst_WeatherWarnings                      |         31 |
| mst_WmoObservingStations                 |        158 |
+------------------------------------------+------------+

2. 手順2(正確に取得するシェルスクリプト)

Bash スクリプトを以下のように作成する。
テーブル別に COUNT を取得する SQL を生成し、それらを UNION ALL して実行する方法。
また、リモートの MySQL サーバに対して実行したければ、最後の SQL 文実行部分でオプション -h<IPアドレス> を追加すればよい。

mysql_row_counts.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# DB 情報
USER=root
PW=xxxxxxxx
DB=xxxx

# テーブル一覧取得
TBLS=(`mysql -u${USER} -p${PW} -D${DB} -sN -e "SHOW TABLES"`)

# SQL 文生成
SQL=""
for TBL in ${TBLS[@]}; do
    SQL="${SQL} SELECT '${TBL}' AS table_name, COUNT(*) AS table_rows FROM ${TBL} UNION ALL"
done
# (最後の余分な UNION ALL を除去)
SQL="$(echo $SQL | sed -e 's/ UNION ALL$//')"

# SQL 文実行
mysql -u${USER} -p${PW} -D${DB} -e "${SQL}"

そして、実行する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ./mysql_row_counts.sh
+------------------------------------------+------------+
| table_name                               | table_rows |
+------------------------------------------+------------+
| dat_Chois                                |        328 |
| dat_DoshaDetail1s                        |      35099 |
| dat_DoshaDetail2s                        |       1990 |
| dat_Doshas                               |        995 |
| dat_Gaikyos                              |      95469 |
            :
    ===< 途中省略 >===
            :
| mst_WeatherForecastRelations             |        171 |
| mst_WeatherForecastTelops                |        122 |
| mst_WeatherForecastWeeklyRelations       |         91 |
| mst_WeatherWarnings                      |         31 |
| mst_WmoObservingStations                 |        158 |
+------------------------------------------+------------+

テーブルによっては、information_schema で取得する値と異なることが分かる。

3. 参考サイト


以上。

Comments