从C#

时间:2019-03-21 08:38:54

标签: c# sql-server backup

尽管从还原“正常”数据库的角度来看,有很多问题和答案可用于处理程序化备份还原,但对于[master][msdb]或{{ 1}}我遇到许多不同的问题。我想知道是否有人可以为此做出贡献,特别是对于[model],但是所有这些似乎都可能引起问题。现在,我已经以单用户模式(整个服务)启动了ms-sql,以使用T3608标志还原master数据库,但是当我尝试对其运行[master]查询时,这断开了我的连接管道消息已损坏。检查服务控制台RESTORE DATABASE显示数据库服务不再运行。

换句话说,运行此查询似乎使sql-server崩溃,没有有用的消息结果。

让我们看一些示例代码。查询生成代码如下:

services.msc

因此,这几乎是一个最简单的示例。 FileIndex是包含备份文件索引的整数,此处未初始化的所有其他变量都是包含各种路径和名称的字符串。请注意,手动执行这种查询会产生预期的结果(还原了备份文件)。

事件日志使事情变得更加奇怪。我观察到此消息:

  

快照隔离或读取已提交快照在数据库“主服务器”中不可用,因为SQL Server是用一个或多个未记录的跟踪标志启动的,这些标志阻止启用数据库的版本控制。以快照隔离开始的事务将失败,并且在已提交读快照下运行的查询将成功,但是将重新使用基于锁定的已读提交。

大概是在抱怨T3608。事件日志还包含有关“成功还原”的消息,但是检查string query = "RESTORE DATABASE @dbName FROM DISK " + "= @backupPath WITH FILE = @fileID, REPLACE, "; if (dataFileName != "") { query += "MOVE @dataFileName TO @dataFileLocation, "; } if (logFileName != "") { query += "MOVE @logFileName TO @logFileLocation, "; } query += "STATS=1"; SqlCommand cmdData = new SqlCommand(query, conn); cmdData.Parameters.AddWithValue("@dbName", databaseName); cmdData.Parameters.AddWithValue("@backupPath", filePath); cmdData.Parameters.AddWithValue("@fileID", fileIndex); if (dataFileName != "") { cmdData.Parameters.AddWithValue("@dataFileName", dataFileName); cmdData.Parameters.AddWithValue("@dataFileLocation", mdfPath); } if (logFileName != "") { cmdData.Parameters.AddWithValue("@logFileName", logFileName); cmdData.Parameters.AddWithValue("@logFileLocation", ldfPath); } cmdData.ExecuteNonQuery(); 文件夹的内容后发现,我的程序实际上并未放回我手动删除的数据库文件,而是似乎什么也没做? >

此时,我对sql server的奇怪行为感到非常困惑。任何人都可以阐明这可能如何发生吗?

修改:

对过程进行更多的挖掘和试验后发现,实际上实际上也需要msdb和model数据库,否则SQL Server无法正常启动。因此,必须同时存在这三个数据库才能还原它们,而您现在只能以特殊,复杂的特定方式还原这三个数据库,我现在将它们称为特殊数据库,每种方法各不相同其中之一。

我不确定什么以及如何确定。互联网上有很多相互矛盾的建议,而且没有一个文档化的程序可以直接工作。

我发现ms-sql保留了一个特殊的文件夹“ Template Data”。在这里,有一堆用于特殊数据库的模板。我可以将这些模板复制到真实的DATA文件夹中,以使用正在运行的sql-server从中还原备份的特殊数据库。

但是:这样做:在还原非主特惠(msdb和模型)期间,服务器仍会自行终止。实际上可能没有任何还原。

进一步检查日志文件会发现以下两个有趣的错误:

  

在数据库“模型”中重做已记录的操作期间,日志记录ID(32:151:1)发生错误。通常,以前,特定故障在Windows事件日志服务中记录为错误。从完整备份还原数据库,或修复数据库。

     

在读取文件'E:\ backupdb \ MSSQL12.TBUINST \ MSSQL \ Template Data \ modellog.ldf'中偏移量000000000000000000的过程中,操作系统向SQL Server返回了错误5(访问被拒绝)。 SQL Server错误日志和系统事件日志中的其他消息可能会提供更多详细信息。这是严重的系统级错误情况,威胁数据库的完整性,必须立即更正。完成完整的数据库一致性检查(DBCC CHECKDB)。此错误可能是由多种因素引起的;有关更多信息,请参见SQL Server联机丛书。

为什么现在尝试读取“模板数据”中的内容?是因为模板系统db或msdb db或model db在其自身内部 内包含对model / msdb / etc db的硬编码路径的引用,所以我必须发出移动命令?我何时/如何在还原过程中发布这些文件?

我还意识到了这一点:假设我首先还原了“ master”数据库,并且包含了其他特殊数据库的路径,为什么SQL Server现在在模板数据文件夹中进行搜索?毕竟,它在还原master数据库时确实会重新启动,因此其中的路径现在应该是默认路径。更不用说,在每一个还原操作中,我都明确指定DATA文件以及新的.bak.ldf文件的位置。这是零意义。

1 个答案:

答案 0 :(得分:1)

主数据库还原完成后,SQL Server自动停止。您需要在代码中处理由此产生的连接错误,重新启动SQL Server,然后继续还原其他系统数据库。