вторник, 5 марта 2013 г.

Backup & Restore базы данных Sql Server 2008 на C#

Если ты, мой дорогой друг, читаешь эту статью, значит тебя заинтересовал ее заголовок. Что в свою очередь значит, что ты знаком с такими операциями Microsoft Sql Server, как создание резервной копии базы данных (backup) и разворачивание базы данных из бэкапа (restore). Мне тоже приходилось не один, и даже не два раза проделывать эти операции из Management Studio.   Некоторым людям приходится делать эти операции каждый день. И вот что я скажу, мой дорогой читатель, вручную это делать реально надоедает. Вот как это можно автоматизировать на C#.

Создание резервной копии базы данных:

Создадим консольное приложение и подключим следующие библиотеки:



А вот и код. Можно изменить первые 3 строчки на получение значений переменных из параметров, передаваемых в метод.

    class Program
    {
        static void Main(string[] args)
        {
            const string sqlServerInstanceName = "QaComputer"// args[0];
            const string databaseName = "TestDb"// args[1];
            const string databaseBackupName = "TestDb.bak";  // args[2];
 
            try
            {
                var server = new Server(sqlServerInstanceName);
                string databaseBackupFilePath = Path.Combine(server.Settings.BackupDirectory, databaseBackupName);
 
                var backup = new Backup
                {
                    Action = BackupActionType.Database,
                    Database = databaseName,
                    Initialize = true// Все наборы данных бэкапа будут перезаписаны.
                    Incremental = false // Показываем, что это полный бэкап.
                };
                // Устанавливаем файл бэкапа бд.
                var deviceItem = new BackupDeviceItem(databaseBackupFilePath, DeviceType.File);
                backup.Devices.Add(deviceItem);
                backup.SqlBackup(server);
                Console.WriteLine("Резервное копирование базы данных «{0}» выполнено успешно в «{1}». Для продолжения нажмите Enter...", databaseName, databaseBackupFilePath);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                const string fileName = "errorLog.txt";
                File.WriteAllText(fileName, e.ToString());
                Console.WriteLine("Резервное копирование базы данных «{0}» завершилось неудачно. Смотри лог ошибки в «{1}». Для продолжения нажмите Enter...", databaseName, fileName);
                Console.ReadLine();
            }
            
        }
    }



Разворачивание базы данных из бэкапа:

Создадим консольное приложение и подключим следующие библиотечки:


А вот и код. Можно изменить первые 4 строчки на получение значений переменных из параметров, передаваемых в метод.

    class Program
    {
        static void Main(string[] args)
        {
            const string sqlServerInstanceName = "QAPC"// args[0];
            const string databaseName = "TestDb2"// args[1];
            const string databaseBackupName = "TestDb.bak";  // args[2];
            const string backupDirectory = @"E:\DatabaseBackups";//args[3];
 
            string databaseBackupFilePath = Path.Combine(backupDirectory, databaseBackupName);
            try
            {
                var server = new Server(sqlServerInstanceName);
                var restore = new Restore
                                  {
                                      Database = databaseName,
                                      Action = RestoreActionType.Database,
                                      ReplaceDatabase = true
                                  };
                var deviceItem = new BackupDeviceItem(databaseBackupFilePath, DeviceType.File);
                restore.Devices.Add(deviceItem);
 
                DataTable dt = restore.ReadFileList(server);
                DataRow[] rows = dt.Select();
                string logicalDatabaseFileName = rows.FirstOrDefault(r => r["Type"].ToString() == "D")["LogicalName"].ToString();
                string logicalDatabaseLogFileName = rows.FirstOrDefault(r => r["Type"].ToString() == "L")["LogicalName"].ToString();
 
                // Устанавливаем новый путь для файла бд и файла лога.            
                string logFilePath = Path.Combine(server.Information.MasterDBLogPath, databaseName + "_Log.ldf");
                string dataFilePath = Path.Combine(server.Information.MasterDBPath, databaseName + ".mdf");
                restore.RelocateFiles.Add(new RelocateFile(logicalDatabaseFileName, dataFilePath));
                restore.RelocateFiles.Add(new RelocateFile(logicalDatabaseLogFileName, logFilePath));
 
                // Осуществляем восстановление данных.
                restore.SqlRestore(server);
                Database db = server.Databases[databaseName];
                db.SetOnline();
                server.Refresh();
                Console.WriteLine("Восстановление базы данных «{0}» из бэкапа «{1}» выполнено успешно. Для продолжения нажмите Enter...", databaseName, databaseBackupFilePath);
                Console.ReadLine();
            }
            catch (Exception e)
            {
                const string fileName = "errorLog.txt";
                File.WriteAllText(fileName, e.ToString());
                Console.WriteLine("Восстановление базы данных «{0}» из бэкапа «{1}» завершилось неудачно. Смотри лог ошибки в «{2}». Для продолжения нажмите Enter...",
                    databaseName, databaseBackupFilePath, fileName);
                Console.ReadLine();
            }
        }
    }


Можно подпилить эти методы под свои нужды.

Комментариев нет:

Отправить комментарий