2012年7月31日火曜日

結構便利なmysql --skip-column-nameとbash read

mysqlの--skip-column-nameオプション。
mysqlの出力結果から先頭の1行(column nameとか表示される行)を剥ぎ取ってくれます。
--executeと一緒に使うのが便利。
(CUIでログインしても、column nameを剥ぎ取ってくれるけど役に立った記憶は無い。。)



$ mysql -e "SHOW DATABASES"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+



$ mysql --skip-column-name -e "SHOW DATABASES"
+--------------------+
| information_schema |
|              mysql |
| performance_schema |
|               test |
+--------------------+


ついでに、この枠線はどういう仕組みかよく判らないけどパイプに渡すと消える。


$ mysql --skip-column-name -e "SHOW DATABASES" | cat
information_schema
mysql
performance_schema
test

ので、これをread(bashのビルトインコマンド)に渡すと美味しい。
while read <変数名> [<変数2> ..]の形で渡すと、
パイプから1行受け取るごとに\sをセパレータにして指定した引数に渡してくれる。

たとえばこんな。
world_myisamデータベースの中の全テーブルをCSVファイルにエクスポートして、
それをworldデータベースにインポートさせる。
(テーブルスキーマは移植済みって前提だけれども)


mysql --skip-column-name -e "SHOW TABLES FROM world_myisam" | while read tbl ; do
mysql -e "SELECT * FROM world_myisam.$tbl INTO OUTFILE '/tmp/$tbl.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\'"
mysql -e "LOAD DATA INFILE '/tmp/$tbl.csv' INTO TABLE world.$tbl FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\'"
rm /tmp/$tbl.csv
done



INSERTの使えないInfobrightのGPL版でworldデータベースを食わせたときのやつ。


1テーブルずつmysqldumpを取って圧縮するとか(テーブル間の整合性取れないけど)

$ mysql --skip-column-name -e "SHOW DATABASES" | egrep -v "information_schema|mysql|performance_schema" | while read db ; do
> mysql --skip-column-name -e "SHOW TABLES FROM $db" | while read tbl ; do
> mysqldump $db $tbl | gzip -1 > /tmp/$db.$tbl.sql.gz
> done
> done


他にもテーブル片っ端からPRIMARY KEYをDROPするとか(しない)
片っ端からTRUNCATEするとか(しない)
テーブルをさらうようなやり方なら、使い途は色々。

0 件のコメント :

コメントを投稿