Sql server恢复卡在“恢复”状态

时间:2014-03-08 10:49:07

标签: sql-server restore

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

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

如果我删除“with move”选项,它可以工作:恢复后DB处于正常状态。

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

因为如果我第一次在没有“with move”的情况下启动恢复,它会说他找不到指定的路径。否则,如果我使用此选项启动还原,然后在没有它的情况下再次启动,则可以正常运行。所以必须有一些表,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();

1 个答案:

答案 0 :(得分:0)

我想要理解的是:"移动"修改一个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在默认路径以外的路径中重新分配已恢复的数据库。