Восстановление SMO из сетевого SQLServer никогда не завершается (вызывается из C #) - PullRequest
0 голосов
/ 24 февраля 2012

Я пытаюсь скопировать базу данных из сетевого SQLServer в локальный SQLExpress:

private void DoRestore()
    {
         if (!File.Exists(fileNach))
         {
             MessageBox.Show("Restore gescheitert " + fileNach);
             return;
         }

        Restore res = new Restore();
        Server srv = new Server(Environment.MachineName.ToString()+@"\SQLEXPRESS");
        //MessageBox.Show("Ziel Server :"+srv.Name);

        try
        {
            string fileName = @fileNach;
            string databaseName = "Outdoor";
            srv.KillAllProcesses(databaseName);
            res.Database = databaseName;
            res.Action = RestoreActionType.Database;
            res.Devices.AddDevice(fileName, DeviceType.File);
            res.ReplaceDatabase = true;
            res.NoRecovery = true;

            string odb;
            string odblog;
            odb = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.mdf";
            odblog = @"C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Outdoor.ldf";

            res.RelocateFiles.Add(new RelocateFile("Outdoor", odb));
            res.RelocateFiles.Add(new RelocateFile("Outdoor_Log", odblog));

            // restore starten
            res.SqlRestore(srv);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
}

Этот код запускает процесс восстановления на SQLExpress, но никогда не заканчивается. Файлы mdf и log создаются в каталоге назначения, но восстановление не завершается.

Я также пытался с srv.KillAllProcesses(databaseName);, но без результата.

На уровне C # ошибок не возникает.

1 Ответ

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

Вы говорите, что это никогда не заканчивается, вы видите, что ваш код заканчивается, но база данных застряла в режиме «восстановления»? Если это так, я думаю, что вы хотите восстановить с восстановлением, в противном случае вы оставляете базу данных неработоспособной. Попробуйте установить для NoRecovery значение false вместо true:

res.NoRecovery = false;

С здесь

  1. Оставьте базу данных готовой к использованию, откатив незафиксированное сделки. Дополнительные журналы транзакций не могут быть восстановлены. ( ВОССТАНОВИТЬ С ВОССТАНОВЛЕНИЕМ )

    Восстанавливает базу данных. Эта опция эквивалентна ВОССТАНОВЛЕНИЮ опция в инструкции Transact-SQL RESTORE.

    Выберите эту опцию, только если у вас нет файлов журнала, которые вы хотите восстановление.

  2. Оставьте базу данных в нерабочем состоянии и не откатывайте незафиксированные транзакции. Дополнительные журналы транзакций могут быть восстановлены. ( ВОССТАНОВИТЬ С NORECOVERY )

    Оставляет базу данных в невосстановленном состоянии. Эта опция эквивалентно использованию опции NORECOVERY в Transact-SQL RESTORE заявление.

    Когда вы выбираете эту опцию, Сохранить настройки репликации опция недоступна.

...