22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

たった12行で全テーブルにOPTIMIZE TABLEできるシェルスクリプト

Last updated at Posted at 2015-06-15

実際のシェルスクリプト

追記[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は、デフラグとかと同じ考え方で定期実行させるべきものでしたっけ?
22
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?