【发布时间】: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