楼主: Cherish_j_wang

[精华] MSSQL DBA 精华总结[处理对象名称中特殊字符]

[复制链接]
论坛徽章:
3
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212013年新春福章
日期:2013-02-25 11:02:122013年新春福章
日期:2013-02-25 14:51:24
121#
发表于 2013-2-19 23:28 | 只看该作者

使用道具 举报

回复
论坛徽章:
37
2014年世界杯参赛球队:墨西哥
日期:2015-05-19 13:12:21懒羊羊
日期:2015-03-20 13:29:14美羊羊
日期:2015-03-21 08:13:58ITPUB长老会成员
日期:2015-05-07 15:11:10秀才
日期:2015-07-29 15:08:59
122#
发表于 2013-2-21 13:30 | 只看该作者
感谢分享

使用道具 举报

回复
论坛徽章:
1
ITPUB社区12周年站庆徽章
日期:2013-08-20 11:30:11
123#
发表于 2013-2-27 23:00 | 只看该作者
谢谢楼主的技术分享!

使用道具 举报

回复
论坛徽章:
3
2013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:排球
日期:2013-04-11 18:16:37ITPUB社区千里马徽章
日期:2013-06-09 10:15:34
124#
发表于 2013-8-4 21:44 | 只看该作者

使用道具 举报

回复
论坛徽章:
0
125#
发表于 2013-12-3 13:05 | 只看该作者
支持技术分享

使用道具 举报

回复
论坛徽章:
1
生肖徽章2007版:兔
日期:2011-01-20 12:58:49
126#
发表于 2013-12-27 13:55 | 只看该作者
这才是技术牛人的特征,比某些个老男人请多了 -- 分享点资料还吱吱扭扭,不点名了:)

使用道具 举报

回复
论坛徽章:
17
授权会员
日期:2005-10-30 17:05:33慢羊羊
日期:2015-03-04 14:19:44马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:112013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:篮球
日期:2012-11-05 16:49:01ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41ERP板块每日发贴之星
日期:2011-07-20 01:01:012011新春纪念徽章
日期:2011-02-18 11:43:32
127#
发表于 2014-1-19 20:31 | 只看该作者
本帖最后由 paulchan 于 2014-1-19 22:44 编辑

好文章,向无私奉献的兄弟们致敬!! 谢谢分享!

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
128#
 楼主| 发表于 2014-1-22 13:51 | 只看该作者

MSSQL DBA 精华总结 [使用SQL脚本部署Windows性能监视器]

本帖最后由 Cherish_j_wang 于 2014-1-23 13:22 编辑

MSSQL DBA 精华总结
                        之使用SQL脚本部署Windows性能监视器
背景
DBA团队管理着成百上千的数据库服务器(当然这里谈的是基于Windows平台的SQL Server数据库),某一天老大突然“命令”你说“把那十几个XXX服务器未来几天的Windows性能搜集给我看看”。当接到这个命令的时候,你会怎么做?
方法一.
         1.傻傻的RDP到每台Windows打开性能监视器,设置主要的性能指标,然后跑起来
         2.几天以后,再次傻傻的RDP到几十台Server,停止性能监视器
         3.傻傻的把每个Server的监控到的文件Copy出来统计

方法二.
         我们是不是可以有一种简单的方法?这个方法只需要我在SQL Server SSMS跑一段语句,Windows就可以乖乖的部署好一个性能监视器,并且在指定的时间停止?再加上SQL Server 2008以后的SSMS支持服务器组执行SQL 语句,也就是说只要SQL脚本准备好了,我可以分分钟搞定Windows性能监视器的部署。


脚本附件
     好了,我们这里要讲的当然是简单的方法二,这个是经过工作场景测试盒经常使用的脚本总结。语句如下:
  1. set nocount on
  2. declare
  3.         @file_max_size_mb varchar(8)

  4.         ,@perfmon_folder_path sysname

  5.         --counter conf file info
  6.         ,@counter_conf_file_name sysname
  7.         ,@perf_counts_string varchar(8000)

  8.         --data gather file info
  9.         ,@data_gather_bat_file_name sysname
  10.         ,@begin_time varchar(20)
  11.         ,@end_time varchar(20)

  12.         ,@data_gether_start_file_name sysname

  13.         ,@perfmon_data_file_name sysname
  14.         ,@perfmon_log_format varchar(10)
  15. ;

  16. select
  17.         @file_max_size_mb = '100'
  18.         ,@perfmon_folder_path = 'D:\DBA\perfmon\'--file root folder
  19.         ,@perfmon_log_format = 'bincirc'-- bin|bincirc|csv|tsv|sql
  20.         --data gather file info
  21.         ,@begin_time = ''                --format: M/d/yyyy hh:mm:ss [AM|PM];
  22.                                                                 --null/'': start next minute

  23.         ,@end_time = ''                        --format:M/d/yyyy hh:mm:ss [AM|PM];
  24.                                                                 --null/'': stop after starting 24 hours

  25.         --counter conf file info
  26.         ,@counter_conf_file_name = 'SQLTuning_counters.cfg.txt'
  27.         ,@data_gather_bat_file_name = 'step1.SQLTuning_data_gather.bat'
  28.         ,@data_gether_start_file_name = 'step2.perfmon_start_data_gather.bat'
  29.         ,@perfmon_data_file_name = 'perfmon_data'
  30.         ,@perf_counts_string = '"\Processor(_Total)\% Processor Time"
  31. "\SQLServer:Broker Statistics\Enqueued Transport Msgs/sec"
  32. "\SQLServer:Broker Statistics\Enqueued TransmissionQ Msgs/sec"
  33. "\PhysicalDisk(_Total)\Avg. Disk Queue Length"
  34. "\PhysicalDisk(_Total)\Disk Read Bytes/sec"
  35. "\PhysicalDisk(_Total)\Disk Write Bytes/sec"
  36. "\SQLServer:SQL Statistics\Batch Requests/sec"'
  37. ;


  38. declare
  39.         @current_time datetime
  40. ;
  41. select
  42.         @current_time = GETDATE()
  43. ;

  44. if         ISNULL(@begin_time,'')         = ''
  45. set
  46.         @begin_time = convert(varchar,@current_time,101) + ' ' + convert(char(5),DATEADD(minute,1,@current_time),114)
  47. ;        

  48. if isnull(@end_time,'') = ''
  49. set
  50.         @end_time = convert(varchar,dateadd(day,1,@begin_time),101) + ' ' + convert(char(5),dateadd(day,1,@begin_time),114)
  51. ;

  52. ---------checking drivers capacity on server
  53. if object_id('tempdb..#drives','U') is not null
  54.         drop table #drives
  55. create table #drives
  56. (
  57.         id int identity(1,1) not null primary key
  58.         ,drive  varchar(2)
  59.         ,free_Mb int
  60. )
  61. ;
  62. insert into #drives
  63. exec sys.xp_fixeddrives

  64. --driver's capacity should be double of @file_max_size_mb
  65. if not exists( --if the driver's capacity is less than size double of @file_max_size_mb
  66.         select top 1 1
  67.         from #drives
  68.         where drive = left(@perfmon_folder_path,1)
  69.         and free_Mb > cast(@file_max_size_mb as int) * 2
  70. )
  71. begin
  72.         declare
  73.                 @drives varchar(2)
  74.         ;
  75.         select top 1 @drives = drive        --choice another drivers
  76.         from #drives
  77.         where free_Mb > cast(@file_max_size_mb as int) * 2
  78.         order by free_Mb desc
  79.         
  80.         if @drives is null        --if there is no another drives, choice C driver
  81.         begin
  82.                 set
  83.                         @drives = 'C'
  84.                 ;
  85.                 raiserror('file should be saved into C driver',10,1) with nowait
  86.         end

  87.         set
  88.                 @perfmon_folder_path = @drives + right(@perfmon_folder_path, len(@perfmon_folder_path)-1)
  89.         ;
  90. end


  91. --in order to keep folder identical:
  92. set
  93.         @perfmon_folder_path = @perfmon_folder_path + replace(newid(),'-','') + '\'
  94. ;

  95. --print @perfmon_folder_path
  96. --create folder
  97. exec sys.xp_create_subdir @perfmon_folder_path
  98. --raiserror('%s',10,1,@perfmon_folder_path) with nowait

  99. declare
  100.         @sql varchar(8000)
  101.         ,@fileid int
  102.         ,@command varchar(2000)
  103. ;

  104. select
  105.         @sql = ''
  106.         ,@fileid = 0
  107.         ,@command = ''

  108.         ,@perfmon_folder_path = quotename(@perfmon_folder_path,'"')
  109.         ,@data_gather_bat_file_name = @perfmon_folder_path + @data_gather_bat_file_name
  110.         ,@data_gether_start_file_name = @perfmon_folder_path + @data_gether_start_file_name

  111.         ,@perf_counts_string = '<V><![CDATA[' + replace(
  112.                                                                                                 replace(
  113.                                                                                                                         replace(
  114.                                                                                                                                                 @perf_counts_string,CHAR(10),']]></V><V><![CDATA['
  115.                                                                                                                                         ),',',']]></V><V><![CDATA['
  116.                                                                                                                 ),CHAR(13),']]></V><V><![CDATA['
  117.                                                                                           ) + ']]></V>'
  118. ;

  119. --===============================generate counters configure file
  120. if object_id('tempdb..#temp','U') is not null
  121.         drop table #temp
  122. create table #temp
  123. (
  124.         id int identity(1,1) not null primary key
  125.         ,fileid  int
  126.         ,command varchar(8000) null
  127. )
  128. ;

  129. ;WITH data
  130. AS (
  131.         SELECT cast(@perf_counts_string AS XML) as c
  132. )
  133. INSERT INTO #temp
  134. SELECT
  135.         fileid = 1
  136.         ,command =  T.C.value('(./text())[1]','sysname')
  137. FROM data as a
  138. CROSS APPLY C.nodes('./V') AS T(C)
  139. --===============================end generate counters configure file

  140. --===============================generate data gather bat
  141. ;with DATA
  142. AS(
  143. SELECT         fileid = 2        ,command =  '@echo off'
  144. union all
  145. SELECT         fileid = 2        ,command =  '::#####setlocal enabledelayedexpansion'
  146. union all
  147. SELECT         fileid = 2        ,command =  'setlocal enabledelayedexpansion'
  148. union all
  149. SELECT         fileid = 2        ,command =  '::variables'
  150. union all
  151. SELECT         fileid = 2        ,command =  'set path_root=.'
  152. union all
  153. SELECT         fileid = 2        ,command =  'set file=%path_root%\' + @perfmon_data_file_name
  154. union all
  155. SELECT         fileid = 2        ,command =  'set cfg_file=' + @counter_conf_file_name
  156. union all
  157. SELECT         fileid = 2        ,command =  'Logman delete PERFMON_BASE'
  158. union all
  159. SELECT         fileid = 2        ,command =  'logman create counter PERFMON_BASE' + case
  160.                                                                                                                                                 when @begin_time = '' then ''
  161.                                                                                                                                                 when @begin_time is null then ''
  162.                                                                                                                                                 else  ' -b ' + @begin_time
  163.                                                                                                                                           end
  164.                                                                                                                                          + case
  165.                                                                                                                                                 when @end_time = '' then ''
  166.                                                                                                                                                 when @end_time is null then ''
  167.                                                                                                                                                 else  + ' -e ' + @end_time
  168.                                                                                                                                           end + ' -f ' + @perfmon_log_format + ' -max ' + @file_max_size_mb + ' -si 00:00:05 --v -o "%file%" -cf "%path_root%\%cfg_file%"'
  169. union all
  170. SELECT         fileid = 2        ,command =  'timeout /t 5'
  171. )
  172. INSERT INTO #temp
  173. SELECT * from DATA
  174. --===============================end generate data gather bat

  175. --===============================generate start bat file
  176. ;with DATA
  177. AS(
  178. SELECT         fileid = 3        ,command =  '@echo off'
  179. union all
  180. SELECT         fileid = 3        ,command =  'title User defined DCT starting...'
  181. union all
  182. SELECT         fileid = 3        ,command =  'logman start perfmon_base'
  183. union all
  184. SELECT         fileid = 3        ,command =  'echo started.'
  185. union all
  186. SELECT         fileid = 3        ,command =  'timeout /t 5'
  187. )
  188. INSERT INTO #temp
  189. SELECT * from DATA
  190. --===============================end generate start bat file

  191. set
  192.         @counter_conf_file_name = @perfmon_folder_path + @counter_conf_file_name
  193. ;

  194. declare cur_command cursor local static forward_only read_only
  195. for
  196. select fileid,command
  197. from #temp
  198. where command is not null

  199. open cur_command
  200. fetch next from cur_command into @fileid, @command
  201. while(@@FETCH_STATUS = 0)
  202. begin
  203.         set
  204.                 @sql = 'echo ' + @command + '>> ' + case @fileid
  205.                                                                                                 when 1 then @counter_conf_file_name
  206.                                                                                                 when 2 then @data_gather_bat_file_name
  207.                                                                                                 when 3 then @data_gether_start_file_name
  208.                                                                                                 else ''
  209.                                                                                         end
  210.         ;

  211.         --echo to files
  212.         --print @sql
  213.         exec sys.xp_cmdshell @sql, no_output
  214.         fetch next from cur_command into @fileid, @command
  215. end

  216. close cur_command
  217. deallocate cur_command

  218. --===============================data collection instance deployment
  219. set
  220.         @sql = 'cd /d '+ @perfmon_folder_path +' & ' + @data_gather_bat_file_name
  221. ;
  222. --print @sql
  223. exec sys.xp_cmdshell @sql

  224. --===============================output info
  225. select
  226.         begin_time = @begin_time
  227.         ,end_time = @end_time
  228.         ,perfmon_start_command = 'exec sys.xp_cmdshell ''logman start perfmon_base'''
  229.         ,perfmon_stop_command = 'exec sys.xp_cmdshell ''logman stop perfmon_base'''
  230.         ,perfmon_delete_command = 'exec sys.xp_cmdshell ''Logman delete PERFMON_BASE'''
  231.         ,perfmon_data_file = replace(@perfmon_folder_path,'"','') + @perfmon_data_file_name + '.' + @perfmon_log_format
  232. ;
复制代码
当然把附件也放到这里,省的大家在Copy。
perfmon.sql (8.05 KB, 下载次数: 31)

参数解释

@file_max_size_mb : 性能监视器生成的文件最大大小,超过这个值就会停止
,@perfmon_folder_path  : 文件路径目录
,@perfmon_log_format  : 生成的文件格式
,@begin_time : 性能监视器开始抓取的时间,如果为null或者‘’,则在下一分钟开始
,@end_time : 性能监视器停止抓取的时间,如果文件大小未超过@file_max_size_mb,默认则在24小时候停止
,@counter_conf_file_name : 可以保持默认
,@data_gather_bat_file_name : 可以保持默认
,@data_gether_start_file_name : 可以保持默认
,@perfmon_data_file_name : 可以保持默认
,@perf_counts_string : 性能监视器counter,这个自己喜欢抓哪些就抓哪些,按照上面的格式设置即可


结语
性能监视器部署好了以后,抓取到的文件读取是我们接下来要完成的工作,这部分我们下次再写。

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
129#
 楼主| 发表于 2014-1-22 13:56 | 只看该作者
paulchan 发表于 2014-1-19 20:31
好文章,向无私奉献的兄弟们致敬!! 谢谢分享!

其实也是对自己工作内容的一次梳理和再总结,还是比较有意思的。尤其是看到那么多热心朋友的回复,希望对大家有帮助

使用道具 举报

回复
论坛徽章:
14
迷宫蛋
日期:2012-03-13 09:50:292014年新春福章
日期:2014-02-18 16:44:08优秀写手
日期:2013-12-18 09:29:15迷宫蛋
日期:2012-06-13 15:28:34咸鸭蛋
日期:2012-06-11 16:11:11灰彻蛋
日期:2012-05-31 10:18:54双黄蛋
日期:2012-05-28 17:45:17茶鸡蛋
日期:2012-05-28 17:27:32蜘蛛蛋
日期:2012-05-28 16:54:09迷宫蛋
日期:2012-05-17 19:00:48
130#
 楼主| 发表于 2014-1-22 13:56 | 只看该作者
cike5 发表于 2013-12-27 13:55
这才是技术牛人的特征,比某些个老男人请多了 -- 分享点资料还吱吱扭扭,不点名了:)

原来是来抱怨来了

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表