我正在程序中插入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‘被标记为正在还原,并且处于不允许运行恢复的状态。”
“数据库已还原:数据库:{'C:\Users\Administrator\Desktop\installer_backup'}).,创建日期(时间):2011/09/20(15:44:48),第一个firstRecoverTest : 37:159:37,最后一个LSN: 37:175:1,转储设备数: 1,设备信息:(FILE=1,TYPE=DISK: LSN信息性消息。无需用户操作。”
但是,当我使用SQL Management Studio执行普通恢复时,有两个以上的日志条目显示
“正在启动数据库‘databaseName’。”
“数据库'databaseName‘上的还原已完成。该数据库现在可用”
不幸的是,我没有足够的名气来发布它在SQL Management Studio中的一个小图像。
发布于 2011-09-19 17:41:33
您应该尝试删除数据库或使用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);如果这不起作用,你能发布不起作用的修改代码吗?还要检查SQL server日志和权限。
已更新
好的,这个更新更有意义。原因是因为您正在设置sqlRestore.NoRecovery = true;。这样做的效果是,还原完成后,数据库将保持恢复状态,因此除了刚刚还原的完整备份之外,还可以还原一个额外的差异备份。
当它处于此状态时,您将无法对数据库执行更多操作。我建议,除非您需要它,否则保留缺省值NoRecovery = false。
请参阅http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.backuprestorebase.norecovery.aspx
希望这能有所帮助。
https://stackoverflow.com/questions/7466411
复制相似问题