MySQLのバックアップをとろう!(同じサーバー内)
今までは、postgresqlを利用していたので、
実は、mysqlのバックアップは始めて。
とりあえず、postgresにあるような
dumpがあるかどうか「mysql dump」でググって見る。
mysqldump
というコマンドがあるらしいことがわった。
「mysqldump」でググって見る。
http://dev.mysql.com/doc/refman/4.1/ja/mysqldump.html
↑発見!【4.9.7. mysqldump(テーブル構造とデータのダンプ)】
とりあえず読む。
>同じサーバ上でバックアップを行う場合には、mysqlhotcopy の方の使用を考慮してください。
と書いてある。
「mysqlhotcopy」
http://dev.mysql.com/doc/refman/4.1/ja/mysqlhotcopy.html
[root@internal ~]# mysqlhotcopy --help;
/usr/bin/mysqlhotcopy Ver 1.22
Usage: /usr/bin/mysqlhotcopy db_name[./table_regex/] [new_db_name | directory]
↑確かめてみたら、利用できる・・・。
今回は、同じサーバー内にコピーするよていだから、
コチラを利用しよう。
>mysqlhotcopy は、LOCK TABLES、FLUSH TABLES、および cp(または scp)を使用して、すばやくデータベースのバックアップを行う Perl スクリプトです。
ほう。
>これは、データベースや単一のテーブルのバックアップを行う最速の方法ですが、データベースディレクトリのある同一マシンだけでしか実行できません。
なるほどねー。
>mysqlhotcopy は、Unix のみ、および MyISAM テーブルと ISAM テーブルでのみ使用できます。
MyISAMとISAMのみ!!!!・・・だめぢゃん!!! innoDB利用してるし!!
--------------------------------------------------------------------------
mysql> show table status;
+-------------------------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+-----------------------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+-------------------------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+-----------------------+
| auth_responses | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 0 | 1 | 2007-05-02 21:03:06 | NULL | NULL | utf8_general_ci | NULL | NULL | InnoDB free: 11264 kB |
・
・
・
--------------------------------------------------------------------------
と言うことで、「mysqldump」でやる。
>テーブルを指定しなかったり、--databases オプションまたは --all-databases オプションを使用すると、データベース全体がダンプされます。
と書いてある。
なるほど。
>使用しているバージョンの mysqldump がサポートするオプションの一覧を照会するには、mysqldump --help を実行します。
なるほど。やってみよう。
---------------------------------------
[root@internal ~]# mysqldump --help
mysqldump Ver 10.10 Distrib 5.0.22, for redhat-linux-gnu (i686)
By Igor Romanenko, Monty, Jani & Sinisa
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Dumping definition and data mysql database or table
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
・
・
・
----------------------------------------
めちゃめちゃいっぱいでた・・・。
>注意: mysqldump を --quick または --opt なしで実行すると、mysqldump は結果をダンプする前に、結果セット全体をメモリにロードします。これは、大きなデータベースをダンプする際、問題になる可能性があります。
なるほど。ぢゃあ --quick か --opt を付けたほうがいいんだな。
>注意: mysqldump プログラムの新しいコピーを使用している場合で、非常に古い MySQL サーバに読み込むダンプを行うときには、--opt オプションまたは -e オプションは使用しないでください。
なるほど、まぁ、非常に古いMySQLを使う予定はないので今は大丈夫。
次に、mysqldumpのオプションを見て、必要なものをピックアップしよう。
> mysqldump は、以下のオプションをサポートします。
>--add-locks
>各テーブルダンプの前に LOCK TABLES を追加し、後に UNLOCK TABLE を追加する(MySQL への挿入を速くするため)。
なるほど、早くなるなら付けた方がよさそうだな。
>--add-drop-table
>各作成ステートメントの前に drop table を追加する。
これもつけよう。バックアップを戻すときは、同じ状態でほしいから。
> -A, --all-databases
>すべてのデータベースをダンプする。これは、すべてのデータベースを選択した状態で --databases を実行するのと同じである
なるほど。
>-P, --port=...
>TCP/IP 接続に使用するポート番号。
>--protocol=(TCP | SOCKET | PIPE | MEMORY)
>使用する接続プロトコルを指定する。MySQL 4.1 で導入。
あー、これを使って、外のサーバーに保存すればいいのか??
>-pyour_pass, --password[=your_pass]
>サーバ接続時に使用するパスワード。'=your_pass' 部分を指定しなければ、mysqldump によってパスワードのプロンプトが表示される。
なるほどー。
>一般的に、mysqldump はデータベース全体のバックアップに使用されます。
なるほど。
>http://dev.mysql.com/doc/refman/4.1/ja/backup.html
↑【4.5.1. データベースのバックアップ】こちらも参考に。
>shell> mysqldump --opt database > backup-file.sql
>これを、以下のコマンドで MySQL に戻すことができます。
>shell> mysql database < backup-file.sql
なるほど。
ここまでの知識で、同じサーバー内にDBをバックアップするなら。
shell> mysqldump --opt --add-drop-table --add-locks database_name > backup-file.sql
↑こんな感じか。
ファイルを用意してやってみる。
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect
ぬおおおおお。error。パスワードが必要らしい・・。
shell> mysqldump --opt --add-drop-table --add-locks database_name > backup-file.sql -p
Enter password:
ファイルを見たら、ファイル容量増えてる!成功!!
・・・でも、これをcronで回して、定期的にやろうとしているのだけど、
パスワードを設定しないと出来ないのは、こまらないか・・・?
あ、わかった。
--password[=your_pass]
というオプションをつければいいんだ。
mysqldump --opt --add-drop-table --add-locks --password=hoge database_name > backup-file.sql
でやってみる。
成功!!!
これで、shell書いてcronを組めばいいんだ!
うーん。出来た。
次回は cronでバックアップを定期的に実行できるようにします。