【问题标题】:Sql server restore stuck in "restoring" stateSql server restore 卡在“正在恢复”状态
【发布时间】:2014-03-08 10:49:07
【问题描述】:

如果我从 Sql Server 恢复没问题,但如果我通过我的应用程序恢复,数据库就会卡在“恢复状态”。

我发现了一些建议说设置 noRecovery = false,但这并没有改变任何东西。

如果我删除“with move”选项,它会起作用:还原后数据库处于正常状态。

我想了解的是:“with move”会修改sql server表吗?

因为如果我第一次在没有“移动”的情况下启动还原,它会说他找不到指定的路径。否则,如果我使用此选项启动还原,然后一秒钟没有它,它会起作用。那么肯定有一些表是sql server用来映射逻辑名和物理路径的,请问如何修改这个表呢?

代码如下:

SqlConnection sqlConnection = new SqlConnection(string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True", database.SqlServerId, database.Name));

ServerConnection connection = new ServerConnection(sqlConnection);
Server sqlServer = new Server(connection);
Restore rstDatabase = new Restore();
rstDatabase.Action = RestoreActionType.Database;
rstDatabase.Database = backupFile.Name;
BackupDeviceItem bkpDevice = new BackupDeviceItem(backupFile.FileName, DeviceType.File);
rstDatabase.Devices.Add(bkpDevice);
rstDatabase.ReplaceDatabase = true;
rstDatabase.NoRecovery = false;


string dbLogicalName = "";
string logLogicalName = "";

sqlConnection.Open();


SqlCommand command = new SqlCommand(string.Format("RESTORE FILELISTONLY FROM DISK = '{0}'", backupFile.FileName), sqlConnection);

SqlDataReader reader = command.ExecuteReader();

if (reader.HasRows)
{
    while (reader.Read())
    {
        if (reader.GetString(2) == "D")
            dbLogicalName = reader.GetString(0);
        if (reader.GetString(2) == "L")
            logLogicalName = reader.GetString(0);
    }
}

reader.Close();

rstDatabase.RelocateFiles.Add(new RelocateFile(dbLogicalName, backupFile.DatabaseFile));
rstDatabase.RelocateFiles.Add(new RelocateFile(logLogicalName, backupFile.LogsFile));

//Restore

rstDatabase.SqlRestore(sqlServer);
rstDatabase.Devices.Remove(bkpDevice);
sqlConnection.Close();
connection.Disconnect();

【问题讨论】:

  • 与其考虑破解一些映射表,不如解决问题:修复损坏的恢复代码。对于您想要的,解决方法不是必需的。发布代码并使用 SQL Profiler 查看执行了什么。
  • 我已经添加了代码。
  • 在 Sql Profiler 中没有 RECOVERY 选项,即使我写了 rstDatabase.NoRecovery = false。但这不是问题,因为在 SQL Server 中,如果我删除 RECOVERY,状态不会停留在正在恢复。在 Sql profiler 中,有用于从应用程序启动的查询的选项 NOUNLOAD,但这不是问题,因为如果我将 NOUNLOAD 放在 Sql Server 中,数据库的状态在还原后返回正常。 -------> 没有解决方案
  • 你能让它在 SSMS 中使用手动构造的语句吗? (是的,你可以。)找出 SMO 执行的不同之处。显然有区别的。还请发布您遇到的任何错误。你对这个错误的解释是什么?
  • 如果我在 Profiler 中接收应用程序启动的查询并在 SSMS 中运行它,我没有问题,但如果查询是由应用程序启动的,则数据库状态仍为“正在恢复”。我在想这种差异可能是由于来自应用程序的命令超时,我将对此进行测试。

标签: sql-server restore


【解决方案1】:

我想了解的是:“with move”会修改sql server表吗?

不一定,除非您修改实例中的默认数据库路径,您可以按照以下步骤在 SSMS 中执行此操作: https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/view-or-change-the-default-locations-for-data-and-log-files

但正如有人所说,请尝试在您自己的应用程序上解决该问题。不要尝试在系统数据库上修改它。这样做可能会带来意想不到的结果。

我想你知道,但是 WITH MOVE 告诉 SQL Server 将恢复的数据库重新分配到与默认路径不同的路径中。

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2021-11-06
    相关资源
    最近更新 更多