SQL Server Tempdb日常维护

浏览: 2803

本文参考


ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.zh-CHS/s10de_1devconc/html/ce4053fb-e37a-4851-b711-8e504059a780.htm(联机帮助)
http://www.cnblogs.com/gaizai/p/3516905.html
SQLServer2012管理高级教程


tempdb功能集


 查询
 触发器
 快照隔离和读提交的快照
 多个活动结果集( MARS)
 索引、联机索引
 临时表、表变量、表值函数、用户自定义函数
 DBCC Check
 Large Objects参数
 游标
 ServiceBroker和事件通知
 XML和Large Objects变量
 查询通知
 数据库邮件
tempdb限制(不能对 tempdb 数据库执行以下操作)
 添加文件组。
 备份或还原数据库。
 更改排序规则。默认排序规则为服务器排序规则。
 更改数据库所有者。 tempdb 的所有者是 dbo。
 创建数据库快照。
 删除数据库。
 从数据库中删除 guest 用户。
 启用变更数据捕获。
 参与数据库镜像。
 删除主文件组、主数据文件或日志文件。
 重命名数据库或主文件组。
 运行 DBCC CHECKALLOC。
 运行 DBCC CHECKCATALOG。
 将数据库设置为 OFFLINE。
 将数据库或主文件组设置为 READ_ONLY。
tempdb配置最佳实践
 根据测试或者预估,为tempdb预先分配大小,同时启动自动增长
 在每个cpu或者处理器内核上,为tempdb创建数据文件,且每个大小相同,不超过8个文件。
 确保恢复模型为简单模型
 将自从增长设置为固定大小(按M增长,约为数据库初始大小的10%)
 将tempdb放在告诉的IO系统上
 使用即时数据库文件初始化(即时文件初始化功能仅在向 SQL Server (MSSQLSERVER) 服务帐户授予了 SE_MANAGE_VOLUME_NAME 之后才
可用。 Windows Administrator 组的成员拥有此权限,并可以通过将其他用户添加到【执行卷维护任务】安全策略中来为其授予此权限。可参考
http://www.cnblogs.com/gaizai/p/3516905.html
tempdb常用监控脚本
--查询正在最大限度使用用户对象及内部对象的会话信息
SELECT TOP 5
*
FROM sys.dm_db_session_space_usage
ORDER BY user_objects_alloc_page_count + internal_objects_alloc_page_count DESC
go
--查询各种对象使用的空间情况
SELECT SUM(user_object_reserved_page_count) * 8 AS user_objects_kb ,
SUM(internal_object_reserved_page_count) * 8 AS internal_ojects_kb ,
SUM(version_store_reserved_page_count) * 8 AS version_store_kb ,
SUM(unallocated_extent_page_count) * 8 AS freespace_kb
FROM sys.dm_db_file_space_usage
WHERE database_id = 2
--tempdb 中所有文件使用的磁盘空间总量
SELECT SUM(size) * 1.0 / 128 AS [size in MB]
FROM tempdb.sys.database_files

--批处理级信息
--返回tempdb 中当前运行的所有任务中的内部对象使用的总空间量
SELECT session_id ,
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count ,
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id;
--返回tempdb 中正在运行的任务和已完成任务中的所有内部对象使用的空间
;
WITH all_task_usage
AS ( SELECT session_id ,
SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count ,
SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id
)
SELECT R1.session_id ,
R1.internal_objects_alloc_page_count
+ R2.task_internal_objects_alloc_page_count AS session_internal_objects_alloc_page_count ,
R1.internal_objects_dealloc_page_count
+ R2.task_internal_objects_dealloc_page_count AS session_internal_objects_dealloc_page_count
FROM sys.dm_db_session_space_usage AS R1
INNER JOIN all_task_usage AS R2 ON R1.session_id = R2.session_id;
--查看每个session 运行的批处理
DECLARE @max INT;
DECLARE @i INT;
SELECT @max = MAX(session_id)
FROM sys.dm_exec_sessions
SET @i = 51
WHILE @i <= @max
BEGIN
IF EXISTS ( SELECT session_id
FROM sys.dm_exec_sessions
WHERE session_id = @i )
DBCC INPUTBUFFER (@i)
SET @i = @i + 1
END;
--查询级信息
--返回每个请求的sql_handle、 statement_start_offset、 statement_end_offset 和plan_handle等信息
;
WITH all_request_usage
AS ( SELECT session_id ,
request_id ,
SUM(internal_objects_alloc_page_count) AS request_internal_objects_alloc_page_count ,
SUM(internal_objects_dealloc_page_count) AS request_internal_objects_dealloc_page_count
FROM sys.dm_db_task_space_usage
GROUP BY session_id ,
request_id
)
SELECT R1.session_id ,
R1.request_id ,
R1.request_internal_objects_alloc_page_count ,
R1.request_internal_objects_dealloc_page_count ,
R2.sql_handle ,
R2.statement_start_offset ,
R2.statement_end_offset ,
R2.plan_handle
FROM all_request_usage R1
INNER JOIN sys.dm_exec_requests R2 ON R1.session_id = R2.session_id
AND R1.request_id = R2.request_id;
--获得执行脚本和执行计划信息
SELECT * FROM sys.dm_exec_sql_text(@sql_handle);
SELECT * FROM sys.dm_exec_query_plan(@plan_handle);
--返回正在运行并且做过空间申请的session正在运行的语句

SELECT t1.session_id ,
st.text
FROM sys.dm_db_session_space_usage AS t1 ,
sys.dm_exec_requests AS t4
CROSS APPLY sys.dm_exec_sql_text(t4.sql_handle) AS st
WHERE t1.session_id = t4.session_id
AND t1.session_id > 50
AND ( t1.internal_objects_alloc_page_count > 0
OR t1.user_objects_alloc_page_count > 0
OR t1.internal_objects_dealloc_page_count > 0
OR t1.user_objects_dealloc_page_count > 0
)
移动 tempdb 数据库
--确定tempdb 数据库的逻辑文件名称以及在磁盘上的当前位置。
SELECT name ,
physical_name AS CurrentLocation
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');
GO
--使用ALTER DATABASE 更改每个文件的位置。
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'F:\SQLLog\templog.ldf');
GO
--停止再重新启动SQL Server 的实例。
--验证文件更改。
SELECT name ,
physical_name AS CurrentLocation ,
state_desc
FROM sys.master_files
WHERE database_id = DB_ID(N'tempdb');
--tempdb.mdf templog.ldf 文件从其原始位置删除。



文档下载:

推荐 0
本文由 cainanyang 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册