Database JUNKY

MySQL,MariaDBを中心としたブログです

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]