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

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

[markdown]

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

> * [MySQL :: MySQL 5.1 リファレンスマニュアル :: 4.8.6 パスワードのセキュリティ](http://dev.mysql.com/doc/refman/5.1/ja/password-security.html)
> * [mysql – Mysqldump launched by cron and password security – Stack Overflow](http://stackoverflow.com/questions/6861355/mysqldump-launched-by-cron-and-password-security)

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

“`prettyprinted
$ mysql -u <ユーザ名> -p<パスワード>
“`

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

“`prettyprinted
$ ps ax | grep mysql
“`

> * [MySQLのコマンドライン機能を活用する – builder by ZDNet Japan](http://builder.japan.zdnet.com/db-sql/20372038/)
>
> 使用しているLinuxカーネルがプロセスの隠蔽をサポートしていない場合、コマンドラインでパスワードを指定すると、他のプロセスから丸見えになってしまう。

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

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

### .my.cnf の作成

> * [MySQL :: MySQL 5.1 リファレンスマニュアル :: 3.3.2 オプションファイルの使用](http://dev.mysql.com/doc/refman/5.1/ja/option-files.html)

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

“`prettyprinted
$ touch ~/.my.cnf
$ chmod 600 ~/.my.cnf
“`

### –defaults-group-suffix=str

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

> * [mysql – Is it possible to have passwords configured per database or per host in .my.cnf – Database Administrators Stack Exchange](http://dba.stackexchange.com/questions/3889/is-it-possible-to-have-passwords-configured-per-database-or-per-host-in-my-cnf)

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

“`:~/.my.cnf
[client_host1]
user=myuser
password=”mypass”
database=dbname
host=server.location.com
“`

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

“`prettyprinted
$ mysql –defaults-group-suffix=_host1
“`

### mysqldump

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

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

> * [mysql – MYSQLDUMP without the password prompt – Stack Overflow](http://stackoverflow.com/questions/9293042/mysqldump-without-the-password-prompt)

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

“`prettyprinted
$ 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がデフォルトで有効なためです。
>
> * [MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム](http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html)

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

## 補遺

### InnoDB or MyISAM

> もしあなたがサーバのバックアップをしていて、かつテーブルがすべてMyISAMテーブルの場合、代わりにmysqlhotcopyの使用をお勧めします。
>
> * [MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム](http://dev.mysql.com/doc/refman/5.1/ja/mysqldump.html)

“`prettyprinted
mysql > show engines\G
mysql > show table status\G
“`

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

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

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

“`prettyprinted
mysql (user_name@localhost)::db_name >
“`

> * [MySQLのコマンドライン機能を活用する – builder by ZDNet Japan](http://builder.japan.zdnet.com/db-sql/20372038/)

### 設定の確認 my_print_defaults

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

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

[/markdown]