我正在尝试在 Sql Server 2008 R2 中运行以下命令:
DBCC SHRINKFILE('filename')
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此命令时,出现以下错误:
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会出现此错误以及如何解决此问题?
谢谢!
我错误地从 SQL Server 2008 数据库中删除了 .ndf 文件。在尝试附加以前的副本时,SSMS 会引发此错误:
服务器“MDSWIN34”的附加数据库失败。(Microsoft.SqlServer.Smo)
附加信息:
执行 Transact-SQL 语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)
操作系统在读取文件“C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\template.ndf”中偏移量 0000000000000000 的过程中向 SQL Server 返回错误 38(到达文件末尾。)。SQL Server 错误日志和系统事件日志中的其他消息可能会提供更多详细信息。这是一种严重的系统级错误情况,会威胁数据库的完整性,必须立即纠正。完成完整的数据库一致性检查 (DBCC CHECKDB)。此错误可能由多种因素引起;有关详细信息,请参阅 SQL Server 联机丛书。(Microsoft SQL Server,错误:823)
这是什么原因?我丢失了所有数据吗?
在过去 24 小时内的某个时间点,使用 DB 的几个应用程序之一对客户 SQL Server 2008 (v 9.0 SP4) 进行了一些更改。
它不是特别重要,但如果我可以转储与时间段对应的 SQL 语句,它将代表对这些应用程序如何使用表的有用见解。
我感兴趣的表不会经常更改,因此应用于这些特定表的事务日志的总行数不应非常大。
我看到了“fn_dblog”函数和 DBCC LOG('DataBaseName') 命令,似乎有相当多的相关信息,但我不知道如何进行下一步并让它们生成实际更改的报告.
这篇博文中有一些细节; http://janiceclee.com/tag/fn_dump_dblog/
USE AdventureWorks
GO
SELECT [Transaction ID], count(*)
FROM fn_dblog(DEFAULT, DEFAULT)
where AllocUnitName LIKE '%Production.TransactionHistory%'--table name
GROUP BY [Transaction ID]
HAVING COUNT(*) >= 113443 --(estimated/actual) number of deleted records
Run Code Online (Sandbox Code Playgroud)
但是我没有任何这样的细节,只有表名(如果需要,我可以得到主键)
以及另一篇博客文章,根据表命名使用类似的示例数据; http://www.sqlskills.com/blogs/paul/post/Search-Engine-QA-6-Using-fn_dblog-to-tell-if-a-transaction-is-contained-in-a-backup.aspx
USE AdventureWorks;
GO
SELECT [Current LSN], Operation, [Transaction ID], AllocUnitName FROM fn_dblog (NULL, NULL);
GO
The log record at that LSN is:
00000058:00001870:0001 LOP_MODIFY_ROW 0000:00001338 HumanResources.Employee.PK_Employee_EmployeeID
This …Run Code Online (Sandbox Code Playgroud) 跟踪标志用于临时设置特定服务器特征或关闭特定行为
有关跟踪标志的更多信息在这里
DBCC TRACESTATUS
Run Code Online (Sandbox Code Playgroud)
以上是显示当前在我的系统上运行的所有跟踪标志的命令。
我有两个问题:
1) 除了DBCC TRACESTATUS?之外,还有其他方法可以找到当前正在运行的跟踪标志列表吗?
2) 可以在上图中看到跟踪标志 1222 处于活动状态,但发生死锁时我没有收到任何电子邮件。还需要做什么?
我们要计算表中每一行的总“行上”存储字节数。正如我们所理解的,我们必须将每一列的 DATALENGTH() 相加,同时还要考虑 NULL 和诸如 VARCHAR(MAX) 之类的东西,它们在“行”上只有一个 24 字节的指针。我们知道每一行也有一些开销,这在下面的查询中没有考虑。
SELECT ROW_ID,
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL1','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL1), 1)
END
+
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL2','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL2), 1)
END
+
CASE
WHEN COLUMNPROPERTY(OBJECT_ID('EXAMPLE_TABLE'),'COL3','PRECISION') = -1 THEN 24
ELSE ISNULL(DATALENGTH(COL3), 1)
END
+
...
...
AS ROW_SIZE
FROM EXAMPLE_TABLE
ORDER BY ROW_SIZE DESC
;
Run Code Online (Sandbox Code Playgroud)
多么野兽!而且这只是一个近似值。
然后我们发现
DBCC SHOWCONTIG ('EXAMPLE_TABLE') WITH TABLERESULTS
Run Code Online (Sandbox Code Playgroud)
返回最大记录大小。这表明 SQL Server 中已经有一个算法可以计算行的确切大小。
我们如何直接访问该算法?
当我运行命令时DBCC LOGINFO,一些Status行包含 2。
现在我想检查为什么我的事务日志不能被截断。我怎么看这个?2 是否意味着Status它们不可重用或操作正在等待(备份、恢复)?是说不能截断吗?
当我通过 Management Studio 运行 dbcc checkdb 时,我会得到完整的报告作为输出。
但是,当我通过 sql 代理作业运行 dbcc checkdb 时,我认为如果 dbcc checkdb 未检测到错误,则作业状态将显示为成功;或者如果 dbcc checkdb 未检测到错误,则作业状态将显示为成功。否则作业状态将显示为失败。那是对的吗?
通过 sql 代理作业运行 dbcc checkdb 时如何获取报告?
dbcc ×7
sql-server ×5
automation ×1
dbcc-checkdb ×1
deadlock ×1
scripting ×1
size ×1
storage ×1