C#恢复数据库陷入'正在恢复......'

时间:2011-09-19 04:19:12

标签: c# sql restore recovery

我正在将SQL数据库备份和恢复部分插入到我的程序中。我一直在使用MSDN示例(尝试另一个,它不会工作)。 MSDN页面 - http://msdn.microsoft.com/en-us/library/ms162133.aspx

我有备份文件,并在Management Studio中测试了该文件。

但是我在恢复文件方面遇到了麻烦。

代码似乎正常工作,但SQL Server中的数据库停留在“正在恢复...”

            if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                Server sqlServer = new Server();

                Restore sqlRestore = new Restore();
                sqlRestore.NoRecovery = true;
                sqlRestore.Action = RestoreActionType.Database;

                BackupDeviceItem deviceItem = new BackupDeviceItem(openFile.FileName, DeviceType.File);
                sqlRestore.Devices.Add(deviceItem);
                sqlRestore.Database = "firstRecoverTest";

                sqlRestore.SqlRestore(sqlServer);

                //Add the recovered database into the Entity Table
                SqlCommand intoEntity = new SqlCommand("IF NOT EXISTS(SELECT entityName FROM Entitys WHERE entityName = 'firstRecoveryTest') INSERT INTO Entitys VALUES ('firstRecoveryTest');", sqlConnection);                   
                sqlConnection.Open();
                intoEntity.ExecuteNonQuery();

                Database db = default(Database);
                db = sqlServer.Databases["firstRecoverTest"];
                db.RecoveryModel = (RecoveryModel)1;
                db.AutoClose = true;
                //db.Alter();

            }

在示例中有一个db.Alter();函数,但是会抛出一个错误,上面写着“Alter failed for database'firstRecoverTest'”。

请让我知道你的想法

提前致谢

更新

插入“ReplaceDatabase = true;”后最终结果没有变化。 同时逐行逐步执行代码,表明它正在通过。

“db.Alter();”就是放在代码末尾的那个(显示为注释)。它用于创建备份并且无错误地工作。 使用db.Alter()时,InnerError显示此信息;

“数据库处于还原状态时不允许使用ALTER DATABASE”

有趣的部分是SQL日志文件。我得到3个日志:

“启动数据库'firstRecoverTest'。”

“数据库'firstRecoverTest'被标记为RESTORING,并且处于不允许运行恢复的状态。”

“数据库已恢复:数据库:firstRecoverTest,创建日期(时间):2011/09/20(15:44:48),第一个LSN:37:159:37,最后一个LSN:37:175:1,数字转储设备:1,设备信息:(FILE = 1,TYPE = DISK:{'C:\ Users \ Administrator \ Desktop \ installer_backup'})。信息性消息。无需用户操作。“

但是,当我使用SQL Management Studio进行正常恢复时,还有2个日志记录

“启动数据库'[databaseName]'。”

“数据库'[databaseName]'上的恢复已完成。数据库现已可用”

我没有足够的声誉来发布一个关于它如何在SQL Management Studio中出现的小图片。

1 个答案:

答案 0 :(得分:4)

您应该尝试删除数据库或使用sqlRestore.ReplaceDatabase = true;

http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.replacedatabase.aspx

如果看起来没有发生任何事情,您可以在单独的线程中启动该过程,并通过使用这些事件来连接事件以通知进度更改。

sqlRestore.Complete += new ServerMessageEventHandler(completionEvent);
sqlRestore.PercentCompleteNotification = 10; // Call progress event every x percent change.
sqlRestore.PercentComplete += new PercentCompleteEventHandler(progressEvent);

如果这不起作用,请发布不起作用的Alter代码。另请检查SQL Server日志和权限。

<强>已更新

好的,更新更有意义。原因是因为您正在设置sqlRestore.NoRecovery = true;。这样做的结果是,在完成还原之后,数据库将保持在恢复状态,因此除了刚恢复的完整备份之外,还可以还原其他差异备份。

当它处于此状态时,您将无法对数据库执行任何其他操作。我建议除非你需要它,否则你保留默认值NoRecovery = false

请参阅http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.norecovery.aspx

希望有所帮助。