【问题标题】:C# Recovering Database stuck in 'Restoring...'C# Recovering Database 卡在“Restoring...”中
【发布时间】:2023-04-03 20:29:02
【问题描述】:

我在我的程序中插入了一个 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' 被标记为正在恢复,并且处于不允许运行恢复的状态。”

"数据库已恢复:数据库: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 中的小图像。

【问题讨论】:

    标签: c# sql restore recovery


    【解决方案1】:

    您应该尝试删除数据库或使用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

    希望对您有所帮助。

    【讨论】:

    • 我已经更新了我的帖子,希望能帮助解释正在发生的事情
    • 谢谢。我以为我已经尝试过改变它,但我一定是有其他错误导致它失败。这解决了问题。再次感谢您
    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多