Резервное копирование и восстановление базы данных SQL - PullRequest
3 голосов
/ 23 февраля 2012

Мне нужно сделать резервную копию (с помощью C #) базы данных SQL 2005 в файл * .bak. Из этого файла я пытаюсь восстановить базу данных на том же сервере.

Резервное копирование работает нормально, а затем мой код C # вызывает метод восстановления, и он работает до тех пор, пока не истечет время ожидания. Я проверил «innerExceptions», и они показывают, что RESTORE сделал это до 90 процентов, а затем возвращает исключение.

Ниже приведен код, который я использую для резервного копирования и восстановления.

Может кто-нибудь, пожалуйста, дайте мне знать, где я иду не так? Это должен быть где-то параметр тайм-аута, который я могу установить, но я не знаю, что это такое или как это сделать.

public class JRBackupRestoreDB
{
    public static void BackupDatabase(String databaseName, String userName, String password, String serverName, String destinationPath)
    {
        Backup sqlBackup = new Backup();

        sqlBackup.Action = BackupActionType.Database;
        sqlBackup.BackupSetDescription = "ArchiveDataBase:" + DateTime.Now.ToShortDateString();
        sqlBackup.BackupSetName = "Archive";

        sqlBackup.Database = databaseName;

        BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath, DeviceType.File);
        ServerConnection connection = new ServerConnection(serverName, userName, password);
        Server sqlServer = new Server(connection);

        Database db = sqlServer.Databases[databaseName];

        sqlBackup.Initialize = true;
        sqlBackup.Checksum = true;
        sqlBackup.ContinueAfterError = true;

        sqlBackup.Devices.Add(deviceItem);
        sqlBackup.Incremental = false;

        sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);
        sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;

        sqlBackup.FormatMedia = false;

        sqlBackup.SqlBackup(sqlServer);
    }

    public static void RestoreDatabase(String databaseName, String filePath,
    String serverName, String userName, String password,
    String dataFilePath, String logFilePath)
    {
        Restore sqlRestore = new Restore();

        BackupDeviceItem deviceItem = new BackupDeviceItem(filePath, DeviceType.File);
        sqlRestore.Devices.Add(deviceItem);
        sqlRestore.Database = databaseName;

        ServerConnection connection = new ServerConnection(serverName, userName, password);
        Server sqlServer = new Server(connection);

        Database db = sqlServer.Databases[databaseName];
        sqlRestore.Action = RestoreActionType.Database;
        String dataFileLocation = dataFilePath + databaseName + ".mdf";
        String logFileLocation = logFilePath + databaseName + "_Log.ldf";
        db = sqlServer.Databases[databaseName];
        RelocateFile rf = new RelocateFile(databaseName, dataFileLocation);

        System.Data.DataTable logicalRestoreFiles = sqlRestore.ReadFileList(sqlServer);
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[0][0].ToString(), dataFileLocation));
        sqlRestore.RelocateFiles.Add(new RelocateFile(logicalRestoreFiles.Rows[1][0].ToString(), logFileLocation));

        sqlRestore.SqlRestore(sqlServer);
        db = sqlServer.Databases[databaseName];
        db.SetOnline();
        sqlServer.Refresh();
    }

}

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Вы пытались установить значение с помощью ServerConnection.StatementTimeout, чтобы увидеть, что происходит?

Ссылка MSDN здесь .

0 голосов
/ 23 февраля 2012

Это было бы чертовски легко сделать на простом sql ...

Рассматривали ли вы попробовать это таким образом? Вы просто должны написать сценарий или процедуру sql, чтобы сделать это, а затем запустить его. Вот что мы делаем (для другой ситуации, но похожей):

backup database {{DATABASE NAME HERE}}
to disk = N'{{FILE_NAME_HERE}}'
    with
        name = N'{{BACKUP_DATABASE_NAME_HERE}}'
GO

restore database {{NEW_DATABASE_NAME}}
from disk = N'{{FILE_NAME_HERE}}'
    with
        file = 1
go
...