SQL Server获取磁盘空间使用情况
对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: xp_fixeddrives方式有点是系统自带,可直接使用,缺点是不能查看磁盘总大小和不能查看SQL Server未使用到的磁盘信息 使用sys.dm_os_volume_stats函数 查询效果: sys.dm_os_volume_stats函数很好用,能直接查询到总空间和空闲空间,可惜只支持SQL Server 2008 R2 SP1即更高版本,另外无法查到数据库文件未使用到的磁盘 为兼容低版本,可采用xp_fixeddrives+xp_cmdshell方式来获取,我写了几个存储过程来获取磁盘信息: /** Object: StoredProcedure [dbo].[usp_get_disk_free_size] Script Date: 2016/5/25 18:21:11 **/SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON -- ============================================= --========================================== IF OBJECT_ID('server_disk_usage') IS NULL --========================================== --更新当前磁盘的剩余空间信息 --插入新增磁盘的剩余空间信息 END GO /** Object: StoredProcedure [dbo].[usp_get_disk_total_size] Script Date: 2016/5/25 18:21:11 **/ SET QUOTED_IDENTIFIER ON -- ============================================= IF NOT EXISTS(SELECT * FROM [dbo].[server_disk_usage] --========================================== RECONFIGURE WITH OVERRIDE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE WITH OVERRIDE --======================================== --============================================ DECLARE @disk_num NVARCHAR(20) WHILE(@min<=@max) SET @sql = N'EXEC sys.xp_cmdshell ''fsutil volume diskfree '+@disk_num+':'+'''' INSERT INTO #tempDisks SELECT @total_size_mb=CAST((RIGHT(DiskSpace,LEN(DiskSpace) SELECT @total_size_mb,@disk_num UPDATE [dbo].[server_disk_usage] --SELECT * FROM #tempDisks TRUNCATE TABLE #tempDisks SET @min=@min+1 END --========================================== EXEC sp_configure 'xp_cmdshell',0; EXEC sp_configure 'show advanced options',1; RECONFIGURE WITH OVERRIDE; END GO /** Object: StoredProcedure [dbo].[usp_get_disk_usage] Script Date: 2016/5/25 18:21:11 **/ SET QUOTED_IDENTIFIER ON -- ============================================= EXEC [dbo].[usp_get_disk_free_size] SELECT 效果显示: 只有第一次收集磁盘信息或第一次收集新磁盘信息时,才会调用xp_cmdshell来获取磁盘的总大小,尽量减少xp_cmdshell开启带来的风险,可配合SQL Server Agent Job来使用,定期调用存储过程刷新磁盘信息,监控程序直接访问数据表来或许最后一次刷新时的磁盘信息。 此方式有一缺点是开启xp_cmdshell后获取磁盘总大小期间,其他进程可能关闭xp_cmdshell,造成存储过程执行失败,虽然发生概率较低,但毕竟存在。 如果想跳过存储过程+SQL Server Agent Job方式,直接通过程序来调用xp_cmdshell,当程序使用“RECONFIGURE WITH OVERRIDE”来配置时,会报如下错误:
错误类似于我们在SSMS中使用事务包裹sp_configure语句,如: 错误消息为: 难道不能通过程序调用RECONFIGURE WITH OVERRIDE语句? 当然不是,google下相关错误,仅发现下面一个相关,有兴趣的可以参考下: https://www.sqlservercentral.com/Forums/Topic1349778-146-1.aspx 粗略看了下,使用存储过程套存储过程的方式来绕过报错,本人没有具体测试,感觉太繁琐,于是采用简单粗暴的方式,既然报“在用户事务内不能使用 CONFIG 语句”,哪我是否可以先COMMIT下干掉“用户事务”呢? 基于此思路,最终测试获得下面方式: 仔细的朋友发现我先执行了COMMIT,您没看错,这样的打开方式虽然怪异但的确是一种打开方式,在SSMS中执行结果为: 虽然报错,但是的但是,xp_cmdshell的值已经被设置为1,即脚本执行生效啦! 将此代码移植到代码中,然后通过TRY CATCH将异常捕获并丢弃,你就可以愉快地调用xp_cmdshell啦。 使用xp_cmdshell开了头,当然相关信息也可以使用类似方式来获取啦! 比如获取磁盘的扇区信息: 运行效果为: 当然你可以使用fsutil fsinfo ntfsinfo D:来获取完整信息,但是更值得您关注的就是上面这几行。 感言:当了这么多年的SQL Server DBA,现在找份像样的SQL SERVER DBA的工作真不容易,一方面是当前市场趋势导致,另一方面也是咱DBA自己“作死”造成的,看到很多同行包括我自己都还处在“刀耕火种”时代,有问题就在界面上点来点去,给外界一种“SQL Server很容易运维”的假象,而再看看MySQL DBA,只要你能假装“研究下源码”,立马给人一种“很牛逼”的赶脚,于是乎年薪三五十万不再是梦想! 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程之家! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |