[Server & Network General] MySQL: コマンドをプロンプトなしでセキュアに利用するには

MySQLバックアップを Cron を利用して自動化したく、mysqldump で定期バックアップする方法を調べてみました。

Contents

コマンドラインで –password=your_pass をつかってはいけない

コマンドラインやスクリプト内から、こんな形式でmysqlをつかってはいけない。

$ mysql -u <ユーザ名> -p<パスワード> <db名>

例えば共用サーバなどでpsコマンドを使うと、他のユーザにパスワードが見えてしまう可能性がある。

$ ps ax | grep mysql

使用しているLinuxカーネルがプロセスの隠蔽をサポートしていない場合、コマンドラインでパスワードを指定すると、他のプロセスから丸見えになってしまう。

cronなどで利用したい場合、MySQLのオプションファイルを利用する。

オプションファイルの作成

.my.cnf の作成

.my.cnf ファイルを作成し、パーミッションを自分以外がアクセスできないように 600 に設定する。

$ touch ~/.my.cnf
$ chmod 600 ~/.my.cnf

–defaults-group-suffix=str

カスタムの接尾辞を付けた設定をつかってみることにする。
.my.cnf 内にオプショングループと設定を書くと、実行時に解読される。

実行時に str を指定すると、そのオプショングループの設定が利用される。

~/.my.cnf
[client_host1]
user=myuser
password="mypass"
database=dbname
host=server.location.com

このような形式で利用できる。

$ mysql --defaults-group-suffix=_host1

mysqldump

[mysqldump] というオプショングループに設定する。

~/.my.cnf
[mysqldump]
user=myuser
password=mypass

例えば全てのデータベースをdumpする。

$ mysqldump --opt --all-databases | bzip2 -c > alldb.bak.sql.bz2

–opt でデータベースへの書き込みをロックする。

mysqldumpの中には他オプションをグループ化した略記法となっているものがあります。–optや–compactはこれに分類されるものです。例えば、–optを使用することは–add-drop-table –add-locks –create-options –disable-keys –extended-insert –lock-tables –quick –set-charsetを指定したのと同じことです。MySQL 5.1以降、–optが表すオプションは全てデフォルトで有効化されています。これは、–optがデフォルトで有効なためです。

suffix は使えなかったのですが、 –defaults-file=~/.my_www.cnf のような形で、設定ファイルを切り替えることができそうな気もするので、いつか試す。

補遺

InnoDB or MyISAM

もしあなたがサーバのバックアップをしていて、かつテーブルがすべてMyISAMテーブルの場合、代わりにmysqlhotcopyの使用をお勧めします。

mysql > show engines\G
mysql > show table status\G

MySQLプロンプトをカスタマイズして、接続ユーザー名とホスト、現在使用しているデータベースを表示させる

~/.my.cnf
[mysql]
prompt=mysql (\u@\h)::\d >\_

login -> use db_name 後、こんなプロンプト表示になる。

mysql (user_name@localhost)::db_name >

設定の確認 my_print_defaults

my_print_defaults コマンドを使うと、上記の設定を確認することができる。

$ my_print_defaults _host1 mysql
--default-character-set=utf8
--prompt=mysql (\u@\h)::\d >\_