Windows Azure + Azure SQL データベースでサービスを提供するにあたって、今頭を悩ませているのがデータのバックアップ。ファストサーバーの件もあるし…。
Windows Azure ポータルサイトから手動でバックアップする手段は提供されてるけど、定期的に自動でバックアップを取りたい。そこで、SQL Server 2012 で提供されている DAC Framework を使ってバックアップの仕組みを構築しようと考えている。ちなみに、Windows Azure ポータルのバックアップ機能も DAC Framework を使っているみたい。どうせなら同じ形式がいいよね。独自形式にする理由なし。
ひとまず、DAC Framework を使ってデータベースのエクスポートとインポートができるか実験してみた。Azure SQL データベースは試用期間切れてまだ契約してないので試していない。Azure SQL データベースでも上手く動くといいんだけどね。
データベースのエクスポート
using System; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using Microsoft.SqlServer.Dac; namespace DACFrameworkSample { class Program { static void Main(string[] args) { // 接続文字列を組み立てる var builder = new SqlConnectionStringBuilder(); builder.DataSource = "MACHINENAME\\SQLSERVER2012"; builder.IntegratedSecurity = true; builder.InitialCatalog = "master"; var connectionString = builder.ToString(); // エクスポートファイル名 var packageFileName = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TEST_DB_BACKUP.bacpac"); // エクスポート対象のデータベース名 var databaseName = "TEST_DB"; Console.WriteLine("Start Export"); var sw = Stopwatch.StartNew(); // エクスポート実行 var dac = new DacServices(connectionString); dac.ExportBacpac(packageFileName, databaseName); sw.Stop(); Console.WriteLine("Finish Export({0} ms)", sw.ElapsedMilliseconds); Console.WriteLine("Please enter key..."); Console.ReadLine(); } } }
データベースのインポート
using System; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using Microsoft.SqlServer.Dac; namespace DACFrameworkImportSample { class Program { static void Main(string[] args) { // 接続文字列を組み立てる var builder = new SqlConnectionStringBuilder(); builder.DataSource = "MACHINENAME\\SQLSERVER2012"; builder.IntegratedSecurity = true; builder.InitialCatalog = "master"; var connectionString = builder.ToString(); // インポートするファイルのパス var packageFileName = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "TEST_DB_BACKUP.bacpac"); // インポート先のデータベース名 var databaseName = "TEST_DB"; Console.WriteLine("Start Import"); var sw = Stopwatch.StartNew(); // バックアップパッケージの読み込み var package = BacPackage.Load(packageFileName); // インポート実行 var dac = new DacServices(connectionString); dac.ImportBacpac(package, databaseName); sw.Stop(); Console.WriteLine("Finish Import({0} ms)", sw.ElapsedMilliseconds); Console.WriteLine("Please enter key..."); Console.ReadLine(); } } }