2016-04-25 19 views
0

私は単純なbashスクリプトを持っています。私は、データベースの各テーブルの行数の正確なカウントを取得したいと思います。Bashのmysqlのループスルー結果

#!/bin/bash 

TABLES_OLD=$(mysql -u user -ppassword MySchema --batch --skip-column-names -e"SHOW TABLES FROM MySchema") 

for table in "${TABLES_OLD[@]}" 
do 
    QUERY="SELECT COUNT(*) FROM ${table}" 
    echo "${QUERY}" 
done 

スクリプトプリント:

SELECT COUNT(*) FROM Table 1 
Table2 
Table3 
Table4 
etc... 

明らかにこれは私が欲しいものではありません、と私も何が起こっていることは可能であるかを理解していません。私は間違って何をしていますか?

+0

は、MySQL -uユーザー-ppasswordはMySchema 'の出力を追加 - batch --skip-column-names -e "MySchemaからテーブルを表示する" "。 – Cyrus

+0

'TABLES_OLD'は配列ではありません。それは文字列です。 'tables_old =($(mysql ....))'は、単語の配列を分割します(globメタキャラクターなども同様です)。ストリームから行単位のデータをループする正しい方法は、[Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)で説明されています。 –

答えて

-1

コードが

#!/bin/bash 

TABLES_OLD=$(mysql -u user -ppassword MySchema --batch --skip-column-names -e"SHOW TABLES FROM MySchema") 

for table in "${TABLES_OLD[@]}" 
do 
    QUERY="SELECT COUNT(*) FROM ${table}" 
    eval "${QUERY}" 
done 
+0

いいえ、これは役に立ちません。これはすべての問題ではなく、まったく良いアイデアではありません。 –

0

なりますeval

echoを置き換えこれはそれを行う必要があります。

#/bin/bash 
mysql -u user-ppassword -e "SELECT table_name, table_rows 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_SCHEMA = 'your_data_base_name';" 
+0

これは私に多くのテーブルの正確な数を与えるようには思われません。それは本当に近いですが。 – LeviX

+0

あなたは見てみたいかもしれません[こちら](http://dba.stackexchange.com/questions/65216/need-help-to-understand-how-information-schema-tables-get-updated) – sjsam

+0

@LeviX:あなたも見てみたいです[ここ](http://stackoverflow.com/a/2221898/1620779) – sjsam

1
Try this, put the tables into an array then loop thru the results 
db_host='host' 
db_user='user' 
db_pass='password' 
db='your_db' 

read -ra var_id <<< $(mysql -h $db_host -u $db_user -p$db_pass $db -sse "show tables from $db") 
for i in "${var_id[@]}"; 
    do 
results=$(mysql -h $db_host -u $db_user -p$db_pass $db -sse "select count(*)from $i") 
echo "$i $results" 

done