上周公司的生产库的tempdb瞬间暴涨,导致磁盘剩余空间为0,估计是相关人员运行不合理的sql查询导致。

tempdb在以下情况会用到:

(1)用户建立的临时表.如果能够避免不用,就尽量避免. 如果使用临时表储存大量的数据且频繁访问,考虑添加index以增加查询效率。
(2)Schedule jobs.如DBCC CHECKDB会占用系统较多的资源,较多的使用tempdb.最好在SQL Server loading比较轻的时候做。
(3)Cursors.游标会严重影响性能应当尽量避免使用。
(4)CTE(Common Table Expression).也会在tempdb中执行。

(5)SORT_INT_TEMPDB.建立index时会有此选项。
(6)Index online rebuild。
(7)临时工作表及中间结果集.如JOIN时产生的。
(8)排序的结果。
(9)AFTER and INSTEAD OF triggers。

因此如果有人在数据库中用笛卡尔乘积的方法查询多个表,并且排序的话,会造成tempdb的暴涨,因为大量的排序就是在tempdb中进行的。

为了监控tempdb的文件或者tempdb的log的大小,现写了以下一个存储过程:

首先建立三个表:

 1 --保存当前tempdb的数据文件和LOG文件的大小
 2 if exists (select * from sysobjects where id = object_id(N'[Check_tempdb_Size]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 3 drop table [Check_tempdb_Size]
 4 GO
 5 Create table Check_tempdb_Size(
 6 ID INT IDENTITY,
 7 FileId int,
 8 size int,
 9 Name varchar(10),
10 InsertdateTime datetime default getdate()
11 )
12
13 --保存当前dbcc opentran的信息
14 if exists (select * from sysobjects where id = object_id(N'[Check_tempdb]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
15 drop table Check_tempdb
16 go
17 create table Check_tempdb(
18 ID INT IDENTITY,
19 TypeName varchar(100),
20 TypeValue varchar(100),
21 InsertDate datetime default getdate()
22 )
23
24 --保存当前运行的相关进程的信息(数据库,登陆账号,登陆机器,运行的sql)
25 if exists (select * from sysobjects where id = object_id(N'[Check_tempdb_script]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
26 drop table Check_tempdb_script
27 Create table Check_tempdb_script(
28  ID INT IDENTITY(1,1),
29  spid int,
30  ecid int,
31  [Database] varchar(20),
32  nt_username nchar(256),
33  [Status] varchar(20),
34  [Wait] varchar(20),
35  [IndividualQuery] varchar(max),
36  [ParentQuery]  varchar(max),
37  Program nchar(256),
38  Hostname nchar(256),
39  loginame nchar(256),
40  nt_domain nchar(256),
41  start_time datetime,
42  InsertDateTime datetime default getdate()
43  )

将当前tempdb的数据文件盒LOG文件的大小保存在Check_tempdb_Size表中

insert into Check_tempdb_Size
select fileid,size,name,GETDATE()
from tempdb..sysfiles

建立以下存储过程

 1 if exists (select * from sysobjects where id = object_id(N'[Check_tempdb_Monitor]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 2 drop procedure [Check_tempdb_Monitor]
 3 go
 4 Create procedure Check_tempdb_Monitor
 5 as
 6 begin
 7 declare
 8 @tempdb_mdf_size int,
 9 @tempdb_log_size int,
10 @last_tempdev int,
11 @last_templog int
12 end
13
14 begin
15 select @tempdb_mdf_size=size from tempdb..sysfiles where fileid=1
16 select @tempdb_log_size=size from tempdb..sysfiles where fileid=2
17 select @last_tempdev=size from Check_tempdb_Size
18 where InsertdateTime =(select MAX(InsertdateTime) from Check_tempdb_Size)
19 and id=1
20 select @last_templog=size from Check_tempdb_Size
21 where InsertdateTime =(select MAX(InsertdateTime) from Check_tempdb_Size)
22 and id=2
23
24 if(@tempdb_mdf_size>(@last_tempdev*1.05) or @last_templog>(@last_templog*1.05))
25     begin
26         insert into Check_tempdb_Size(FileId,size,Name)
27         select fileid,size,name
28         from tempdb..sysfiles
29
30         Insert into Check_tempdb(TypeName,TypeValue)
31         exec('dbcc opentran(''tempdb'') with tableresults')
32
33         insert into Check_tempdb_script(spid,ecid,[Database],nt_username,[Status],
34 Wait,IndividualQuery,ParentQuery,Program,Hostname,loginame,nt_domain,start_time)
35 SELECT[Spid] = session_Id ,
36       ecid ,
37       [Database] = DB_NAME(sp.dbid) ,
38       [User] = nt_username ,
39       [Status] = er.status ,
40       [Wait] = wait_type ,
41       [Individual Query] = SUBSTRING(qt.text, er.statement_start_offset / 2,
42                                      ( CASE WHEN er.statement_end_offset = -1
43                                             THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))
44                                                  * 2
45                                             ELSE er.statement_end_offset
46                                        END - er.statement_start_offset ) / 2) ,
47       [Parent Query] = qt.text ,
48       Program = program_name ,
49       Hostname ,
50       loginame,
51       nt_domain ,
52       start_time
53   FROM sys.dm_exec_requests er
54       INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
55       CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
56  WHERE session_Id >= 51
57     end
58 end

上面的存储过程中,如果当前的tempdb的数据文件大小或者LOG文件大小比上一次记录的文件大小大5%(该值可以根据情况自己设定),则会记录当前的信息到三张表中,否则结束。

对于以上存储过程,建一个作业,可以根据需要来决定多久跑一次,我的设定是每30s运行一次。

再遇到temp变大的时候,可以查询三张表:

可以在第二张表中看到当前运行的事务是68进程,可以在第三张表中查到68进程的详细信息。

----------------------------------

记录个CHECKIDENT的使用方法。。。

在这个示例中,我们检查表当前的IDENTITY值:

DBCC CHECKIDENT('HumanResources.CompanyAuditHistory', NORESEED)

把种子值重设为一个更大的数字:

DBCC CHECKIDENT ('HumanResources.CompanyAuditHistory', RESEED, 50)

转载于:https://www.cnblogs.com/bobozhu/p/3920144.html

tempdb 数据文件暴涨相关推荐

  1. 数据文件shrink_SQL Server中的Shrink TempDB数据库概述

    数据文件shrink This article explores the usage of TempDB and different ways to shrink the TempDB databas ...

  2. 关于 数据文件自增长 的一点理解

    同事问了我数据文件自增长的问题. 我对表空间数据文件的处理原则是: (1)    数据文件设置为自增长,每次自增长的大小为100M.最大值32G. 因为8k的数据块最大支持32G. (2)    用脚 ...

  3. server sql 数据c盘迁移d盘_oracle 11g dbf数据文件从C盘迁移到D盘

    标签: 服务器系统为 windows 2008 R2 64位,由于C盘空间将满,要将C盘的oracle的DBF数据文件迁移到D盘下,步骤如下: 1.输入cmd,启动 cmd.exe窗口 2.输入 sq ...

  4. vs2008/2010安装无法打开数据文件解决方案

    本人在安装VS2008或2010时,在开始的第一个页面(进度条大约加载到75%左右),提示"无法打开数据文件 'C:/Documents and Settings/Administrator ...

  5. 案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l

    通过使用Oracle DUL工具提取损坏磁盘里的数据库文件中的表及lob字段中内容 在有次8i的库恢复中,因为硬盘损坏导致几个表出现很多诡异性坏块,尝试使用dul对其进行挖掘数据,当时使用dul 9 ...

  6. Python数据分析之Pandas读写外部数据文件

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 ...

  7. 使用 bcp 指定数据文件中的前缀长度

    当以本机格式将数据大容量导出到数据文件时,为使文件存储空间最为紧凑,bcp 命令将在每个字段前面使用一个或多个字符来指示字段的长度. 这些字符称为"长度前缀字符". bcp 的前缀 ...

  8. python 输入文件名查找_Python实现的根据文件名查找数据文件功能示例

    本文实例讲述了Python实现的根据文件名查找数据文件功能.分享给大家供大家参考,具体如下: #-*- coding: UTF-8 -*- import os import shutil AllFil ...

  9. oracle从备份提取归档,Oracle归档模式有备份,丢失数据文件的恢复

    1.创建数据库全备份 2.test2用户下面构造测试数据 3.模拟文件丢失:以sysdba身份登录并关闭数据库,尝试重新启动数据库 4.执行恢复:进入RMAN命令行环境 从上面可以看到:恢复数据文件7 ...

最新文章

  1. 又爱又恨的 Microsoft Edge!
  2. 验证Ross《随机过程》(第二版)1.9C
  3. 计数排序的应用----排序字符串
  4. c++ 线程间通信方式
  5. STM32f103——ILI9341
  6. layui引入php项目,怎么将layui引入开发框架中
  7. phoneGap实现离线缓存
  8. 事务超时时间无效_架构设计 | 基于消息中间件,图解柔性事务一致性
  9. Linux文件系统之inode与软硬连接
  10. Debit credit problem
  11. FastDFS搭建文件服务器
  12. html 抽签分小组代码,JavaScript实现班级抽签小程序
  13. 少儿学python 仿真秀_“在家学”仿真:使用Python进行SCDM脚本建模攻略
  14. 一文了解DataStore(Preferences)
  15. python长度转换代码尺和米_尺,寸,跟米,厘米的换算??
  16. 表单提交时报错:No result defined for action com.ylj.action.BbsAction and result input
  17. PTA 7-10 查询水果价格
  18. 手把手教大家搭建微信公众号查题
  19. Java 最全面的面试题675道
  20. Java里用Frame框架写流星雨

热门文章

  1. java pixel data_java - JavaFX PixelWriter性能低下
  2. python子进程异常结束_Python子进程
  3. jms pub/sub模型_JMS消息传递模型:点对点和发布/订阅
  4. java创建一个不可变对象_如何在Java中创建不可变类?
  5. MIT6.828 boot.S文件分析
  6. 机器人技术与人工智能有什么区别?
  7. 华三配置telnet
  8. ballerina 学习二十六 项目docker 部署 运行(二)
  9. tomcat部署项目启动采坑之UnknownHostException
  10. 推荐中文分词:腾讯文智