Sqlserver 监控使用磁盘空间情况

2023-11-10

最近遇到一个小问题:为了保存以往的一些数据,间了大量临时表,导致SQLserver 数据增长过快,不得不想个办法监控磁盘空间使用情况。

网上一般有几种办法:
一是使用 dm_os_volume_stats函数,缺点是 无法获取非数据库所在的磁盘空间使用情况。

二是使用 Exec master.dbo.xp_fixeddrives ,缺点是只有磁盘空间使用情况,没有总容量。

三是使用xp_fixeddrives+xp_cmdshell,虽然有现成的语句,但过于复杂,而且打开cmdshell是存在一定的风险。

所以,可以简化操作如下:
1、使用dm_os_volume_stats函数,获得所有磁盘信息,若某个磁盘不在其中,则先增加一个临时数据库

例如,如果数据只存放在c\d盘,E盘没有数据库但用于备份,也需要监控,可以临时建立数据库(其他磁盘可参考):

USE [master]
GO

/****** Object:  Database [TEMP_BT]    Script Date: 2023/9/14 8:59:38 ******/
DROP DATABASE IF EXISTS [TEMP_BT]
GO

/****** Object:  Database [TEMP_BT]    Script Date: 2023/9/14 8:59:38 ******/
CREATE DATABASE [TEMP_BT]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'TEMP_BT', FILENAME = N'E:\DATA\TEMP_BT.mdf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 16KB )
 LOG ON 
( NAME = N'TEMP_BT_log', FILENAME = N'E:\DATA\TEMP_BT_log.ldf' , SIZE = 1024KB , MAXSIZE = 2GB , FILEGROWTH = 16KB )
GO


2、用dm_os_volume_stats函数获取磁盘信息,这些语句已经有现成的:

(假设数据库用 Data)

drop  table  if  exists   [Data].[dbo].[T_diskspace]
go

WITH T1 AS (
SELECT DISTINCT
REPLACE(vs.volume_mount_point,':\','') AS Drive_Name ,
CAST(vs.total_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2)) AS Total_Space_GB ,
CAST(vs.available_bytes / 1024.0 / 1024 / 1024  AS NUMERIC(18,2)) AS Free_Space_GB
FROM    sys.master_files AS f
outer APPLY sys.dm_os_volume_stats(f.database_id, f.file_id) AS vs
)
SELECT
GETDATE() as  sdate,
Drive_Name,
Total_Space_GB,
Total_Space_GB-Free_Space_GB AS Used_Space_GB,
Free_Space_GB,
CAST(Free_Space_GB*100/Total_Space_GB AS NUMERIC(18,2)) AS Free_Space_Percent
into  [Data].[dbo].[T_diskspace]
FROM T1

go

use [Data]
go

select *  from   [Data].[dbo].[T_diskspace]

go

完成后,如下图可见:

在这里插入图片描述
当然同时可删除 临时数据库:

use [master]
go

DROP DATABASE IF EXISTS [TEMP_BT]
GO

以上数据获取后运行一次保存即可,以后无需运行

3、用 Exec master.dbo.xp_fixeddrives 监控磁盘空间情况即可。

use [Data]
go

select *  from   [Data].[dbo].[T_diskspace]

go


drop table  if exists [dbo].[Temp_diskspace]
go

CREATE TABLE [dbo].[Temp_diskspace](
	[Drive_name] [nvarchar](500)  NULL,
	[Free_Space] [numeric](20,2)  NULL,
) ON [PRIMARY]
GO

insert into [Data].[dbo].[Temp_diskspace](Drive_Name,Free_Space)
Exec  master.dbo.xp_fixeddrives 

go



update [Data].[dbo].[T_diskspace] set sdate=GETDATE(),Free_Space_GB=cast(b.Free_Space/1024 as numeric(20,2))
from [Data].[dbo].[T_diskspace] a,[Data].[dbo].[Temp_diskspace] b
where a.Drive_Name=b.Drive_Name

go

update [Data].[dbo].[T_diskspace] set Used_Space_GB=Total_Space_GB-Free_Space_GB,
Free_Space_Percent=CAST(Free_Space_GB*100/Total_Space_GB AS NUMERIC(18,2)) 

drop  table if exists [dbo].[Temp_diskspace]
go

select *  from   [Data].[dbo].[T_diskspace]

go

这段代码每日运行即可

以上需要 SQLServer 2008 以上版本

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sqlserver 监控使用磁盘空间情况 的相关文章

