收集SQL Server数据库巡检脚本

bean_sql 2013-03-25 08:20:31
加精
网上找了一些,先贴出来,
请大神继续补充。

set nocount on --不显示提示信息
select '当前时间是:'+convert(varchar,getdate(),120)+' 执行sql server维护'

-----------------------------------------------"
print '-----------------------------------------'
print '--------------查看配置信息---------------'
print '-----------------------------------------'

--查看数据库服务器名和实例名
print '数据库服务器名:'+convert(varchar(30),@@servername)
--print '实例名:'+convert(varchar(30),@@server

--获取当前数据库的版本
select '检查当前数据库的版本'
select @@version

--获取数据库所在机器操作系统参数
select '数据库所在机器操作系统参数'
exec master..xp_msver

--获取数据库启动参数
select '数据库启动参数'
exec sp_configure

--查看数据库启动时间
select '数据库启动时间'
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1


--查看所有数据库用户登录信息
select '所有数据库用户登录信息'
exec sp_helplogins




-------查看数据库信息-----------------
--查看所有数据库名称
select '数据库的名称'
exec sp_helpdb


--查看某数据库下每个数据对象的大小
print '查看数据库下数据对象的大小' --添加@objname
exec sp_spaceused

print '查看和收缩数据库日志文件的方法'
print '所有数据库日志文件大小'
dbcc sqlperf(logspace)


-----------查看进程--------------------
select '数据库里用户和进程的信息'
exec sp_who

select 'SQL Server数据库里的活动用户和进程的信息' --活动的时候才
exec sp_who 'active'

select 'SQL Server数据库里的锁的情况'
exec sp_lock


----------数据库备份-------------------
----------如果有多个数据库,请复制,并将数据库名称改为相应的名称------
print '--------数据库AdventureWorks完整备份--------------'
BACKUP DATABASE [AdventureWorks] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\AdventureWorks.bak' WITH NOFORMAT, NOINIT, NAME = N'AdventureWorks-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD, STATS = 10

print '------------数据库AdventureWorks事务日志备份----------'
BACKUP LOG [AdventureWorks] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\AdventureWorks.bak' WITH NOFORMAT, NOINIT, NAME = N'AdventureWorks-事务日志 备份', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

-----------收缩数据库-----------------
----------如果有多个数据库,请复制,并将数据库名称改为相应的名称------


print '收缩数据库文件'
DBCC SHRINKDATABASE([AdventureWorks]) --AdventureWorks更改为要收缩的数据库名称

...全文
11089 109 打赏 收藏 转发到动态 举报
写回复
用AI写文章
109 条回复
切换为时间正序
请发表友善的回复…
发表回复
四眼小兵 2014-05-22
  • 打赏
  • 举报
回复
彩笔,还不懂
ryan_hb 2014-05-06
  • 打赏
  • 举报
回复
thk!!!!
xiongshao1943 2013-10-09
  • 打赏
  • 举报
回复
mark!留着以后备用
lmy0403 2013-06-04
  • 打赏
  • 举报
回复
学习了!刚刚有用到!!!!
铁歌 2013-05-27
  • 打赏
  • 举报
回复
CREATE PROCEDURE sp_who3 ( @SessionID INT = NULL ) AS BEGIN SELECT SPID = er.session_id ,STATUS = ses.STATUS ,[Login] = ses.login_name ,Host = ses.host_name ,BlkBy = er.blocking_session_id ,DBName = DB_Name(er.database_id) ,CommandType = er.command ,SQLStatement = st.text ,ObjectName = OBJECT_NAME(st.objectid) ,ElapsedMS = er.total_elapsed_time ,CPUTime = er.cpu_time ,IOReads = er.logical_reads + er.reads ,IOWrites = er.writes ,LastWaitType = er.last_wait_type ,StartTime = er.start_time ,Protocol = con.net_transport ,ConnectionWrites = con.num_writes ,ConnectionReads = con.num_reads ,ClientAddress = con.client_net_address ,Authentication = con.auth_scheme FROM sys.dm_exec_requests er OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st LEFT JOIN sys.dm_exec_sessions ses ON ses.session_id = er.session_id LEFT JOIN sys.dm_exec_connections con ON con.session_id = ses.session_id WHERE er.session_id > 50 AND @SessionID IS NULL OR er.session_id = @SessionID ORDER BY er.blocking_session_id DESC ,er.session_id END GO
铁歌 2013-05-26
  • 打赏
  • 举报
回复
--查询空间使用
if object_id('tempdb..#tpData') is not null drop table #tpData;
create table #tpData(name varchar(100)
 ,row varchar(100)
 ,reserved varchar(100)
 ,data varchar(100)
 ,index_size varchar(100)
 ,unused varchar(100)) 
 
