実際のシェルスクリプト
追記[2015-06-29]
コメント欄でご指摘が有りまして、11行どころか1行で実行できる方法がありました!
mysqlcheck -u hogeuser -phogepassword --all-databases --optimize
mysql_optimize.sh
#!/bin/sh
host=localhost
user_name=hogeuser
db_pass=hogepassword
databases=($(/usr/bin/mysql -h ${host} -u ${user_name} -p${db_pass} -e "SHOW DATABASES;"|\
grep -v -e Database -e information_schema -e mysql -e performance_schema))
for database in ${databases[@]};do
/usr/bin/mysql -h ${host} -u ${user_name} -p${db_pass} -e "SHOW TABLES from ${database};"|\
grep -v Tables_in_${database}|\
xargs -I {} \
/usr/bin/mysql -h ${host} -u ${user_name} -p${db_pass} -e "USE ${database};OPTIMIZE TABLE {};"
done
試した環境
- CentOS 7.1
- MySQL 5.6.25
思いついたきっかけ
OPTIMIZE TABLE
のシェルスクリプトを今まで
/usr/bin/mysql -h localhost -u hogeuser -phogepassword -e "USE hogedatabase;OPTIMIZE TABLE hogetable;"
のような1テーブル1行のシェルスクリプトを書いていました。
ですが、
テーブルが増えるごとに行を書き足す必要があるので面倒
だったので、
「自動的に現存するテーブル名を取り込んでくれてたらいいのに」
という願望を叶えるためにシェル芸を駆使して書きなおしてみました。
注意事項とか疑問点とか
- MySQLのパスワードをシェルスクリプト直に書き込むので、MySQLから
insecure
と怒られたり、ユーザーとパスワードの組み合わせやシェルスクリプトのファイルの置き場所には気をつけましょう。 - そもそも
OPTIMIZE TABLE
は、デフラグとかと同じ考え方で定期実行させるべきものでしたっけ?