shellと組み合わせて使うmysqlコマンドとかのメモ
色々と組み合わせて使えば、mysqlの運用が楽になるかもしれません。使えそうなものをピックアップしてみました。運用の側面からも、監視の側面からも、shellは覚えておいたほうが良いと思います。まあ、みさなまはもっとかっこいいことをやっているかもしれませんが、自分の中で、あぁこれ便利だなあと思って作ったshellを一部抜粋して掲載しております。もっと効率の良い方法がありましたら、教えてください。SQL的なポイントとしては、concat(文字列結合) 列関数と、information_schemaを利用することで、一括系のSQLが簡単に作成できるところが利点だと思っています。
mysqlレプリケーションをする際に、マスタのlog-bin情報と、ポジション情報を、変数として取り込む [bash]
!/bin/bash
DBNAME=mydb DBUSERID=mydbuser DBPASSWD=mydbpasswd
WLOGBIN=$(mysql ${DBNAME} -u ${DBUSERID} -p${DBPASSWD} -e 'show master status\G;' | grep -i File | echo awk -F: '{print $2}';
)
WPOS=$(mysql ${DBNAME} -u ${DBUSERID} -p${DBPASSWD} -e 'show master status\G;' | grep -i File | echo awk -F: '{print $2}';
)
echo WLOGBIN echo WPOS
exit 0
[/bash]
データベースに登録済みのすべてのテーブルレコード件数をカウントし、それをCSV形式のファイルに出力する、厳密にいうと、/tmp/all_table_count.sqlにて、テーブルをカウントするSQLを生成し、生成されたSQL文を再度読み込ませて、CSV形式のファイルにアウトプットする [bash]
!/bin/bash
DBNAME=mydb HOSTNAME=yourhost USERID=myuser PASSWD=yourpasseword
mysql -N ${DBNAME}-h ${HOSTNAME} -u ${USERID} -p${PASSWD} -e "select concat('SELECT concat(''',TABLE_SCHEMA,'.',TABLE_NAME,','',COUNT(*)) FROM ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema') ORDER BY TABLE_SCHEMA,TABLE_NAME;" > /tmp/all_table_count.sql
mysql -N -h ${HOSTNAME} -u ${USERID} -p${_PASSWD} < /tmp/all_table_count.sql > /tmp/all_table_count.csv
exit 0 [/bash]
テーブルの最適化を行うテーブルをピックアップし、最適化DDLを自動生成する(ALTER,OPTIMIZE)
[bash]
!/bin/bash
mysql -N -h ${HOSTNAME} -u ${USERID} -p${_PASSWD} -e "selsect concat('ALTER TABLE TABLE_SCHEMA,'.',TABLE_NAME,' engine ',ENGINE,';') from information_schema.TABLES WHERE ENGINE = 'Innodb';" > /tmp/alter_all_table.sql
こちらはテーブルの読み込みは許可されますが、統計情報は書き込んでくれません
mysql -N -h ${HOSTNAME} -u ${USERID} -p${_PASSWD} < /tmp/alter_all_table.sql
mysql -N -h ${HOSTNAME} -u ${USERID} -p${_PASSWD} -e "selsect concat('OPTIMIZE TABLE TABLE_SCHEMA,'.',TABLE_NAME,' engine ',ENGINE,';') from information_schema.TABLES WHERE ENGINE = 'Innodb';" > /tmp/optimize_all_table.sql
こちらは、統計情報を更新しますが、テーブルはロックされます。
mysql -N -h ${HOSTNAME} -u ${USERID} -p${_PASSWD} < /tmp/optimize_all_table.sql
exit 0
[/bash]