シェルスクリプトでMySQLのSQLを動かそうとしたら詰まりに詰まったので備忘録として
やりたいこと
・ rootユーザでシェルスクリプトからmysqlのSQLを実行する
・ 対話処理は悲しいのでやりたくない
環境
・ホストOS: Windows11
・ゲストOS: Ubuntu20.04
・MySQL 8.0.26
・bash
ソースコード
# !/bin/bash
service mysql start
mysql -u root --password='password' -e "drop database if exists dbname;"
mysql -u root --password='password' -e "create database dbname;"
mysql -u root --password='password' dbname < file.sql
このシェルスクリプトを実行すると mysql: [Warning] Using a password on the command line interface can be insecure.
という警告文が表示されて処理が失敗しました。
どうやらスクリプトやコマンドにパスワードを直書きすると怒られるようです。
解決方法
パスワードを外部ファイルに切り出してそれを --defaults-extra-file
オプションで読み込むと解消できました。
/etc/mysql/my.cnf
[client]
user = root
password = password
# 今回はスクリプトを実行するホストとDBのホストが同一なのでhostnameは省略
パスワードが書かれたファイルなので権限は最低限にしておきます。
chmod 600 /etc/mysql/my.cnf
スクリプトを以下のように書き換えて再度実行します。
create_database.sh
service mysql start
mysql --defaults-extra-file=/etc/mysql/my.cnf -u root -e "drop database if exists dbname;"
mysql --defaults-extra-file=/etc/mysql/my.cnf -u root -e "create database dbname;"
mysql --defaults-extra-file=/etc/mysql/my.cnf -u root dbname < file.sql
警告が出ずに正常にデータベースが作成されました。
まとめ
この方法だと自動でデータベースを操作できるので定期的なバックアップやデータベースのメンテナンスも実現できそうですね。