首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >问题- TempDB已满

问题- TempDB已满
EN

Database Administration用户
提问于 2021-10-12 12:59:34
回答 2查看 264关注 0票数 1

我正在尝试创建一些检查列表,以便在TempDb已满时解决各种问题。在可能的情况下,我想要一个优先级优先的可重复的过程来帮助我尽快解决问题。

当TempDB已满时,您采取了哪些步骤来排除故障并修复它?以下是我到目前为止所做的,但我知道这还远远不够,因为我还不知道采取哪些最好的步骤来排除它。

对我来说,这需要几份核对表。当服务器允许你连接的时候,当它不能连接的时候。

当服务器允许您连接时,

  1. 运行Sp_Who2 -检查任何块
  2. 运行Sp_WhoIsActive以尝试查看填充TempDB的内容
  3. 杀死任何可能填满TempDb的SPID
  4. 重新启动Server服务。

当服务器不允许您连接时,

  1. 重新启动Server服务。

为了帮助您解决和修复完整的TempDB,您还采取了哪些其他步骤?

谢谢你的帮助!

EN

回答 2

Database Administration用户

发布于 2021-10-12 14:20:06

用例太多了。

以下是我首先要检查的内容:

1-如果连接和tempdb不再满:

  • 通常,这是因为某些进程没有空间,而SQL回滚了该事务(在tempdb中释放空间)。如果您的Tempdb很小,并且可以将额外的空间添加到磁盘中,则这是最简单的方法。只需添加空间,并确保自动增长是启用的(检查所需的跟踪标志,如果您有许多数据文件的版本,比2016年)。
  • 如果您不能添加空间,那么您将进入更困难的一步,以确定哪个进程正在使用tempdb中的这么多空间。您可以使用应用程序团队(通常,当SQL回滚事务时,他们会在日志中得到一个错误)。您还可以尝试在tempdb达到某个阈值时构建某种警告,然后运行并从sp_whoisactive收集信息,以确定是哪个查询导致的。一旦你知道了它是什么,你可以试着调整它,使它使用更少的空间。

2-如果tempdb仍满:

  • 然后,我将检查是否填充了tempdb (temp表、行版本等)。我也会检查谁在填满它。
  • 然后,如果是行版本,我将检查一个长时间运行的事务或一个具有打开事务但似乎不活动的事务。一旦我找到了它,我就会杀死这个会话(如果我能首先到达开发团队,我通常会这样做,以便向他们展示到底是怎么回事(如果这种情况发生一次,很有可能会再次发生,而且大多数情况下,它需要在代码中修复)
  • 如果是user对象(temp表),我将尝试与运行查询的用户联系。如果可以更好地编写查询,我将让他知道并帮助他改进查询。如果他只是使用begin运行它,而忘了提交/回滚,那么我将请他这样做。我总是关心杀戮会话(特别是如果他们已经运行了一段时间,因为回滚可能需要更长的时间)。

我不会为一个完整的tempdb重新启动实例..。这是最后的选择。

票数 1
EN

Database Administration用户

发布于 2021-10-12 15:39:02

从下面的链接获取TempDBInfo存储过程,将其部署(创建)到任何用户数据库

https://github.com/aleksey-vitsko/Database-Administrator-Tools

  1. 运行exec TempDBInfo,它将向您显示TempDB信息,例如数据文件的数量、它们的完整性、日志文件、消耗大部分TempDB的会话等等。
  2. 杀死消耗最多的会话(如果这确实是一个问题)

不需要在关闭会话后重新启动Server服务

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/301004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档