declare @name varchar(100) 
declare cur cursor  for 
    select name from sysobjects where xtype='u' order by name 
open cur 
fetch next from cur into @name 
while @@fetch_status=0 
begin 
    insert into #tpData 
    exec sp_spaceused   @name 
    print @name 
 
    fetch next from cur into @name 
end 
close cur 
deallocate cur 
 
select name
 ,convert(int,row) as row
 ,convert(int,replace(reserved,'KB','')) as reserved
 ,convert(int,replace(data,'KB','')) as data
 ,convert(int,replace(index_size,'KB','')) as index_size
 ,convert(int,replace(unused,'KB','')) as unused 
from #tpData
铁歌 2013-05-26
  • 打赏
  • 举报
回复
--总耗CPU最多的前个SQL: SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)], SUBSTRING(qt.text,qs.statement_start_offset/2+1, (CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1) AS [使用CPU的语法], qt.text [完整语法], qt.dbid, dbname=db_name(qt.dbid), qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName FROM sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE execution_count>1 ORDER BY total_worker_time DESC --平均耗CPU最多的前个SQL: SELECT TOP 20 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)], max_worker_time /1000 AS [最大执行时间(ms)], SUBSTRING(qt.text,qs.statement_start_offset/2+1, (CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1) AS [使用CPU的语法], qt.text [完整语法], qt.dbid, dbname=db_name(qt.dbid), qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName FROM sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE execution_count>1 ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC
夜予 2013-05-13
  • 打赏
  • 举报
回复
翻下页
lao_bulls 2013-05-12
  • 打赏
  • 举报
回复
不错,我顶呀。。。mark!
migeking 2013-05-11
  • 打赏
  • 举报
回复
DECLARE @spid INT DECLARE @blk INT DECLARE @count INT DECLARE @index INT DECLARE @lock TINYINT SET @lock=0 CREATE TABLE #temp_who_lock ( id INT IDENTITY(1, 1), spid INT, blk INT ) --if @@error<>0 return @@error INSERT INTO #temp_who_lock (spid, blk) SELECT 0, blocked FROM (SELECT * FROM master..sysprocesses WHERE blocked > 0)a WHERE NOT EXISTS(SELECT * FROM master..sysprocesses WHERE a.blocked = spid AND blocked > 0) UNION SELECT spid, blocked FROM master..sysprocesses WHERE blocked > 0 --if @@error<>0 return @@error SELECT @count = Count(*), @index = 1 FROM #temp_who_lock --select @count,@index --if @@error<>0 return @@error IF @count = 0 BEGIN SELECT '没有阻塞和死锁信息' --return 0 END WHILE @index <= @count BEGIN IF EXISTS(SELECT 1 FROM #temp_who_lock a WHERE id > @index AND EXISTS(SELECT 1 FROM #temp_who_lock WHERE id <= @index AND a.blk = spid)) BEGIN SET @lock=1 SELECT @spid = spid, @blk = blk FROM #temp_who_lock WHERE id = @index SELECT '引起数据库死锁的是: ' + Cast(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ; SELECT @spid, @blk DBCC inputbuffer(@spid) DBCC inputbuffer(@blk) END SET @index=@index + 1 END IF @lock = 0 BEGIN SET @index=1 WHILE @index <= @count BEGIN SELECT @spid = spid, @blk = blk FROM #temp_who_lock WHERE id = @index IF @spid = 0 SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ELSE SELECT '进程号SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '进程号SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下' PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk)); if(@spid <> 0) BEGIN DBCC inputbuffer(@spid) -- END DBCC inputbuffer(@blk) --引起阻塞语句 SET @index=@index + 1 END END DROP TABLE #temp_who_lock --return 0 -----查询出来的进程用 KILL +进程ID --KILL 98 -- 死锁回顾与处理
唐诗三百首 2013-05-07
  • 打赏
  • 举报
回复
@叶子兄台,分享一下sp_who3的代码吖?
annierwu 2013-05-07
  • 打赏
  • 举报
回复
59楼的实用些
u010092411 2013-05-05
  • 打赏
  • 举报
回复
学习学习
wolf0532 2013-04-10
  • 打赏
  • 举报
回复
jAmEs_ 2013-04-09
  • 打赏
  • 举报
回复
skyclin 2013-04-09
  • 打赏
  • 举报
回复
向各大位大神学习一下
cainiao_w 2013-04-08
  • 打赏
  • 举报
回复
xingliuming
ycj80 2013-04-06
  • 打赏
  • 举报
回复
收藏....
angelgxw 2013-04-03
  • 打赏
  • 举报
回复
学习了,不错不错
woof_1128 2013-04-02
  • 打赏
  • 举报
回复
好东西值得收藏
加载更多回复(63)
某集团数据库系统维护管理规范 1、目的 为了保证业务系统稳定高效运行,针对目前的应用现状,加强对数据库运行环境的 维护管理,加强数据库系统可用性,可靠性,可扩展性等方面的改善,确保某集团各业 务系统运行稳定和数据安全.制订此规范。 2、范围 本规范适用于某集团所有信息系统。 3、数据库维护管理内容 数据库管理维护主要包含以下内容: 数据库用户以及权限的分配与维护 数据库的备份与恢复的设置和演练 数据库性能的定期巡检和优化 数据库高可用性,可扩展性架构方面的不断研究和应用 数据库方面新项目的可行性研究,根据预期规模确定合适架构 数据库系统包括整体架构的监控 不断学习和研究数据库领域最新技术,并适时投入应用 4、数据库的物理环境 数据的物理环境是指数据库(包括SQLServer、MySQL Server)所处的安装目录以及网络环境,数据库系统是整个业务系统的重要部分,在安 装初期就要考虑其所处的环境,以避免安全性和可维护性上的问题。 4.1、网络环境 对于数据库所处的网络环境,使用以下基本原则: 数据库服务器不使用公网IP地址。 局域网内若存在低速VPN环境,不可使用数据库的高可用方案,原则上不建议使用 镜像、复制等方案,但可考虑使用ServiceBroker(异步)方案。 除业务特殊要求外,原则上不使用数据库服务默认端口1443,新端口设置后必须 通知所有使用数据库的开发人员。 配置防火墙以开放SQLServer相应的服务端口。 4.2、目录设置 对于SQLServer的安装目录设置,使用以下基本原则: 用户数据库数据文件要与日志文件存放在不同的磁盘,主要针对业务比较繁忙的 用户数据库。 TempDB数据库要单独存放在1个或者2个磁盘驱动器上,主要针对业务比较繁忙的 服务器实例。 数据库安装后要设置本地备份目录,目录结构: 数据目录(或磁盘名)\实例名\数据库名\DayBak 数据目录(或磁盘名)\实例名\数据库名\WeekBak 数据目录(或磁盘名)\实例名\数据库名\MonthBak 数据目录(或磁盘名)\实例名\数据库名\YearBak 若没有新增数据库实例则省略,保存备份的数据目录大小至少保证是数据库大小的 10倍以上,或者至少保证能保留一周的备份文件。 "数据库系统 "描述 "存放位置 "文件夹名称 " "SQL Server "数据库程序文件 "第二个盘符 "Microsoft SQL Server " " "默认数据库文件 "第二个盘符(如"SQLServer DB " " " "采用SAN存储则 " " " " "为第三个盘符)" " " "应用数据库文件 " "(应用描述)DB,如HotelD" " " " "B " "MySQL Server"数据库程序文件 "第二个盘符 "MySQL Server " " "数据库文件 "与数据文件同一"Data " " " "盘符 " " "其它 "- "- "- " 表一:数据库文件存放规范 "数据库系统 "存放位置 "一级目录 "二级目录 " "SQL Server "第二个盘符("(应用描述)DB_Bak "DayBackup(日备份) " " "如采用SAN存 ",如HotelDB_Bak " " " "储则为第三个" " " " "盘符) " " " " " " "WeekBackup(周备份) " " " " "MonthBackup(月备份) " " " " "YearBackup(年备份) " " " " "DBDataBackup(数据文件 " " " " "备份) " "MySQL "第二个盘符("(应用描述)DB_Bak " " "Server "如采用SAN存 ",如SangemWebDB_B"按日期建立备份文件,备 " " "储则为第三个"ak "份命令脚本:mysqldump -" " "盘符) " "-uroot -proot -R " " " " "DBname>F:\ " " " " "SangemWebDB_Bak\2011082" " " " "4.sql(编写Bat文件,建 " " " " "立计划任务进行定时备份 " " " " "数据文件) " 表二:数据库备份文件存放规范 4.3、文件设置 文件设置是建立数据库时的数据文件设置,可按照以下原则建立: 对于超过10G以上的用户数据库,数据文件的数目和服务器CPU数目一致(CPU数目 指逻辑CPU数目)。 对于10G以下的用户数据库,使用单一数据文件。 日志文件使用一个,所有类型的数据库日志文件都要保证是一个。 多个数据文件的数据库,数据文件的大小要保持一致。 对于用户访问量较大,数据较大的数据库,需要对tempdb数据库增加数据文件的 数目,设置为CPU数目的1/2。 4.4、数

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