随机推荐

  • 从传导骚扰测试实质分析来解决传导骚扰问题

    从传导骚扰测试实质分析来解决传导骚扰问题 1前言 2测试目的 3测试示意图 4电源端口传导骚扰测试实质 5实际案例分析 1前言 传导骚扰 主要针对电源端口 测试是电磁兼容测试中不容易通过的测试项目之一 本文从电源端口传导测试实质开始 结合实
  • 路由追踪命令:tracert、pathping 值得收藏

    对于网络工程师来说 需要熟练掌握的Windows路由追踪命令有两个 tracert和pathping 其中pathping是tracert和ping命令的结合 不但可以追踪目标IP地址的路由 还可以测试经过的每一跳的时延和丢包率 trace
  • 华为OD机试,C语言实现:IP地址整数表示

    描述 原理 ip地址的每段可以看成是一个0 255的整数 把每段拆分成一个二进制形式组合起来 然后把这个二进制数转变成 一个长整数 举例 一个ip地址为10 0 3 193 每段数字 相对应的二进制数 10 00001010 0 00000
  • 总结: C++ 中如何把输出结果写入到文件中

    文是我在网上搜到额一些经验汇总 C 把输出结果写入到文件中 文件 I O 在C 中比烤蛋糕简单多了 在这篇文章里 我会详细解释ASCII和二进制文件的输入输出的每个细节 值得注意的是 所有这些都是用C 完成的 一 ASCII 输出 为了使用
  • vue实战之Filter传入多个参数

    文章目录 前言 一 Filter多参数 1 创建全局过滤器 2 引用实现 总结 前言 vue过滤器Filter用于格式化文本 即我们日常的为数字添加 或 符号等简单操作 但在现实场景中除了 往往会有略微复杂的情况出现 如 给多个不同的循环表
  • batch normalization详解

    1 引入BN的原因 1 加快模型的收敛速度 2 在一定程度上缓解了深度网络中的 梯度弥散 问题 从而使得训练深层网络模型更加容易和稳定 3 对每一批数据进行归一化 这个数据是可以输入也可以是网络中间的某一层输出 4 网络一旦train起来
  • 改变单选按钮radio圆点的颜色

    2019独角兽企业重金招聘Python工程师标准 gt gt gt
  • 实例化和初始化的区别

    一 实例化和初始化的区别 实例化 只是单纯的把对象 new 一下就行了 例 Student st new Student 这样就行了 初始化 是在实例化之后完成的 先实例化对象 只给对象属性赋值 然后初始化这个对象
  • mybatis拦截器使用及原理

    使用拦截器 Web开发中我们经常会碰到分页操作 一个项目中或许有多处使用到分页 这时如果Java后台使用MyBatis作为持久层 我们就可以使用MyBatis的拦截器功能来完成整个项目中多处的分页操作 减少代码的冗余 拦截器代码 拦截Sta
  • modbus 协议编程 C++

    MODBUS通讯协议及编程 ModBus通讯协议分为RTU协议和ASCII协议 我公司的多种仪表都采用ModBus RTU通讯协议 如 CH2000智能电力监测仪 CH2000M电力参数采集模块 巡检表 数显表 光柱数显表等 下面就ModB
  • FastDFS分布文件系统Java客户端使用

    原文链接 http blog csdn net xyang81 article details 52847311 FastDFS分布式文件系统服务安装和使用请参考上一篇文章 FastDFS分布式文件系统安装与使用 单节点 担建环境 官网Ja
  • [1177]Hive 窗口函数之lead() over(partition by ) 和 lag() over(partition by )

    lag over 与 lead over 函数是跟偏移量相关的两个分析函数 通过这两个函数可以在一次查询中取出同一字段的前 N 行的数据 lag 和后 N 行的数据 lead 作为独立的列 从而更方便地进行进行数据过滤 这种操作可以代替表的
  • QT Event机制测试程序

    QT Event机制测试程序 代码 https github com pengrui2009 QEventTest 这里我们测试QKeyPress时间 在主窗口放置一个QLineEdit控件 并提升为MyLineEdit 新建MyLineE
  • DVWA通关教程

    1 首先先把难度调为low 进行brute force 首先审计代码
  • java中Long类型数据必须转化为int才能正确比较

    java中如果有Long类型数据需要比较判断时 必须转化为int才能正确比较 例如 Long long1 Long parseLong 1012 Long long2 Long parseLong 1012 if long1 long2 结
  • HTTP FAILED: java.net.UnknownServiceException: CLEARTEXT communication to baobab.kaiyanapp.com not

    问题 HTTP FAILED java net UnknownServiceException CLEARTEXT communication to baobab kaiyanapp com not permitted by network
  • 配置PDB符号文件服务

    配置PDB符号文件服务器的想法 刚入职的小木 前不久刚刚解决了一次crash问题 Windbg分析程序崩溃实践 小木没有松懈 继续进行项目代码和Debug技术的学习 同时也思考了一个问题 产品每隔一段时间就会发布新的版本 当出现Crash问
  • 利用Python实现一组数的最大公约数

    我先用求三个整数的最大公约数为例 首先利用for循环来进行判断这三个整数可以被那些数整除 代码如下 x y z eval input 请输入三个整数 用逗号隔开 ma max x y z ls for i in range 2 ma a x
  • 【MQTT】MQTT协议学习

    文章目录 MQTT协议 简述 特点 MQTT消息的QoS 服务质量 MQTT支持三种QoS等级 协议实现方式 MQTT协议数据包 控制报文 结构 MQTT固定头 MQTT数据包类型 标识位 剩余长度 Remaining Length MQT
  • Sqlserver 监控使用磁盘空间情况

    最近遇到一个小问题 为了保存以往的一些数据 间了大量临时表 导致SQLserver 数据增长过快 不得不想个办法监控磁盘空间使用情况 网上一般有几种办法 一是使用 dm os volume stats函数 缺点是 无法获取非数据库所在的磁盘