MySQLをリカバリしたり障害から復元したりしたとき、テーブルのインデックスが所々死んでいたりしてOPTIMIZE TABLEとかしたいときに使う小物。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#/bin/bash if [ $# -ne 2 ]; then echo "mybulktblcmd 'MYSQL-OPTS' 'SQL'" echo "'SQL table' > mysql MYSQL-OPTS in all-tables(without : information_schema,mysql,perfomance_schema)" else PA=() TABLES=(`echo "SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA NOT IN ('information_schema','mysql','performance_schema')" | mysql $1`) for (( i = 2; i < ${#TABLES[@]}; ++i)); do N=`ps -p ${PA[@]}|wc -l` while [ $N -gt 10 ] do echo "Too many worker running[$N]" sleep 1s N=`ps -p ${PA[@]}|wc -l` done echo "${TABLES[$i]}.${TABLES[$i+1]} start" echo "$2 `${TABLES[$i]}`.`${TABLES[$i+1]}`" | mysql $1 PA+=($!) ((i++)) done fi |
第一引数を渡したmysqlからinformation_schemaのテーブル一覧を引っ張り出して、ループで”第二引数+DB名.テーブル名”のコマンドを、第一引数を渡したmysqlに投げ込むだけ。
mybulktblcmd ‘-hlocalhost -uroot -ppassowrd’ ‘OPTIMIZE TABLE ‘
みたいに実行すれば、mysql,information_schema,performance_schema以外のDB上にある全てのテーブルにOPTIMIZE TABLEを実行できる。
(612)