SQL Server バックアップとリストア

SQL Server Data Tools のライブラリを使い、.Net アプリケーションで「DBのデタッチ → DBファイルのコピー → DBのアタッチ」を行う。
この方法の場合、データベースを使用しているアプリケーション内からバックアップ/リストアを行うことができる。

【事前準備】

  1. SQL Server Data Tools をインストールする
  2. C# のプロジェクトを作成する
  3. 下記のライブラリを参照設定に追加する
    ・Microsoft.SqlServer.ConnectionInfo
    ・Microsoft.SqlServer.Smo

【サンプルコード】

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;

public class FrmBackupRestore {
    const string DATABASE_FOLDER = @"C:\Database\DATA\";
    const string BACKUP_FOLDER = @"C:\Database\Backup\";
    const string DB_FILE_NAME = "SampleDB.mdf";
    const string LOG_FILE_NAME = "SampleDB_log.ldf";
    const string DATABASE_NAME = "SampleDB";

    enum Mode {
        Backup,
        Restore
    }

    void BackupOrRestoreDatabase(Mode mode)
    {
        try
        {
            //サーバー情報の設定
            ServerConnection conn = new ServerConnection();
            conn.ConnectionString = @"Data Source=localhost\SQLEXPRESS;Initial Catalog=master;Integrated Security=True";
            Server srv = new Server(conn);

            //アプリケーション内のコネクションを破棄する必要がある時はここで行う

            //データベースのデタッチ
            srv.DetachDatabase(DATABASE_NAME, true, true);
            try
            {
                //バックアップとリストアの切り替え
                string copyFrom = string.Empty;
                string copyTo = string.Empty;
                switch (mode)
                {
                    case Mode.Backup:
                        copyFrom = DATABASE_FOLDER;
                        copyTo = BACKUP_FOLDER;
                        break;
                    case Mode.Restore:
                        copyFrom = BACKUP_FOLDER;
                        copyTo = DATABASE_FOLDER;
                        break;
                }
                //データベースファイル、ログファイルのコピー
                System.IO.File.Copy(copyFrom + DB_FILE_NAME, copyTo + DB_FILE_NAME, true);
                System.IO.File.Copy(copyFrom + LOG_FILE_NAME, copyTo + LOG_FILE_NAME, true);
            }
            finally
            {
                //データベースのアタッチ
                StringCollection dbFiles = new StringCollection();
                dbFiles.Add(DATABASE_FOLDER + DB_FILE_NAME);
                dbFiles.Add(DATABASE_FOLDER + LOG_FILE_NAME);
                srv.AttachDatabase(DATABASE_NAME, dbFiles, AttachOptions.None);
            }
            //終了処理
        }
        catch (Exception ex)
        {
            //エラー処理
        }
    }
}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする