如何在晚上的特定时间运行SQL Profiler Trace?

当需要从早上3:00到3:30捕获问题时,如何运行SQL事件探查器跟踪? 可以使用服务器端跟踪来完成此操作,但这非常不方便。 这并不困难,但不舒服,而且总是懒惰。 最终,我决定彻底实现此自动化。 像这样:



顺便说一下,这里的Jenkins是完全可选的,仅用作调用具有必要参数的脚本的接口:



我将大步展示该解决方案,无论如何,有很多与我们的基础架构相关的细节。 也就是说,我将执行左侧显示的操作:



因此,bat文件会执行某些操作,并将动作已转移到PowerShell脚本,该脚本将传递所有参数以及从Jenkins接收的另外两个变量-'%BUILD_USER_ID%','%BUILD_USER_EMAIL%'。 它们将在以后对我们有用:



奇怪的是,在ps1本身中并没有发生什么真正有价值的事情:在其中调用了某个过程,该过程通过将放置此文件的服务器名称在特殊共享上创建并返回目录的名称。 将在其中创建此目录的服务器取决于将在其上启动跟踪的服务器所在的数据中心。 此外,授予用户读取跟踪的权限,并且有一个过程可以在几天内清除这些目录。 如您所见,您可能不需要它,并且可以安全地跳过所有这些。

现在,该操作已通过SQL文件传输到将启动跟踪的服务器。 loc只是一个参数,其中包含完成的跟踪将被复制到的路径。 您可以将其替换为常量。



首先,我们需要找到一个在本地写入跟踪文件的位置。 例如,像这样:



接下来,清洗一下。 突然这样的文件已经存在,还是有人更早地运行了跟踪? 如果已经存在,您将需要运行sys.traces并停止/删除以%jenkinsTraceSch%写入的跟踪。 接下来,创建跟踪(限制其大小!),并使用sp_trace_setevent调用进行一些乏味的操作。 通过在事件和列之间进行CROSS JOIN,可以使您的生活更轻松:



现在添加过滤器进行品尝。 在这里,只要您完成猫头鹰。 这是我们使用脚本参数的第一个位置-过滤器类型和数据库名称:



现在重击发生了:



在@j中,您为Job形成一个命令,该命令将是:

  • 等待WAITFOR的正确时间
  • 运行轨道
  • 等待命令的时间
  • 停止比赛
  • 以防万一-异步操作
  • 组队将追踪复制到正确的位置
  • 带她出去
  • 表格主题和正文字母
  • 通过sp_send_dbmail向客户发送一封带有跟踪链接的信

现在,我们需要使用@j中所述的步骤1创建Job。 但是,我仍然为此工作添加了自杀,以使Joba在工作结束时消失得无影无踪:



在这里,我听到有关xp_cmdshell的尖叫声...我不想对此发表评论。 最后,没有人可以在法庭上作不利于自己的证词。 但是您可以选择其他方式。 您不太可能通过邮件发送跟踪-这很大。 虽然可以打包。 好吧,要么将其留在服务器本身上,然后允许用户自己拾起它,要么通过UNC将其拉到用户可访问的位置

所以你有:

  • 詹金斯称蝙蝠
  • 蝙蝠叫powershell
  • Powershell通过sqlcmd调用SQL脚本
  • 脚本创建作业
  • Job在自杀前创建了一个跟踪并发送邮件:

我永远也不会想到这么长的链条会奏效。 但这有效...



PS:是的,即使xp_cmdshell被禁止并且您不能启用它,您也至少有2种方法来编写my_xp_cmdshell。 因此,这种“保护”并不能防止任何事情。

Source: https://habr.com/ru/post/zh-CN431142/


All Articles