如果磁盘空间很紧张或者大比例的磁盘需要用来进行该进程,那么在继续进行一个进程之前检查磁盘空间是一个明智之举。如果在一个进程运行数小时之后由于磁盘不足而导致进程在快结束时失败,那么这是令人不安的。虽然SQL Server中有几个不同的选项可用来检查磁盘(CLR,,WMI, PowerShell等等),但是 让我们来看看怎样使用SQL Server 2000 到 2008都提供的xp_fixeddrives扩展存储过程解决这个问题。
用来评估一个SQL Server 磁盘驱动器上可用磁盘空间的示例存储过程
在下面的示例存储过程中,它接受了一个特定磁盘驱动器上最低量的可用MB的参数,然后执行master.sys.xp_fixeddrives扩展存储过程到一个临时表中。一旦该数据在临时表中,当前的可用磁盘空间就会与最小的可用磁盘空间进行比较,从而确定该进程应该继续还是产生一个错误。
要记住的一点是在SQL Server 2000和SQL Server 2005/2008之间,xp_fixeddrives扩展存储过程的属主发生了变化。在SQL Server 2000中,xp_fixeddrives的属主是dbo,而在SQL Server 2005/2008中,属主变成了sys。由于属主的变化,两个存储过程分别提供如下。一个针对SQL Server 2005/2008,另一个针对SQL Server 2000。
*** NOTE *** - SQL Server 2008 and 2005 Version CREATE PROCEDURE dbo.spExec_Sufficient">DiskSpace @MinMBFree int, @Drive char(1) AS /* ---------------------------------------------------------------------------- -- Object Name: dbo.spExec_SufficientDiskSpace -- Project: Admin Scripts -- Business Process: Monthly Sales Reports -- Purpose: Validate sufficient disk space -- Detailed Description: Validate sufficient disk space based on based on the -- @MBfree and @Drive parameters -- Database: Admin -- Dependent Objects: master.sys.xp_fixeddrives -- Called By: Admin Scripts -- Upstream Systems: Unknown -- Downstream Systems: Unknown -- -------------------------------------------------------------------------------------- -- Rev | CMR | Date Modified | Developer | Change Summary -------------------------------------------------------------------------------------- -- 001 | NA | 03.05.2009 | MSSQLTips | Original code -- */ SET NOCOUNT ON -- 1 - Declare variables DECLARE @MBfree int DECLARE @CMD1 varchar(1000) -- 2 - Initialize variables SET @MBfree = 0 SET @CMD1 = '' -- 3 - Create temp tables CREATE TABLE #tbl_xp_fixeddrives (Drive varchar(2) NOT NULL, [MB free] int NOT NULL) -- 4 - Populate #tbl_xp_fixeddrives INSERT INTO #tbl_xp_fixeddrives(Drive, [MB free]) EXEC master.sys.xp_fixeddrives -- 5 - Initialize the @MBfree value SELECT @MBfree = [MB free] FROM #tbl_xp_fixeddrives WHERE Drive = @Drive -- 6 - Determine if sufficient fre space is available IF @MBfree > @MinMBFree BEGIN RETURN END ELSE BEGIN RAISERROR ('*** ERROR *** - Insufficient disk space.', 16, 1) END -- 7 - DROP TABLE #tbl_xp_fixeddrives DROP TABLE #tbl_xp_fixeddrives SET NOCOUNT OFF GO *** NOTE *** - SQL Server 2000 Version CREATE PROCEDURE dbo.spExec_SufficientDiskSpace @MinMBFree int, @Drive char(1) AS /* ---------------------------------------------------------------------------- -- Object Name: dbo.spExec_SufficientDiskSpace -- Project: Admin Scripts -- Business Process: Monthly Sales Reports -- Purpose: Validate sufficient disk space -- Detailed Description: Validate sufficient disk space based on based on the -- @MBfree and @Drive parameters -- Database: Admin -- Dependent Objects: master.sys.xp_fixeddrives -- Called By: Admin Scripts -- Upstream Systems: Unknown -- Downstream Systems: Unknown -- -------------------------------------------------------------------------------------- -- Rev | CMR | Date Modified | Developer | Change Summary -------------------------------------------------------------------------------------- -- 001 | NA | 03.05.2009 | MSSQLTips | Original code -- */ SET NOCOUNT ON -- 1 - Declare variables DECLARE @MBfree int DECLARE @CMD1 varchar(1000) -- 2 - Initialize variables SET @MBfree = 0 SET @CMD1 = '' -- 3 - Create temp tables CREATE TABLE #tbl_xp_fixeddrives (Drive varchar(2) NOT NULL, [MB free] int NOT NULL) -- 4 - Populate #tbl_xp_fixeddrives INSERT INTO #tbl_xp_fixeddrives(Drive, [MB free]) EXEC master.dbo.xp_fixeddrives -- 5 - Initialize the @MBfree value SELECT @MBfree = [MB free] FROM #tbl_xp_fixeddrives WHERE Drive = @Drive -- 6 - Determine if sufficient fre space is available IF @MBfree > @MinMBFree BEGIN RETURN END ELSE BEGIN RAISERROR ('*** ERROR *** - Insufficient disk space.', 16, 1) END -- 7 - DROP TABLE #tbl_xp_fixeddrives DROP TABLE #tbl_xp_fixeddrives SET NOCOUNT OFF GO
下一步
如果你的组织拥有的程序要求一个很大量的磁盘空间或者大比例的特定磁盘,那么确保在程序开始或者关键点时确认磁盘驱动器具有足够的存储。一次快速检查就可以节约大量的时间,减少烦恼和重新工作。
使用上面列出的存储过程中的master.sys.xp_fixeddrives扩展存储过程是检查可用磁盘空间的其中一种方法。CLR,PowerShell,WMI等等也可以检查磁盘空间,所以选择适合你代码和环境的方法。