2012年2月1日水曜日

MySQL バックアップスクリプト

MySQL は世界で最も使われている RDBMS の一つですが、問題となるのが定番のバックアップ方法がないということです。 mysqldump を使うと大まかにはバックアップが取れるのですが、InnoDB と MyISAM が混ざっていたりするとそれぞれトランザクションが使えたり使えなかったり、色々とややこしいです。

そこで、データベースごとに --single-transaction を使うか、 --lock-tables を使うか切り替えて、複数のデータベースを一気にダンプする PowerShell スクリプトを書きました。



シェルから実行すると、実行したディレクトリに backup-DBNAME.sql というファイルがデータベースごとに生成されます。

MyISAM の場合はテーブルロック、InnoDB の場合はトランザクションを作って読み取ります。ただし、もし MySQL の isolation 設定が READ-COMMITTED になっている場合は完全に一貫性のある状態ではなく、トランザクション単位で違う状態のデータが入る可能性があります。READ-COMMITTED で運用しているということは、それでも問題ないはずですが、一応注意が必要です。

MediaWiki はひとつのデータベースの中で、ほとんど InnoDB なのですがインデックスだけ MyISAM なので、テーブルロックで読み取ることになっています。

ちなみに、私が今使ってる運用では、データベースサイズはそんなに大きくありませんので、毎日このスクリプトでダンプしたものを zip で圧縮して、1週間分保存しています。増分バックアップしたい場合は、バイナリログを使うなどの方法があるようですが、詳しく調べられていません。

無保証ですが、参考までにお使いください。ライセンスはパブリックドメインです。

$innodb_dbs = @("bamboo","confluence","crowd","jira")
$myisam_dbs = @("mediawiki")
$backup_user = "backup"
$backup_password = "password"
$mysqldump = "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump.exe"

$password_option = "--password=" + $backup_password
foreach($db in $innodb_dbs){
 &"$mysqldump" -u $backup_user $password_option --quick --opt --single-transaction $db > backup-$db.sql
}

foreach($db in $myisam_dbs){
 &"$mysqldump" -u $backup_user $password_option --quick --opt --lock-tables $db > backup-$db.sql
}

&"$mysqldump" -u $backup_user $password_option --quick --opt --lock-tables --flush-privileges mysql > backup-mysql.sql

0 件のコメント:

コメントを投稿