バックアップの課題(3):サーバーデータベースのバックアップ
現在このサーバーがホストしている2つのデータベースサーバーに、バックアップの必要なデータベースが存在します。1つはMySQL 5データベースで、もう1つはMSDEデータベースです。データベースのバックアップを希望するユーザーは、バックアップを圧縮したうえで安全な場所にメールで送信するよう要請しています。最初のステップとして、1つのデータベースをバックアップするNAntスクリプトを作成します。このスクリプトには、MySQLデータベースをバックアップするためのターゲットとMSDEデータベースをバックアップするためのターゲットが必要です。MySQLのバックアップにはmysqldumpユーティリティを使い、バックアップの必要なデータベースに対して次のコマンドを実行します。
mysqldump -u <username> -p<password> <databasename>
バックアップに特化した読み取り専用のユーザーアカウントを用意することをお勧めします。MSDEデータベースをバックアップするには、osqlユーティリティを使い、次のコマンドでバックアップを実行します。
osql -E -U <username> -P <password> -Q "BACKUP DATABASE <databasename> To DISK = <backupfile>;"
ここでもバックアップに特化した読み取り専用のユーザーアカウントを用意することをお勧めします。
<?xml version="1.0"?> <project name="DatabaseBackup"> <!-- parameters mysqlPath (optional) Only required for the MySQLBackup target. This is the path to the mysqldump executable (in the mysql bin directory). databaseName The name of the database to backup. username The user account to use for the backup. password The user's password. tempDirectory A temporary directory to store the database backup, prior to emailing it. --> <target name="BackupMySQL"> <exec basedir="${mysqlPath}" program="mysqldump" commandline="-u ${username} -p${password} ${databaseName}" output="${tempDirectory}${databaseName}.sql" /> <zip zipfile="${databaseName}.zip"> <fileset basedir="${tempDirectory}"> <include name="${tempDirectory}${databaseName}.sql" /> </fileset> </zip> <mail from="backup@anon.com" tolist="secure@anon.com" subject="${databaseName} database backup" mailhost="localhost"> <files> <include name="${tempDirectory}${databaseName}.zip" /> </files> <attachments> <include name="${tempDirectory}${databaseName}.zip" /> </attachments> </mail> <delete file="${tempDirectory}${databaseName}.zip" /> </target> <target name="BackupMSSQL"> <exec program="osql" commandline="-E -U ${username} -P ${password} -Q "BACKUP DATABASE ${databaseName} To DISK = '${tempDirectory}${databaseName}.dat';" /> <zip zipfile="${tempDirectory}${databaseName}.zip"> <fileset basedir="${tempDirectory}"> <include name="${tempDirectory}${databaseName}.dat" /> </fileset> </zip> <mail from="backup@anon.com" tolist="secure@anon.com" subject="${databaseName} database backup" mailhost="localhost"> <files> <include name="${tempDirectory}${databaseName}.zip" /> </files> <attachments> <include name="${tempDirectory}${databaseName}.zip" /> </attachments> </mail> <delete file="${tempDirectory}${databaseName}.zip" /> </target> </project>
このスクリプトを「DatabaseBackup.build」という名前で保存します。ここでもやはり、データベースのバックアップを制御する別のスクリプトが必要です。このサーバーにはweb1、web2、web3の3つのWebサイトが存在することを思い出してください。それぞれにデータベースが存在します。web1とweb2はぞれぞれweb1とweb2というMySQLデータベースを使用します。web3はweb3というMSDEデータベースを使用します。これらのデータベースの所有者は、データをバックアップして安全な場所へメールで送信することを要請しています。この要件を満たすスクリプトは次のようになります。
<?xml version="1.0"?> <project name="BackupDatabases" target="Backup"> <!-- This property can be declared globally, because it is the same for all databases. --> <property name="tempDirectory" value="C:\backup\" /> <property name="mysqlPath" value="C:\program files\mysql\bin\" /> <!-- This target exists only to specify which databases are to be backed up, and in what order. --> <target name="Backup" depends="BackupWeb1,BackupWeb2,BackupWeb3" /> <target name="BackupWeb1"> <property name="databaseName" value="web1" /> <property name="username" value="web1user" /> <property name="password" value="P@ssword" /> <nant buildfile="DatabaseBackup.build" inheritall="true" target="BackupMySQL" /> </target> <target name="BackupWeb2"> <property name="databaseName" value="web2" /> <property name="username" value="web2user" /> <property name="password" value="P@ssword" /> <nant buildfile="DatabaseBackup.build" inheritall="true" target="BackupMySQL" /> </target> <target name="BackupWeb3"> <property name="databaseName" value="web3" /> <property name="username" value="web3user" /> <property name="password" value="P@ssword" /> <nant buildfile="DatabaseBackup.build" inheritall="true" target="BackupMSSQL" /> </target> </project>
このスクリプトを「BackupDatabases.build」という名前で保存します。このスクリプトをテストするには、「DatabaseBackup.build」と同じディレクトリに保存しておく必要があります。コマンドプロンプトを開き、このディレクトリに移動して次のコマンドを実行します。
nant -buildfile:BackupDatabases.build
このスクリプトを実行すると、先の3つのデータベースの内容がzipアーカイブに追加され、メールでsecure@anon.comに送信されます。
まとめ
本稿ではIISメタデータ、Webサイトファイル、データベースの3つのケースについてバックアップ用のスクリプトを作成しました。これらのバックアップタスクを統合し、スケジュールに従って実行するように設定する作業が残っています。すべてのビルドタスクを統合する最も簡単な方法は、次のようなバッチファイルを定義することです。
nant -buildfile:BackupIIS.build nant -buildfile:BackupWebsites.build nant -buildfile:BackupDatabases.build
これだけです。このシステムをセットアップしておけば、毎晩自動的にフルバックアップが行われます。サーバーに新規のサイトが追加されたときは、そのサイトをBackupWebsitesとBackupDatabasesの2つのスクリプトに追加するだけです。これらのツールはすべて無料で使え、信頼性もあります。
NAntの能力は単なるビルドツール以上のものがあります。本稿では強力な自動バックアップツールとしての可能性を示しましたが、他にも多くの可能性が考えられます。自らの手で管理タスクを実行するとき、NAntで自動化できないか自問自答してみるとよいでしょう。