全网最长的sql server巡检脚本分享(1000行)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 全网最长的sql server巡检脚本分享(1000行)

一、说明:

此脚本基于2014进行编写的,sql server每个版本的函数基本都有变化,其他版本需要进行修改测试。大家可以根据官方的文章进行相应参数的修改。

官网地址:

https://learn.microsoft.com/zh-cn/previous-versions/sql/

二、脚本执行过程展示:

1、新建查询

2、复制脚本

3、点击执行

4、查看结果

我们可以看到执行成功了,结果栏是执行sql结果的展示,消息栏是执行的结果打印,当然也可以将结果进行另存留档。

三、脚本内容:

  1. print '----------------------------'
  2. print ' 开始巡检  '
  3. print '----------------------------'
  4. print '1.查看数据库版本信息             '
  5. print'----------------------------'
  6. print '*********************************'
  7. SET NOCOUNT ON;
  8. use master
  9. go
  10. print '                                '
  11. print @@version
  12. go
  13. print '                                                   '
  14. print '                                                   '
  15. select cast(serverproperty('productversion') as varchar(30)) as 产品版本号,
  16. cast(serverproperty('productlevel') as varchar(30)) as sp_level,
  17. cast(serverproperty('edition') as varchar(30)) as 版本
  18. go
  19. print '2.SQLSERVER 最大连接数             '
  20. print'----------------------------'
  21. print '*********************************'
  22. print '                                   '
  23. print @@max_connections
  24. go
  25. print '3.输出当前活跃的用户             '
  26. print'----------------------------'
  27. print '*********************************'
  28. SELECT * FROM sys.dm_exec_sessions WHERE is_user_process = 1;
  29. -- 关闭受影响的行数消息
  30. SET NOCOUNT ON;
  31. DECLARE @Result NVARCHAR(MAX) = ''
  32. DECLARE @session_id INT
  33. DECLARE @login_name NVARCHAR(128)
  34. DECLARE @host_name NVARCHAR(128)
  35. DECLARE @program_name NVARCHAR(128)
  36. DECLARE @status NVARCHAR(30)
  37. -- 游标遍历查询结果
  38. DECLARE session_cursor CURSOR FOR
  39. SELECT session_id, login_name, host_name, program_name, status
  40. FROM sys.dm_exec_sessions
  41. WHERE is_user_process = 1
  42. OPEN session_cursor
  43. FETCH NEXT FROM session_cursor INTO @session_id, @login_name, @host_name, @program_name, @status
  44. -- 打印列名作为标题行
  45. PRINT 'Session ID' + CHAR(9) + 'Login Name' + CHAR(9) + 'Host Name' + CHAR(9) + 'Program Name' + CHAR(9) + 'Status'
  46. WHILE @@FETCH_STATUS = 0
  47. BEGIN
  48.    -- 将每列结果拼接成字符串
  49.    SET @Result = CAST(@session_id AS NVARCHAR(10)) + CHAR(9) +
  50.                  @login_name + CHAR(9) +
  51.                  @host_name + CHAR(9) +
  52.                  @program_name + CHAR(9) +
  53.                  @status
  54.    -- 打印结果
  55.    PRINT @Result
  56.    -- 获取下一条记录
  57.    FETCH NEXT FROM session_cursor INTO @session_id, @login_name, @host_name, @program_name, @status
  58. END
  59. CLOSE session_cursor
  60. DEALLOCATE session_cursor
  61. -- 恢复默认行为(显示受影响的行数消息)
  62. SET NOCOUNT OFF;
  63. print '4.查看所有数据库名称及大小             '
  64. print'----------------------------'
  65. print '*********************************'
  66. exec sp_helpdb
  67. -- 关闭受影响的行数消息
  68. SET NOCOUNT ON;
  69. -- 创建临时表来捕获存储过程的输出
  70. CREATE TABLE #HelpDbResult2 (
  71.    name NVARCHAR(128),
  72.    db_size NVARCHAR(50),
  73.    owner NVARCHAR(128),
  74.    dbid SMALLINT,
  75.    created DATETIME,
  76.    status NVARCHAR(512),
  77.    compatibility_level TINYINT
  78. );

  79. -- 将存储过程的输出插入到临时表
  80. INSERT INTO #HelpDbResult2
  81. EXEC sp_helpdb;
  82. DECLARE @name NVARCHAR(128)
  83. DECLARE @db_size NVARCHAR(50)
  84. DECLARE @owner NVARCHAR(128)
  85. DECLARE @dbid SMALLINT
  86. DECLARE @created DATETIME
  87. DECLARE @status1 NVARCHAR(512)
  88. DECLARE @compatibility_level TINYINT
  89. -- 游标遍历临时表中的结果
  90. DECLARE helpdb_cursor CURSOR FOR
  91. SELECT name, db_size, owner, dbid, created, status, compatibility_level
  92. FROM #HelpDbResult2;
  93. OPEN helpdb_cursor;
  94. FETCH NEXT FROM helpdb_cursor INTO @name, @db_size, @owner, @dbid, @created, @status1, @compatibility_level;
  95. -- 打印列名作为标题行
  96. PRINT 'Database Name' + CHAR(9) + 'Size' + CHAR(9) + 'Owner' + CHAR(9) + 'Database ID' + CHAR(9) + 'Created' + CHAR(9) + 'Status' + CHAR(9) + 'Compatibility Level'
  97. -- 打印每行数据
  98. WHILE @@FETCH_STATUS = 0
  99. BEGIN
  100.    -- 将每列结果拼接成字符串
  101.    PRINT @name + CHAR(9) + @db_size + CHAR(9) + @owner + CHAR(9) + CAST(@dbid AS NVARCHAR(10)) + CHAR(9) + CAST(@created AS NVARCHAR(20)) + CHAR(9) + @status + CHAR(9) + CAST(@compatibility_level AS NVARCHAR(3))
  102.    -- 获取下一条记录
  103.    FETCH NEXT FROM helpdb_cursor INTO @name, @db_size, @owner, @dbid, @created, @status1, @compatibility_level;
  104. END
  105. CLOSE helpdb_cursor;
  106. DEALLOCATE helpdb_cursor;
  107. -- 删除临时表
  108. DROP TABLE #HelpDbResult2;
  109. -- 恢复默认行为(显示受影响的行数消息)
  110. SET NOCOUNT OFF;
  111. print '5.查看数据库所在机器的操作系统参数             '
  112. print'----------------------------'
  113. print '*********************************'
  114. -- 关闭受影响的行数消息
  115. SET NOCOUNT ON;
  116. exec master..xp_msver
  117. -- 创建临时表来捕获存储过程的输出结果
  118. CREATE TABLE #XpMsverResult (
  119.    idx INT,
  120.    name NVARCHAR(128),
  121.    internal_value INT,
  122.    character_value NVARCHAR(256)
  123. );
  124. -- 将存储过程的输出插入到临时表中
  125. INSERT INTO #XpMsverResult (idx, name, internal_value, character_value)
  126. EXEC master..xp_msver;
  127. DECLARE @idx INT
  128. DECLARE @name2 NVARCHAR(128)
  129. DECLARE @internal_value INT
  130. DECLARE @character_value NVARCHAR(256)
  131. DECLARE @Result4 NVARCHAR(MAX)
  132. -- 游标遍历临时表中的结果
  133. DECLARE xpmsver_cursor CURSOR FOR
  134. SELECT idx, name, internal_value, character_value
  135. FROM #XpMsverResult;
  136. OPEN xpmsver_cursor;
  137. FETCH NEXT FROM xpmsver_cursor INTO @idx, @name2, @internal_value, @character_value;
  138. -- 打印列名作为标题行
  139. PRINT 'Idx' + REPLICATE(' ', 6 - LEN('Idx')) +
  140.      'Name' + REPLICATE(' ', 30 - LEN('Name')) +
  141.      'Internal Value' + REPLICATE(' ', 20 - LEN('Internal Value')) +
  142.      'Character Value'
  143. -- 打印每行数据
  144. WHILE @@FETCH_STATUS = 0
  145. BEGIN
  146.    -- 将每列结果拼接成字符串
  147.    SET @Result4 =
  148.        CAST(@idx AS NVARCHAR(10)) + REPLICATE(' ', 6 - LEN(CAST(@idx AS NVARCHAR(10)))) +
  149.        ISNULL(@name2, '') + REPLICATE(' ', 30 - LEN(ISNULL(@name2, ''))) +
  150.        ISNULL(CAST(@internal_value AS NVARCHAR(10)), '') + REPLICATE(' ', 20 - LEN(ISNULL(CAST(@internal_value AS NVARCHAR(10)), ''))) +
  151.        ISNULL(@character_value, '')
  152.    -- 打印结果
  153.    PRINT @Result
  154.    -- 获取下一条记录
  155.    FETCH NEXT FROM xpmsver_cursor INTO @idx, @name2, @internal_value, @character_value;
  156. END
  157. CLOSE xpmsver_cursor;
  158. DEALLOCATE xpmsver_cursor;
  159. -- 删除临时表
  160. DROP TABLE #XpMsverResult;
  161. -- 恢复默认行为(显示受影响的行数消息)
  162. SET NOCOUNT OFF;

  163. print '6.查看数据库启动的参数             '
  164. print'----------------------------'
  165. print '*********************************'
  166. -- 关闭受影响的行数消息
  167. SET NOCOUNT ON;
  168. SELECT
  169. name,value,value_in_use
  170. FROM
  171.    sys.configurations
  172. WHERE
  173.    configuration_id IN (
  174.        SELECT
  175.            configuration_id
  176.        FROM
  177.            sys.configurations
  178.        WHERE
  179.            name LIKE '%recovery%' OR
  180.            name LIKE '%memory%' OR
  181.            name LIKE '%max degree of parallelism%' OR
  182.            name LIKE '%cost threshold for parallelism%'
  183.    )
  184. order by configuration_id
  185. Go
  186. -- 创建临时表来捕获查询结果
  187. CREATE TABLE #ConfigurationsResult (
  188.    name NVARCHAR(128),
  189.    value SQL_VARIANT,
  190.    value_in_use SQL_VARIANT
  191. );
  192. -- 将查询结果插入到临时表中
  193. INSERT INTO #ConfigurationsResult (name, value, value_in_use)
  194. SELECT
  195.    name, value, value_in_use
  196. FROM
  197.    sys.configurations
  198. WHERE
  199.    configuration_id IN (
  200.        SELECT
  201.            configuration_id
  202.        FROM
  203.            sys.configurations
  204.        WHERE
  205.            name LIKE '%recovery%' OR
  206.            name LIKE '%memory%' OR
  207.            name LIKE '%max degree of parallelism%' OR
  208.            name LIKE '%cost threshold for parallelism%'
  209.    )
  210. ORDER BY configuration_id;
  211. DECLARE @name3 NVARCHAR(128)
  212. DECLARE @value5 SQL_VARIANT
  213. DECLARE @value_in_use SQL_VARIANT
  214. DECLARE @Result5 NVARCHAR(MAX)
  215. -- 游标遍历临时表中的结果
  216. DECLARE configurations_cursor CURSOR FOR
  217. SELECT name, value, value_in_use
  218. FROM #ConfigurationsResult;
  219. OPEN configurations_cursor;
  220. FETCH NEXT FROM configurations_cursor INTO @name3, @value5, @value_in_use;
  221. -- 打印列名作为标题行
  222. PRINT 'Name' + REPLICATE(' ', 50 - LEN('Name')) +
  223.      'Value' + REPLICATE(' ', 20 - LEN('Value')) +
  224.      'Value In Use'
  225. -- 打印每行数据
  226. WHILE @@FETCH_STATUS = 0
  227. BEGIN
  228.    -- 将每列结果拼接成字符串
  229.    SET @Result5 =
  230.        ISNULL(@name3, '') + REPLICATE(' ', 50 - LEN(ISNULL(@name3, ''))) +
  231.        CAST(ISNULL(@value5, '') AS NVARCHAR) + REPLICATE(' ', 20 - LEN(CAST(ISNULL(@value5, '') AS NVARCHAR))) +
  232.        CAST(ISNULL(@value_in_use, '') AS NVARCHAR)
  233.    -- 打印结果
  234.    PRINT @Result5
  235.    -- 获取下一条记录
  236.    FETCH NEXT FROM configurations_cursor INTO @name3, @value5, @value_in_use;
  237. END
  238. CLOSE configurations_cursor;
  239. DEALLOCATE configurations_cursor;
  240. -- 删除临时表
  241. DROP TABLE #ConfigurationsResult;
  242. -- 恢复默认行为(显示受影响的行数消息)
  243. SET NOCOUNT OFF;
  244. print '7.查看数据库启动时间             '
  245. print'----------------------------'
  246. print '*********************************'
  247. -- 关闭受影响的行数消息
  248. SET NOCOUNT ON;
  249. select convert(varchar(30),login_time,120)
  250. from master..sysprocesses where spid=1
  251. -- 创建临时表来捕获查询结果
  252. CREATE TABLE #SysProcessesResult (
  253.    login_time VARCHAR(30)
  254. );
  255. -- 将查询结果插入到临时表中
  256. INSERT INTO #SysProcessesResult (login_time)
  257. SELECT convert(varchar(30), login_time, 120)
  258. FROM master..sysprocesses
  259. WHERE spid = 1;
  260. DECLARE @login_time VARCHAR(30)
  261. DECLARE @Result3 NVARCHAR(MAX)
  262. -- 游标遍历临时表中的结果
  263. DECLARE sysprocesses_cursor CURSOR FOR
  264. SELECT login_time
  265. FROM #SysProcessesResult;
  266. OPEN sysprocesses_cursor;
  267. FETCH NEXT FROM sysprocesses_cursor INTO @login_time;
  268. -- 打印列名作为标题行
  269. PRINT 'Login Time' + REPLICATE(' ', 30 - LEN('Login Time'))
  270. -- 打印每行数据
  271. WHILE @@FETCH_STATUS = 0
  272. BEGIN
  273.    -- 将每列结果拼接成字符串
  274.    SET @Result3 = ISNULL(@login_time, '') + REPLICATE(' ', 30 - LEN(ISNULL(@login_time, '')))
  275.    -- 打印结果
  276.    PRINT @Result3
  277.    -- 获取下一条记录
  278.    FETCH NEXT FROM sysprocesses_cursor INTO @login_time;
  279. END
  280. CLOSE sysprocesses_cursor;
  281. DEALLOCATE sysprocesses_cursor;
  282. -- 删除临时表
  283. DROP TABLE #SysProcessesResult;
  284. -- 恢复默认行为(显示受影响的行数消息)
  285. SET NOCOUNT OFF;
  286. print '8.查看数据库服务器名             '
  287. print'----------------------------'
  288. print '*********************************'
  289. -- 关闭受影响的行数消息
  290. SET NOCOUNT ON;
  291. select 'Server Name:'+ltrim(@@servername)
  292. -- 创建临时表来捕获查询结果
  293. CREATE TABLE #ServerNameResult3 (
  294.    ServerInfo2 NVARCHAR(128)
  295. );
  296. -- 将查询结果插入到临时表中
  297. INSERT INTO #ServerNameResult3 (ServerInfo2)
  298. SELECT 'Server Name:' + LTRIM(@@servername);
  299. DECLARE @ServerInfo2 NVARCHAR(128)
  300. DECLARE @Result6 NVARCHAR(MAX)
  301. -- 游标遍历临时表中的结果
  302. DECLARE servername_cursor CURSOR FOR
  303. SELECT ServerInfo2
  304. FROM #ServerNameResult3;
  305. OPEN servername_cursor;
  306. FETCH NEXT FROM servername_cursor INTO @ServerInfo2;
  307. -- 打印列名作为标题行
  308. PRINT 'Server Information'
  309. -- 打印每行数据
  310. WHILE @@FETCH_STATUS = 0
  311. BEGIN
  312.    -- 将每列结果拼接成字符串并打印
  313.    PRINT ISNULL(@ServerInfo2, '')
  314.    -- 获取下一条记录
  315.    FETCH NEXT FROM servername_cursor INTO @ServerInfo2;
  316. END
  317. CLOSE servername_cursor;
  318. DEALLOCATE servername_cursor;
  319. -- 删除临时表
  320. DROP TABLE #ServerNameResult3;
  321. -- 恢复默认行为(显示受影响的行数消息)
  322. SET NOCOUNT OFF;
  323. print '9.查看数据库实例名             '
  324. print'----------------------------'
  325. print '*********************************'
  326. -- 关闭受影响的行数消息
  327. SET NOCOUNT ON;
  328. select 'Instance:'+ltrim(@@servicename)
  329. -- 创建临时表来捕获查询结果
  330. CREATE TABLE #InstanceResult (
  331.    InstanceInfo NVARCHAR(128)
  332. );
  333. -- 将查询结果插入到临时表中
  334. INSERT INTO #InstanceResult (InstanceInfo)
  335. SELECT 'Instance:' + LTRIM(@@servicename);
  336. DECLARE @InstanceInfo NVARCHAR(128)
  337. DECLARE @Result7 NVARCHAR(MAX)
  338. -- 游标遍历临时表中的结果
  339. DECLARE instance_cursor CURSOR FOR
  340. SELECT InstanceInfo
  341. FROM #InstanceResult;
  342. OPEN instance_cursor;
  343. FETCH NEXT FROM instance_cursor INTO @InstanceInfo;
  344. -- 打印列名作为标题行
  345. PRINT 'Instance Information'
  346. -- 打印每行数据
  347. WHILE @@FETCH_STATUS = 0
  348. BEGIN
  349.    -- 拼接字符串并打印结果
  350.    PRINT ISNULL(@InstanceInfo, '')
  351.    -- 获取下一条记录
  352.    FETCH NEXT FROM instance_cursor INTO @InstanceInfo;
  353. END
  354. CLOSE instance_cursor;
  355. DEALLOCATE instance_cursor;
  356. -- 删除临时表
  357. DROP TABLE #InstanceResult;
  358. -- 恢复默认行为(显示受影响的行数消息)
  359. SET NOCOUNT OFF;
  360. print '10.查看数据库磁盘空间信息             '
  361. print'----------------------------'
  362. print '*********************************'
  363. -- 关闭受影响的行数消息
  364. SET NOCOUNT ON;
  365. EXEC master.dbo.xp_fixeddrives
  366. -- 步骤1: 创建一个用于存储 xp_fixeddrives 结果的临时表
  367. CREATE TABLE #FixedDrives (
  368.    Drive CHAR(1),
  369.    FreeSpaceMB INT
  370. );
  371. INSERT INTO #FixedDrives (Drive, FreeSpaceMB)
  372. EXEC master.dbo.xp_fixeddrives;
  373. DECLARE @Drive CHAR(1);
  374. DECLARE @FreeSpaceMB INT;
  375. DECLARE @ResultString NVARCHAR(MAX) = 'Drive | Free Space (MB)' + CHAR(13) + CHAR(10) + '-------------------------';
  376. DECLARE drive_cursor CURSOR FOR
  377. SELECT Drive, FreeSpaceMB FROM #FixedDrives;
  378. OPEN drive_cursor;
  379. FETCH NEXT FROM drive_cursor INTO @Drive, @FreeSpaceMB;
  380. WHILE @@FETCH_STATUS = 0
  381. BEGIN
  382.    SET @ResultString = @ResultString + CHAR(13) + CHAR(10) + @Drive + ' | ' + CAST(@FreeSpaceMB AS NVARCHAR(50));
  383.    FETCH NEXT FROM drive_cursor INTO @Drive, @FreeSpaceMB;
  384. END
  385. CLOSE drive_cursor;
  386. DEALLOCATE drive_cursor;
  387. -- 打印结果字符串
  388. PRINT @ResultString;
  389. DROP TABLE #FixedDrives;
  390. SET NOCOUNT OFF;
  391. print '11.日志文件大小及使用情况             '
  392. print'----------------------------'
  393. print '*********************************'
  394. SET NOCOUNT ON;
  395. dbcc sqlperf(logspace)
  396. -- 步骤: 创建一个用于存储 DBCC SQLPERF(logspace) 结果的临时表
  397. CREATE TABLE #LogSpace (
  398.    DatabaseName VARCHAR(128),
  399.    LogSizeMB FLOAT,
  400.    LogSpaceUsedPct FLOAT,
  401.    Status INT
  402. );
  403. -- 打印正在执行的脚本
  404. -- 步骤: DBCC SQLPERF(logspace) 的结果插入到临时表中
  405. INSERT INTO #LogSpace (DatabaseName, LogSizeMB, LogSpaceUsedPct, Status)
  406. EXEC ('DBCC SQLPERF(logspace) WITH NO_INFOMSGS');
  407. -- 步骤: 查询并生成结果字符串
  408. DECLARE @DatabaseName VARCHAR(128);
  409. DECLARE @LogSizeMB FLOAT;
  410. DECLARE @LogSpaceUsedPct FLOAT;
  411. DECLARE @Status INT;
  412. DECLARE @ResultString1 NVARCHAR(MAX) = 'DatabaseName | LogSizeMB | LogSpaceUsedPct | Status' + CHAR(13) + CHAR(10) + '---------------------------------------------------';
  413. DECLARE logspace_cursor CURSOR FOR
  414. SELECT DatabaseName, LogSizeMB, LogSpaceUsedPct, Status FROM #LogSpace;
  415. OPEN logspace_cursor;
  416. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPct, @Status;
  417. WHILE @@FETCH_STATUS = 0
  418. BEGIN
  419.    SET @ResultString = @ResultString1 + CHAR(13) + CHAR(10) + @DatabaseName + ' | ' + CAST(@LogSizeMB AS NVARCHAR(50)) + ' | ' + CAST(@LogSpaceUsedPct AS NVARCHAR(50)) + ' | ' + CAST(@Status AS NVARCHAR(50));
  420.    FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPct, @Status;
  421. END
  422. CLOSE logspace_cursor;
  423. DEALLOCATE logspace_cursor;
  424. -- 打印结果字符串
  425. PRINT @ResultString;
  426. -- 步骤: 删除临时表
  427. DROP TABLE #LogSpace;
  428. SET NOCOUNT OFF;
  429. print '12.表的磁盘空间使用信息             '
  430. print'----------------------------'
  431. print '*********************************'
  432. SET NOCOUNT ON;
  433. -- 打印正在执行的脚本
  434. PRINT 'Executing: SELECT @@total_read [读取磁盘次数], @@total_write [写入磁盘次数], @@total_errors [磁盘写入错误数], GETDATE() [当前时间]';
  435. -- 步骤1: 创建一个用于存储查询结果的临时表
  436. CREATE TABLE #DiskStats (
  437.    TotalRead INT,
  438.    TotalWrite INT,
  439.    TotalErrors INT,
  440.    CurrentTime DATETIME
  441. );
  442. -- 步骤2: 执行查询并将结果插入到临时表中
  443. INSERT INTO #DiskStats (TotalRead, TotalWrite, TotalErrors, CurrentTime)
  444. SELECT @@total_read, @@total_write, @@total_errors, GETDATE();
  445. -- 步骤3: 查询并生成结果字符串
  446. DECLARE @TotalRead INT;
  447. DECLARE @TotalWrite INT;
  448. DECLARE @TotalErrors INT;
  449. DECLARE @CurrentTime DATETIME;
  450. DECLARE @ResultString4 NVARCHAR(MAX);
  451. DECLARE diskstats_cursor CURSOR FOR
  452. SELECT TotalRead, TotalWrite, TotalErrors, CurrentTime FROM #DiskStats;
  453. OPEN diskstats_cursor;
  454. FETCH NEXT FROM diskstats_cursor INTO @TotalRead, @TotalWrite, @TotalErrors, @CurrentTime;
  455. WHILE @@FETCH_STATUS = 0
  456. BEGIN
  457.    -- 初始化结果字符串
  458.    SET @ResultString4 = '读取磁盘次数 | 写入磁盘次数 | 磁盘写入错误数 | 当前时间' + CHAR(13) + CHAR(10) + '---------------------------------------------------' + CHAR(13) + CHAR(10);
  459.    -- 拼接结果字符串
  460.    SET @ResultString4 = @ResultString4 + CAST(@TotalRead AS NVARCHAR(50)) + ' | ' + CAST(@TotalWrite AS NVARCHAR(50)) + ' | ' + CAST(@TotalErrors AS NVARCHAR(50)) + ' | ' + CAST(@CurrentTime AS NVARCHAR(50));
  461.    FETCH NEXT FROM diskstats_cursor INTO @TotalRead, @TotalWrite, @TotalErrors, @CurrentTime;
  462. END
  463. CLOSE diskstats_cursor;
  464. DEALLOCATE diskstats_cursor;
  465. -- 打印结果字符串
  466. PRINT @ResultString4;
  467. -- 步骤4: 删除临时表
  468. DROP TABLE #DiskStats;
  469. SET NOCOUNT OFF;
  470. print '13.获取I/O工作情况             '
  471. print'----------------------------'
  472. print '*********************************'
  473. SET NOCOUNT ON;
  474. select * from sys.dm_os_wait_stats
  475. -- 创建用于存储查询结果的临时表
  476. CREATE TABLE #WaitStats (
  477.    wait_type NVARCHAR(60),
  478.    waiting_tasks_count BIGINT,
  479.    wait_time_ms BIGINT,
  480.    max_wait_time_ms BIGINT,
  481.    signal_wait_time_ms BIGINT
  482. );
  483. -- 执行查询并将结果插入到临时表中
  484. INSERT INTO #WaitStats (wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms)
  485. SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms
  486. FROM sys.dm_os_wait_stats;
  487. -- 声明变量用于存储每列的数据
  488. DECLARE @wait_type NVARCHAR(60);
  489. DECLARE @waiting_tasks_count BIGINT;
  490. DECLARE @wait_time_ms BIGINT;
  491. DECLARE @max_wait_time_ms BIGINT;
  492. DECLARE @signal_wait_time_ms BIGINT;
  493. DECLARE @ResultString6 NVARCHAR(MAX);
  494. -- 初始化结果字符串的标题
  495. SET @ResultString6 = 'Wait Stats:' + CHAR(13) + CHAR(10) +
  496.                    'wait_type | waiting_tasks_count | wait_time_ms | max_wait_time_ms | signal_wait_time_ms' + CHAR(13) + CHAR(10) +
  497.                    '-------------------------------------------------------------------------------';
  498. -- 声明游标
  499. DECLARE waitstats_cursor CURSOR FOR
  500. SELECT wait_type, waiting_tasks_count, wait_time_ms, max_wait_time_ms, signal_wait_time_ms FROM #WaitStats;
  501. -- 打开游标
  502. OPEN waitstats_cursor;
  503. -- 获取游标中的每一行数据并拼接到结果字符串中
  504. FETCH NEXT FROM waitstats_cursor INTO @wait_type, @waiting_tasks_count, @wait_time_ms, @max_wait_time_ms, @signal_wait_time_ms;
  505. WHILE @@FETCH_STATUS = 0
  506. BEGIN
  507.    SET @ResultString6 = @ResultString + CHAR(13) + CHAR(10) +
  508.                        @wait_type + ' | ' +
  509.                        CAST(@waiting_tasks_count AS NVARCHAR(50)) + ' | ' +
  510.                        CAST(@wait_time_ms AS NVARCHAR(50)) + ' | ' +
  511.                        CAST(@max_wait_time_ms AS NVARCHAR(50)) + ' | ' +
  512.                        CAST(@signal_wait_time_ms AS NVARCHAR(50));
  513.    FETCH NEXT FROM waitstats_cursor INTO @wait_type, @waiting_tasks_count, @wait_time_ms, @max_wait_time_ms, @signal_wait_time_ms;
  514. END
  515. -- 关闭游标
  516. CLOSE waitstats_cursor;
  517. DEALLOCATE waitstats_cursor;
  518. -- 打印结果字符串
  519. PRINT @ResultString;
  520. -- 删除临时表
  521. DROP TABLE #WaitStats;
  522. select top 10 *, (s.total_logical_reads / s.execution_count) as avglogicalreads from sys.dm_exec_query_stats s
  523. cross apply sys.dm_exec_sql_text(s.sql_handle)
  524. order by avglogicalreads desc
  525. select top 10 *, (s.total_logical_writes / s.execution_count) as avglogicalwrites from sys.dm_exec_query_stats s
  526. cross apply sys.dm_exec_sql_text(s.sql_handle)
  527. order by avglogicalwrites desc
  528. select * from sys.dm_os_waiting_tasks
  529. SET NOCOUNT ON;
  530. -- 查询 sys.dm_os_waiting_tasks 并存储在临时表中
  531. DECLARE @TempTable TABLE (
  532.    session_id INT,
  533.    exec_context_id INT,
  534.    wait_duration_ms BIGINT,
  535.    wait_type NVARCHAR(60),
  536.    blocking_task_address VARBINARY(8),
  537.    blocking_session_id INT,
  538.    resource_description NVARCHAR(256)
  539. );
  540. -- 插入查询结果到临时表中
  541. INSERT INTO @TempTable
  542. SELECT
  543.    session_id,
  544.    exec_context_id,
  545.    wait_duration_ms,
  546.    wait_type,
  547.    blocking_task_address,
  548.    blocking_session_id,
  549.    resource_description
  550. FROM sys.dm_os_waiting_tasks;
  551. -- 声明变量来存储每行的结果
  552. DECLARE @session_id NVARCHAR(MAX);
  553. DECLARE @exec_context_id NVARCHAR(MAX);
  554. DECLARE @wait_duration_ms NVARCHAR(MAX);
  555. DECLARE @wait_type2 NVARCHAR(MAX);
  556. DECLARE @blocking_task_address NVARCHAR(MAX);
  557. DECLARE @blocking_session_id NVARCHAR(MAX);
  558. DECLARE @resource_description NVARCHAR(MAX);
  559. -- 游标遍历临时表
  560. DECLARE cur CURSOR FOR
  561. SELECT
  562.    CAST(session_id AS NVARCHAR),
  563.    CAST(exec_context_id AS NVARCHAR),
  564.    CAST(wait_duration_ms AS NVARCHAR),
  565.    wait_type,
  566.    CAST(blocking_task_address AS NVARCHAR(MAX)),
  567.    CAST(blocking_session_id AS NVARCHAR),
  568.    resource_description
  569. FROM @TempTable;
  570. OPEN cur;
  571. FETCH NEXT FROM cur INTO @session_id, @exec_context_id, @wait_duration_ms, @wait_type2, @blocking_task_address, @blocking_session_id, @resource_description;
  572. WHILE @@FETCH_STATUS = 0
  573. BEGIN
  574.    -- 格式化并打印每一行的结果
  575.    PRINT 'Session ID: ' + ISNULL(@session_id, '') + ' | ' +
  576.          'Exec Context ID: ' + ISNULL(@exec_context_id, '') + ' | ' +
  577.          'Wait Duration (ms): ' + ISNULL(@wait_duration_ms, '') + ' | ' +
  578.          'Wait Type: ' + ISNULL(@wait_type2, '') + ' | ' +
  579.          'Blocking Task Address: ' + ISNULL(@blocking_task_address, '') + ' | ' +
  580.          'Blocking Session ID: ' + ISNULL(@blocking_session_id, '') + ' | ' +
  581.          'Resource Description: ' + ISNULL(@resource_description, '');
  582.    PRINT '--------------------------------------------';
  583.    FETCH NEXT FROM cur INTO @session_id, @exec_context_id, @wait_duration_ms, @wait_type2, @blocking_task_address, @blocking_session_id, @resource_description;
  584. END
  585. CLOSE cur;
  586. DEALLOCATE cur;
  587. SET NOCOUNT OFF;
  588. print '14.查看CPU活动及工作情况             '
  589. print'----------------------------'
  590. print '*********************************'
  591. SET NOCOUNT ON;
  592. select
  593. @@cpu_busy,
  594. @@timeticks [每个时钟周期对应的微秒数],
  595. @@cpu_busy*cast(@@timeticks as float)/1000 [CPU工作时间(秒)],
  596. @@idle*cast(@@timeticks as float)/1000 [CPU空闲时间(秒)],
  597. getdate() [当前时间]
  598. SET NOCOUNT ON;
  599. -- 声明变量来存储查询结果
  600. DECLARE @cpu_busy INT;
  601. DECLARE @timeticks INT;
  602. DECLARE @cpu_busy_sec FLOAT;
  603. DECLARE @cpu_idle_sec FLOAT;
  604. DECLARE @current_time DATETIME;
  605. -- 获取查询结果
  606. SELECT
  607.    @cpu_busy = @@cpu_busy,
  608.    @timeticks = @@timeticks,
  609.    @cpu_busy_sec = @@cpu_busy * CAST(@timeticks AS FLOAT) / 1000,
  610.    @cpu_idle_sec = @@idle * CAST(@timeticks AS FLOAT) / 1000,
  611.    @current_time = GETDATE();
  612. -- 格式化并打印结果
  613. PRINT 'CPU Busy: ' + CAST(@cpu_busy AS NVARCHAR);
  614. PRINT 'Timeticks (us/clock tick): ' + CAST(@timeticks AS NVARCHAR);
  615. PRINT 'CPU Busy Time (s): ' + CAST(@cpu_busy_sec AS NVARCHAR);
  616. PRINT 'CPU Idle Time (s): ' + CAST(@cpu_idle_sec AS NVARCHAR);
  617. PRINT 'Current Time: ' + CAST(@current_time AS NVARCHAR);
  618. PRINT '-----------------------------------------';
  619. -- 美观的多行输出
  620. DECLARE @result NVARCHAR(MAX);
  621. SET @result =
  622.    'CPU Busy: ' + CAST(@cpu_busy AS NVARCHAR) + CHAR(13) + CHAR(10) +
  623.    'Timeticks (us/clock tick): ' + CAST(@timeticks AS NVARCHAR) + CHAR(13) + CHAR(10) +
  624.    'CPU Busy Time (s): ' + CAST(@cpu_busy_sec AS NVARCHAR) + CHAR(13) + CHAR(10) +
  625.    'CPU Idle Time (s): ' + CAST(@cpu_idle_sec AS NVARCHAR) + CHAR(13) + CHAR(10) +
  626.    'Current Time: ' + CAST(@current_time AS NVARCHAR);
  627. PRINT @result;
  628. SET NOCOUNT OFF;
  629. print '15.检查锁与等待             '
  630. print'----------------------------'
  631. print '*********************************'
  632. SET NOCOUNT ON;
  633. exec sp_lock
  634. Go
  635. SET NOCOUNT ON;
  636. -- 创建临时表来存储 sp_lock 的结果
  637. CREATE TABLE #LockInfo (
  638.    spid INT,
  639.    dbid INT,
  640.    ObjId BIGINT,
  641.    IndId INT,
  642.    Type NVARCHAR(4),
  643.    Resource NVARCHAR(32),
  644.    Mode NVARCHAR(8),
  645.    Status NVARCHAR(8)
  646. );
  647. -- 插入 sp_lock 的结果到临时表中
  648. INSERT INTO #LockInfo
  649. EXEC sp_lock;
  650. -- 声明变量来存储每一行的结果
  651. DECLARE @spid NVARCHAR(10);
  652. DECLARE @dbid NVARCHAR(10);
  653. DECLARE @ObjId NVARCHAR(20);
  654. DECLARE @IndId NVARCHAR(10);
  655. DECLARE @Type NVARCHAR(4);
  656. DECLARE @Resource NVARCHAR(32);
  657. DECLARE @Mode NVARCHAR(8);
  658. DECLARE @Status NVARCHAR(8);
  659. DECLARE @result NVARCHAR(MAX);
  660. -- 游标遍历临时表
  661. DECLARE cur CURSOR FOR
  662. SELECT
  663.    CAST(spid AS NVARCHAR),
  664.    CAST(dbid AS NVARCHAR),
  665.    CAST(ObjId AS NVARCHAR),
  666.    CAST(IndId AS NVARCHAR),
  667.    Type,
  668.    Resource,
  669.    Mode,
  670.    Status
  671. FROM #LockInfo;
  672. OPEN cur;
  673. FETCH NEXT FROM cur INTO @spid, @dbid, @ObjId, @IndId, @Type, @Resource, @Mode, @Status;
  674. WHILE @@FETCH_STATUS = 0
  675. BEGIN
  676.    -- 格式化并打印每一行的结果
  677.    SET @result = 'SPID: ' + @spid + ', ' +
  678.                  'DBID: ' + @dbid + ', ' +
  679.                  'ObjId: ' + @ObjId + ', ' +
  680.                  'IndId: ' + @IndId + ', ' +
  681.                  'Type: ' + @Type + ', ' +
  682.                  'Resource: ' + @Resource + ', ' +
  683.                  'Mode: ' + @Mode + ', ' +
  684.                  'Status: ' + @Status;
  685.    PRINT @result;
  686.    FETCH NEXT FROM cur INTO @spid, @dbid, @ObjId, @IndId, @Type, @Resource, @Mode, @Status;
  687. END
  688. CLOSE cur;
  689. DEALLOCATE cur;
  690. -- 删除临时表
  691. DROP TABLE #LockInfo;
  692. SET NOCOUNT OFF;
  693. print '16.检查死锁             '
  694. print'----------------------------'
  695. print '*********************************'
  696. SET NOCOUNT ON;
  697. exec sp_who2
  698. SET NOCOUNT ON;
  699. -- 创建用于存储 sp_who2 结果的临时表
  700. CREATE TABLE #Who2 (
  701.    SPID INT,
  702.    Status NVARCHAR(255),
  703.    Login NVARCHAR(255),
  704.    HostName NVARCHAR(255),
  705.    BlkBy NVARCHAR(50),
  706.    DBName NVARCHAR(255),
  707.    Command NVARCHAR(255),
  708.    CPUTime INT,
  709.    DiskIO INT,
  710.    LastBatch NVARCHAR(255),
  711.    ProgramName NVARCHAR(255),
  712.    SPID2 INT, -- This is for the SPID in sp_who2 output
  713.    RequestID INT
  714. );
  715. -- sp_who2 的结果插入到临时表中
  716. INSERT INTO #Who2 (SPID, Status, Login, HostName, BlkBy, DBName, Command, CPUTime, DiskIO, LastBatch, ProgramName, SPID2, RequestID)
  717. EXEC sp_who2;
  718. -- 声明变量来存储每一行的结果
  719. DECLARE @SPID1 NVARCHAR(10);
  720. DECLARE @Status11 NVARCHAR(255);
  721. DECLARE @Login NVARCHAR(255);
  722. DECLARE @HostName NVARCHAR(255);
  723. DECLARE @BlkBy NVARCHAR(50);
  724. DECLARE @DBName NVARCHAR(255);
  725. DECLARE @Command NVARCHAR(255);
  726. DECLARE @CPUTime NVARCHAR(10);
  727. DECLARE @DiskIO NVARCHAR(10);
  728. DECLARE @LastBatch NVARCHAR(255);
  729. DECLARE @ProgramName NVARCHAR(255);
  730. DECLARE @SPID2 NVARCHAR(10);
  731. DECLARE @RequestID NVARCHAR(10);
  732. DECLARE @result111 NVARCHAR(MAX);
  733. -- 游标遍历临时表
  734. DECLARE cur CURSOR FOR
  735. SELECT
  736.    CAST(SPID AS NVARCHAR),
  737.    Status,
  738.    Login,
  739.    HostName,
  740.    BlkBy,
  741.    DBName,
  742.    Command,
  743.    CAST(CPUTime AS NVARCHAR),
  744.    CAST(DiskIO AS NVARCHAR),
  745.    LastBatch,
  746.    ProgramName,
  747.    CAST(SPID2 AS NVARCHAR),
  748.    CAST(RequestID AS NVARCHAR)
  749. FROM #Who2;
  750. OPEN cur;
  751. FETCH NEXT FROM cur INTO @SPID1, @Status11, @Login, @HostName, @BlkBy, @DBName, @Command, @CPUTime, @DiskIO, @LastBatch, @ProgramName, @SPID2, @RequestID;
  752. WHILE @@FETCH_STATUS = 0
  753. BEGIN
  754.    -- 格式化并打印每一行的结果
  755.    SET @result111 = 'SPID: ' + ISNULL(@SPID1, '') + ', ' +
  756.                  'Status: ' + ISNULL(@Status11, '') + ', ' +
  757.                  'Login: ' + ISNULL(@Login, '') + ', ' +
  758.                  'HostName: ' + ISNULL(@HostName, '') + ', ' +
  759.                  'BlkBy: ' + ISNULL(@BlkBy, '') + ', ' +
  760.                  'DBName: ' + ISNULL(@DBName, '') + ', ' +
  761.                  'Command: ' + ISNULL(@Command, '') + ', ' +
  762.                  'CPUTime: ' + ISNULL(@CPUTime, '') + ', ' +
  763.                  'DiskIO: ' + ISNULL(@DiskIO, '') + ', ' +
  764.                  'LastBatch: ' + ISNULL(@LastBatch, '') + ', ' +
  765.                  'ProgramName: ' + ISNULL(@ProgramName, '') + ', ' +
  766.                  'SPID2: ' + ISNULL(@SPID2, '') + ', ' +
  767.                  'RequestID: ' + ISNULL(@RequestID, '');
  768.    PRINT @result111;
  769.    FETCH NEXT FROM cur INTO @SPID1, @Status11, @Login, @HostName, @BlkBy, @DBName, @Command, @CPUTime, @DiskIO, @LastBatch, @ProgramName, @SPID2, @RequestID;
  770. END
  771. CLOSE cur;
  772. DEALLOCATE cur;
  773. -- 删除临时表
  774. DROP TABLE #Who2;
  775. SET NOCOUNT OFF;
  776. print '17.活动用户和进程的信息             '
  777. print'----------------------------'
  778. print '*********************************'
  779. SET NOCOUNT ON;
  780. exec sp_who 'active'
  781. SET NOCOUNT OFF;
  782. print '18.查看所有数据库用户所属的角色信息             '
  783. print'----------------------------'
  784. print '*********************************'
  785. exec sp_helpsrvrolemember
  786. SET NOCOUNT ON;
  787. -- 创建用于存储 sp_helpsrvrolemember 结果的临时表
  788. CREATE TABLE #SrvRoleMember (
  789.    ServerRole NVARCHAR(255),
  790.    MemberName NVARCHAR(255),
  791.    MemberSID VARBINARY(MAX)
  792. );
  793. -- sp_helpsrvrolemember 的结果插入到临时表中
  794. INSERT INTO #SrvRoleMember (ServerRole, MemberName, MemberSID)
  795. EXEC sp_helpsrvrolemember;
  796. -- 声明变量来存储每一行的结果
  797. DECLARE @ServerRole NVARCHAR(255);
  798. DECLARE @MemberName NVARCHAR(255);
  799. DECLARE @MemberSID NVARCHAR(MAX);
  800. DECLARE @result99 NVARCHAR(MAX);
  801. -- MemberSID 转换为十六进制字符串
  802. DECLARE @HexMemberSID NVARCHAR(MAX);
  803. -- 游标遍历临时表
  804. DECLARE cur CURSOR FOR
  805. SELECT
  806.    ServerRole,
  807.    MemberName,
  808.    CONVERT(NVARCHAR(MAX), MemberSID, 1) AS MemberSID -- 使用样式 1 转换为十六进制字符串
  809. FROM #SrvRoleMember;
  810. OPEN cur;
  811. FETCH NEXT FROM cur INTO @ServerRole, @MemberName, @MemberSID;
  812. WHILE @@FETCH_STATUS = 0
  813. BEGIN
  814.    -- 格式化并打印每一行的结果
  815.    SET @HexMemberSID = CONVERT(NVARCHAR(MAX), @MemberSID, 1); -- 确保 MemberSID 显示为十六进制字符串
  816.    SET @result99 = 'ServerRole: ' + ISNULL(@ServerRole, '') + ', ' +
  817.                  'MemberName: ' + ISNULL(@MemberName, '') + ', ' +
  818.                  'MemberSID: ' + ISNULL(@HexMemberSID, '');
  819.    PRINT @result99;
  820.    FETCH NEXT FROM cur INTO @ServerRole, @MemberName, @MemberSID;
  821. END
  822. CLOSE cur;
  823. DEALLOCATE cur;
  824. -- 删除临时表
  825. DROP TABLE #SrvRoleMember;
  826. SET NOCOUNT OFF;
  827. print '19.查看链接服务器             '
  828. print'----------------------------'
  829. print '*********************************'
  830. SET NOCOUNT ON;
  831. exec sp_helplinkedsrvlogin
  832. SET NOCOUNT OFF;
  833. print '20.查询文件组和文件             '
  834. print'----------------------------'
  835. print '*********************************'
  836. SET NOCOUNT ON;
  837. select
  838. df.[name],df.physical_name,df.[size],df.growth,
  839. f.[name][filegroup],f.is_default
  840. from sys.database_files df join sys.filegroups f
  841. on df.data_space_id = f.data_space_id
  842. Go
  843. SET NOCOUNT ON;
  844. -- 创建用于存储查询结果的临时表
  845. CREATE TABLE #DatabaseFiles (
  846.    name NVARCHAR(255),
  847.    physical_name NVARCHAR(260),
  848.    size INT,
  849.    growth INT,
  850.    filegroup NVARCHAR(255),
  851.    is_default BIT
  852. );
  853. -- 将查询结果插入到临时表中
  854. INSERT INTO #DatabaseFiles (name, physical_name, size, growth, filegroup, is_default)
  855. SELECT
  856.    df.[name],
  857.    df.physical_name,
  858.    df.[size],
  859.    df.growth,
  860.    f.[name] AS [filegroup],
  861.    f.is_default
  862. FROM sys.database_files df
  863. JOIN sys.filegroups f ON df.data_space_id = f.data_space_id;
  864. -- 声明变量来存储每一行的结果
  865. DECLARE @name NVARCHAR(255);
  866. DECLARE @physical_name NVARCHAR(260);
  867. DECLARE @size NVARCHAR(10);
  868. DECLARE @growth NVARCHAR(10);
  869. DECLARE @filegroup NVARCHAR(255);
  870. DECLARE @is_default NVARCHAR(5);
  871. DECLARE @result NVARCHAR(MAX);
  872. -- 游标遍历临时表
  873. DECLARE cur CURSOR FOR
  874. SELECT
  875.    name,
  876.    physical_name,
  877.    CAST(size AS NVARCHAR(10)),
  878.    CAST(growth AS NVARCHAR(10)),
  879.    filegroup,
  880.    CAST(is_default AS NVARCHAR(5))
  881. FROM #DatabaseFiles;
  882. OPEN cur;
  883. FETCH NEXT FROM cur INTO @name, @physical_name, @size, @growth, @filegroup, @is_default;
  884. WHILE @@FETCH_STATUS = 0
  885. BEGIN
  886.    -- 格式化并打印每一行的结果
  887.    SET @result = 'Name: ' + ISNULL(@name, '') + ', ' +
  888.                  'Physical Name: ' + ISNULL(@physical_name, '') + ', ' +
  889.                  'Size: ' + ISNULL(@size, '') + ', ' +
  890.                  'Growth: ' + ISNULL(@growth, '') + ', ' +
  891.                  'Filegroup: ' + ISNULL(@filegroup, '') + ', ' +
  892.                  'Is Default: ' + ISNULL(@is_default, '');
  893.    PRINT @result;
  894.    FETCH NEXT FROM cur INTO @name, @physical_name, @size, @growth, @filegroup, @is_default;
  895. END
  896. CLOSE cur;
  897. DEALLOCATE cur;
  898. -- 删除临时表
  899. DROP TABLE #DatabaseFiles;
  900. SET NOCOUNT OFF;
  901. print '21.查看SQL Server的实际内存占用            '
  902. print'----------------------------'
  903. print '*********************************'
  904. SET NOCOUNT ON;
  905. select * from sysperfinfo where counter_name like '%Memory%'
  906. -- 声明变量
  907. DECLARE @counter_name NVARCHAR(128);
  908. DECLARE @instance_name NVARCHAR(128);
  909. DECLARE @cntr_value BIGINT;
  910. DECLARE @row NVARCHAR(MAX);
  911. -- 声明游标
  912. DECLARE memory_cursor CURSOR FOR
  913. SELECT counter_name, instance_name, cntr_value
  914. FROM sys.dm_os_performance_counters
  915. WHERE counter_name LIKE '%Memory%';
  916. -- 打开游标
  917. OPEN memory_cursor;
  918. -- 获取第一行数据
  919. FETCH NEXT FROM memory_cursor INTO @counter_name, @instance_name, @cntr_value;
  920. -- 打印列名
  921. PRINT 'Counter Name       | Instance Name     | Counter Value';
  922. -- 遍历游标中的数据
  923. WHILE @@FETCH_STATUS = 0
  924. BEGIN
  925.    -- 拼接每一行数据
  926.    SET @row = LEFT(@counter_name + SPACE(20), 20) + ' | '
  927.               + LEFT(ISNULL(@instance_name, 'N/A') + SPACE(20), 20) + ' | '
  928.               + CAST(@cntr_value AS NVARCHAR);
  929.    -- 打印当前行数据
  930.    PRINT @row;
  931.    -- 获取下一行数据
  932.    FETCH NEXT FROM memory_cursor INTO @counter_name, @instance_name, @cntr_value;
  933. END
  934. -- 关闭游标
  935. CLOSE memory_cursor;
  936. -- 释放游标
  937. DEALLOCATE memory_cursor;
  938. SET NOCOUNT OFF;
  939. print '22.显示所有数据库的日志空间信息            '
  940. print'----------------------------'
  941. print '*********************************'
  942. SET NOCOUNT ON;
  943. dbcc sqlperf(logspace)
  944. Go
  945. -- 创建一个临时表来存储DBCC SQLPERF(LOGSPACE)的结果
  946. CREATE TABLE #LogSpace (
  947.    [Database Name] NVARCHAR(128),
  948.    [Log Size (MB)] FLOAT,
  949.    [Log Space Used (%)] FLOAT,
  950.    [Status] INT
  951. );
  952. -- 插入DBCC SQLPERF(LOGSPACE)的结果到临时表
  953. INSERT INTO #LogSpace
  954. EXEC ('DBCC SQLPERF(LOGSPACE)');
  955. -- 声明变量
  956. DECLARE @DatabaseName NVARCHAR(128);
  957. DECLARE @LogSizeMB FLOAT;
  958. DECLARE @LogSpaceUsedPercent FLOAT;
  959. DECLARE @Status INT;
  960. DECLARE @row NVARCHAR(MAX);
  961. -- 声明游标
  962. DECLARE logspace_cursor CURSOR FOR
  963. SELECT [Database Name], [Log Size (MB)], [Log Space Used (%)], [Status]
  964. FROM #LogSpace;
  965. -- 打开游标
  966. OPEN logspace_cursor;
  967. -- 获取第一行数据
  968. FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPercent, @Status;
  969. -- 打印列名
  970. PRINT 'Database Name             | Log Size (MB)         | Log Space Used (%)       | Status';
  971. -- 遍历游标中的数据
  972. WHILE @@FETCH_STATUS = 0
  973. BEGIN
  974.    -- 拼接每一行数据,并保证对齐
  975.    SET @row = LEFT(@DatabaseName + SPACE(25), 25) + ' | '
  976.               + RIGHT(SPACE(20) + CAST(@LogSizeMB AS NVARCHAR), 20) + ' | '
  977.               + RIGHT(SPACE(25) + CAST(@LogSpaceUsedPercent AS NVARCHAR), 25) + ' | '
  978.               + CAST(@Status AS NVARCHAR);
  979.    -- 打印当前行数据
  980.    PRINT @row;
  981.    -- 获取下一行数据
  982.    FETCH NEXT FROM logspace_cursor INTO @DatabaseName, @LogSizeMB, @LogSpaceUsedPercent, @Status;
  983. END
  984. -- 关闭游标
  985. CLOSE logspace_cursor;
  986. -- 释放游标
  987. DEALLOCATE logspace_cursor;
  988. -- 删除临时表
  989. DROP TABLE #LogSpace;
  990. select *,CAST(cntr_value/1024.0 as decimal(20,1)) MemoryMB
  991. from master.sys.sysperfinfo
  992. where counter_name='Total Server Memory (KB)'
  993. SET NOCOUNT OFF;
  994. print '23.查询表空间的已使用大小            '
  995. print'----------------------------'
  996. print '*********************************'
  997. SET NOCOUNT ON;
  998. SELECT
  999.    DB_NAME() AS DatabaseName,
  1000.    mf.name AS FileName,
  1001.    mf.size * 8 / 1024 AS SizeMB,
  1002.    mf.size * 8 / 1024 - FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS FreeSpaceMB,
  1003.    FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS UsedSpaceMB
  1004. FROM
  1005.    sys.master_files mf
  1006. WHERE
  1007.    mf.database_id = DB_ID()
  1008. Go
  1009. -- 创建一个临时表来存储查询结果
  1010. CREATE TABLE #FileSpace (
  1011.    DatabaseName NVARCHAR(128),
  1012.    FileName NVARCHAR(128),
  1013.    SizeMB DECIMAL(18, 2),
  1014.    FreeSpaceMB DECIMAL(18, 2),
  1015.    UsedSpaceMB DECIMAL(18, 2)
  1016. );
  1017. -- 插入查询结果到临时表
  1018. INSERT INTO #FileSpace
  1019. SELECT
  1020.    DB_NAME() AS DatabaseName,
  1021.    mf.name AS FileName,
  1022.    mf.size * 8 / 1024 AS SizeMB,
  1023.    mf.size * 8 / 1024 - FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS FreeSpaceMB,
  1024.    FILEPROPERTY(mf.name, 'SpaceUsed') * 8 / 1024 AS UsedSpaceMB
  1025. FROM
  1026.    sys.master_files mf
  1027. WHERE
  1028.    mf.database_id = DB_ID();
  1029. -- 声明变量
  1030. DECLARE @DatabaseName NVARCHAR(128);
  1031. DECLARE @FileName NVARCHAR(128);
  1032. DECLARE @SizeMB DECIMAL(18, 2);
  1033. DECLARE @FreeSpaceMB DECIMAL(18, 2);
  1034. DECLARE @UsedSpaceMB DECIMAL(18, 2);
  1035. DECLARE @row NVARCHAR(MAX);
  1036. -- 声明游标
  1037. DECLARE file_cursor CURSOR FOR
  1038. SELECT DatabaseName, FileName, SizeMB, FreeSpaceMB, UsedSpaceMB
  1039. FROM #FileSpace;
  1040. -- 打开游标
  1041. OPEN file_cursor;
  1042. -- 获取第一行数据
  1043. FETCH NEXT FROM file_cursor INTO @DatabaseName, @FileName, @SizeMB, @FreeSpaceMB, @UsedSpaceMB;
  1044. -- 打印列名
  1045. PRINT 'Database Name         | File Name               | Size (MB)       | Free Space (MB)   | Used Space (MB)';
  1046. -- 遍历游标中的数据
  1047. WHILE @@FETCH_STATUS = 0
  1048. BEGIN
  1049.    -- 拼接每一行数据,并保证对齐
  1050.    SET @row = LEFT(@DatabaseName + SPACE(20), 20) + ' | '
  1051.               + LEFT(@FileName + SPACE(25), 25) + ' | '
  1052.               + RIGHT(SPACE(15) + CAST(@SizeMB AS NVARCHAR(15)), 15) + ' | '
  1053.               + RIGHT(SPACE(18) + CAST(@FreeSpaceMB AS NVARCHAR(18)), 18) + ' | '
  1054.               + RIGHT(SPACE(15) + CAST(@UsedSpaceMB AS NVARCHAR(15)), 15);
  1055.    -- 打印当前行数据
  1056.    PRINT @row;
  1057.    -- 获取下一行数据
  1058.    FETCH NEXT FROM file_cursor INTO @DatabaseName, @FileName, @SizeMB, @FreeSpaceMB, @UsedSpaceMB;
  1059. END
  1060. -- 关闭游标
  1061. CLOSE file_cursor;
  1062. -- 释放游标
  1063. DEALLOCATE file_cursor;
  1064. -- 删除临时表
  1065. DROP TABLE #FileSpace;
  1066. SET NOCOUNT OFF;
  1067. print '----------------------------'
  1068. print ' 结束巡检  '
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 存储 关系型数据库
bat脚本拼写SQL并写文件
【8月更文挑战第7天】bat脚本拼写SQL并写文件
36 5
|
22天前
|
SQL 存储 Go
SQL Server一键巡检脚本分享
SQL Server一键巡检脚本分享
10 0
|
24天前
|
SQL 监控 安全
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
|
1月前
|
SQL 存储 Oracle
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
33 0
|
1月前
|
SQL 运维 Oracle
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
SQL Server 项目中 SQL 脚本更新、升级方式,防止多次重复执行
25 0
|
2月前
|
SQL DataWorks 安全
DataWorks产品使用合集之在进行数据查询和数据处理时,如何通过数据建模与开发模块来创建和管理SQL脚本
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
56 13
|
2月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
2月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
44 6
|
1月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
140 0