SQL Server 2012 の DAC Framework を試してみた

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();
        }
    }
}