在sql SERVER中如何通过sql语句获取服务器硬件和系统信息呢?下面介绍一下如何通过sql语句获取处理器(cpu)、内存(Memory)、磁盘(Disk)以及操作系统相关信息。如有不足和遗漏,敬请补充。谢谢!
一:查看数据库服务器cpu的信息
sql;">
EXEC xp_instance_regread
'HKEY_LOCAL_MACHINE','HARDWARE\DESCRIPTION\System\CentralProcessor\0','ProcessorNameString';@H_
301_11@
sql;">
/*************************************************************************************
--
cpu_count :指定系统中的逻辑
cpu 数
--hyperthread_ratio :指定一个物理处理器包公开的逻辑内核数与物理内核数的比.虚拟机
-- 中可以表示每个虚拟插槽的核数。虚拟中[Physical
cpu Count]其实
-- 表示虚拟插槽数
*************************************************************************************/
SELECT s.
cpu_count AS [Loggic
cpu Count],s.hyperthread_ratio AS [Hyperthread Ratio],s.
cpu_count/s.hyperthread_ratio AS [Physical
cpu Count]
FROM sys.dm_os_sys_info s OPTION (RECOMPILE);@H_
301_11@
sql;">
CREATE TABLE #TempTable
(
[Index] VARCHAR(2000),[Name] VARCHAR(2000),[Internal_Value] VARCHAR(2000),[Character_Value] VARCHAR(2000)
);
INSERT INTO #TempTable
EXEC xp_msver;
SELECT Internal_Value AS Virtual
cpuCount
FROM #TempTable
WHERE Name = 'ProcessorCount';
DROP TABLE #TempTable;
GO@H_
301_11@
---sql 4:在老外博客中看到一个计算cpu相关信息的sql,不过虚拟机计算有点小问题,我修改了一下。
sql;">
DECLARE @xp_msver TABLE (
[idx] [int] NULL,[c_name] [varchar](100) NULL,[int_val] [float] NULL,[c_val] [varchar](128) NULL
)
INSERT INTO @xp_msver
EXEC ('[master]..[xp_msver]');;
WITH [ProcessorInfo]
AS (
SELECT ([
cpu_count] / [hyperthread_ratio]) AS [number_of_physical_
cpus],CASE
WHEN hyperthread_ratio =
cpu_count
THEN
cpu_count
ELSE (([
cpu_count] - [hyperthread_ratio]) / ([
cpu_count] / [hyperthread_ratio]))
END AS [number_of_cores_per_
cpu],CASE
WHEN hyperthread_ratio =
cpu_count
THEN
cpu_count
ELSE ([
cpu_count] / [hyperthread_ratio]) * (([
cpu_count] - [hyperthread_ratio]) / ([
cpu_count] / [hyperthread_ratio]))
END AS [total_number_of_cores],[
cpu_count] AS [number_of_virtual_
cpus],(
SELECT [c_val]
FROM @xp_msver
WHERE [c_name] = 'Platform'
) AS [
cpu_category]
FROM [sys].[dm_os_sys_info]
)
SELECT [number_of_physical_
cpus],[number_of_cores_per_
cpu],[total_number_of_cores],[number_of_virtual_
cpus],LTRIM(RIGHT([
cpu_category],CHARINDEX('x',[
cpu_category]) - 1)) AS [
cpu_category]
FROM [ProcessorInfo]
---查看虚拟机
cpu信息
DECLARE @xp_msver TABLE (
[idx] [int] NULL,[hyperthread_ratio] AS [number_of_cores_per_
cpu],[
cpu_count] AS [total_number_of_cores],[
cpu_category]) - 1)) AS [
cpu_category]
FROM [ProcessorInfo]@H_
301_11@
二:查看数据库服务器内存的信息
能否通过sql语句获取服务器的物理内存大小?内存条型号?虚拟内存大小?内存使用情况? 目前我所知道的只能通过sql语句获取服务器物理内存大小,内存的使用情况。 至于内存条型号,系统虚拟内存大小,暂时好像还无法通过sql语句获取。
查看服务器的物理内存情况
如下所示,从sys.dm_os_sys_info里面获取的physical_memory_in_bytes 或physical_memory_kb 的值总是低于实际物理内存。暂时不清楚具体原因(还未查到相关资料),所以计算大小有出入,要获取实际的物理内存,就必须借助CEILING函数。
--sql 1:获取数据库服务器物理内存数(适用于所有版本)
sql;">
CREATE TABLE #TempTable
(
[Index] VARCHAR(2000),[Character_Value] VARCHAR(2000)
);
INSERT INTO #TempTable
EXEC xp_msver;
SELECT Internal_Value/1024 AS PhysicalMemory
FROM #TempTable
WHERE Name = 'PhysicalMemory';
DROP TABLE #TempTable;
GO@H_
301_11@
---sql 2:适用于sql Server 2005、sql Server 2008
sql;">
SELECT CEILING(physical_memory_in_bytes*1.0/1024/1024/1024) AS [Physical Memory Size]
FROM sys.dm_os_sys_info OPTION (RECOMPILE)
SELECT physical_memory_in_bytes*1.0/1024/1024/1024,physical_memory_in_bytes AS [Physical Memory Size]
FROM sys.dm_os_sys_info OPTION (RECOMPILE)@H_
301_11@
---sql 3:适用于sql Server 2012 到 sql Server 2014
sql;">
SELECT CEILING(physical_memory_kb*1.0/1024/1024) AS [Physical Memory Size]
FROM sys.dm_os_sys_info OPTION (RECOMPILE);@H_
301_11@
---sql 4:适用于sql Server 2008以及以上的版本:查看物理内存大小,已经使用的物理内存以及还剩下的物理内存。
sql;">
SELECT CEILING(total_physical_memory_kb * 1.0 / 1024 / 1024) AS [Physical Memory Size],CAST(available_physical_memory_kb * 1.0 / 1024 / 1024
AS DECIMAL(8,4)) AS [Unused Physical Memory],CAST(( total_physical_memory_kb - available_physical_memory_kb ) * 1.0
/ 1024 / 1024 AS DECIMAL(8,4)) AS [Used Physical Memory],CAST(system_cache_kb*1.0 / 1024/1024 AS DECIMAL(8,4)) AS [System Cache Size]
FROM sys.dm_os_sys_memory@H_
301_11@
三:查看数据库服务器硬盘的信息
如下所示,我们可以通过下面脚本获取服务器的各个磁盘的使用情况。但是无法获取磁盘的型号、转速之类的信息。
sql;">
SET NOCOUNT ON
DECLARE @Result INT;
DECLARE @objectInfo INT;
DECLARE @DriveInfo CHAR(1);
DECLARE @TotalSize VARCHAR(20);
DECLARE @OutDrive INT;
DECLARE @UnitMB BIGINT;
DECLARE @FreeRat FLOAT;
SET @UnitMB = 1048576;
--创建临时表保存服务器磁盘容量信息
CREATE TABLE #DiskCapacity
(
[DiskCD] CHAR(1),FreeSize INT,TotalSize INT
);
INSERT #DiskCapacity([DiskCD],FreeSize )
EXEC master.dbo.xp_fixeddrives;
EXEC sp_configure 'show advanced options',1
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures',1;
RECONFIGURE WITH OVERRIDE;
EXEC @Result = master.sys.sp_OACreate 'Scripting.FileSystemObject',@objectInfo OUT;
DECLARE CR_DiskInfo CURSOR LOCAL FAST_FORWARD
FOR
SELECT DiskCD FROM #DiskCapacity
ORDER by DiskCD
OPEN CR_DiskInfo;
FETCH NEXT FROM CR_DiskInfo INTO @DriveInfo
WHILE @@FETCH_STATUS=0
BEGIN
EXEC @Result = sp_OAMethod @objectInfo,'GetDrive',@OutDrive OUT,@DriveInfo
EXEC @Result = sp_OAGetProperty @OutDrive,'TotalSize',@TotalSize OUT
UPDATE #DiskCapacity
SET TotalSize=@TotalSize/@UnitMB
WHERE DiskCD=@DriveInfo
FETCH NEXT FROM CR_DiskInfo INTO @DriveInfo
END
CLOSE CR_DiskInfo
DEALLOCATE CR_DiskInfo;
EXEC @Result=sp_OADestroy @objectInfo
EXEC sp_configure 'show advanced options',0;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options',0
RECONFIGURE WITH OVERRIDE;
SELECT DiskCD AS [Drive CD],STR(TotalSize*1.0/1024,6,2) AS [Total Size(GB)],STR((TotalSize - FreeSize)*1.0/1024,2) AS [Used Space(GB)],STR(FreeSize*1.0/1024,2) AS [Free Space(GB)],STR(( TotalSize - FreeSize)*1.0/(TotalSize)* 100.0,2) AS [Used Rate(%)],STR(( FreeSize * 1.0/ ( TotalSize ) ) * 100.0,2) AS [Free Rate(%)]
FROM #DiskCapacity;
DROP TABLE #DiskCapacity;@H_
301_11@
四:查看操作系统信息
通过下面sql语句,我们可以查看操作系统版本、补丁、语言等信息
sql;">
--创建临时表保存语言版本信息
CREATE TABLE #Language
(
[LanguageDtl] NVARCHAR(64),[os_language_version] INT
);
INSERT INTO #Language
SELECT 'English - United States',1033 UNION ALL
SELECT 'English - United Kingdom',2057 UNION ALL
SELECT 'Chinese - People''s Republic of China',2052 UNION ALL
SELECT 'Chinese - Singapore',4100 UNION ALL
SELECT 'Chinese - Taiwan',1028 UNION ALL
SELECT 'Chinese - Hong Kong SAR',3076 UNION ALL
SELECT 'Chinese - Macao SAR',5124;
WITH SystemVersion(SystemInfo,ReleaseNo)
AS
(
SELECT 'Windows 10','10.0*'
UNION ALL
SELECT 'Windows Server 2016 Technical Preview','10.0*'
UNION ALL
SELECT 'Windows 8.1','6.3*'
UNION ALL
SELECT 'Windows Server 2012 R2','6.3'
UNION ALL
SELECT 'Windows 8','6.2'
UNION ALL
SELECT 'Windows Server 2012','6.2'
UNION ALL
SELECT 'Windows 7','6.1'
UNION ALL
SELECT 'Windows Server 2008 R2','6.1'
UNION ALL
SELECT 'Windows Server 2008','6.0'
UNION ALL
SELECT 'Windows Vista','6.0'
UNION ALL
SELECT 'Windows Server 2003 R2','5.2'
UNION ALL
SELECT 'Windows Server 2003','5.2'
UNION ALL
SELECT 'Windows XP 64-Bit Edition','5.2'
UNION ALL
SELECT 'Windows XP','5.1'
UNION ALL
SELECT 'Windows 2000','5.0'
)
SELECT s.SystemInfo,w.windows_service_pack_level,l.LanguageDtl
FROM sys.dm_os_windows_info w
INNER JOIN SystemVersion s ON w.windows_release=s.ReleaseNo
INNER JOIN #Language l ON l.os_language_version = w.os_language_version;
DROP TABLE #Language;@H_
301_11@
1:如上所示,临时表#Language的数据此处只列了几条常用的数据,如需全部数据,参考自行补充。
2:操作系统的版本信息的数据来源于
有可能出现不同操作系统具有相同Version number值,例如Windows 7 和Windows Server 2008 R2的Version numberd都为6.1。导致下面查询结果出现多条记录(如下所示)。一般要酌情判断(如果生产服务器都为Windows服务器,可以剔除Windows XP、Windows 7这类数据)。
sql语句获得服务器名称和IP地址
使用sql语句获得服务器名称和IP地址 获取服务器名称:
sql;">
SELECT SERVERPROPERTY('MachineName')
select @@SERVERNAME
select HOST_NAME()@H_
301_11@
获取IP地址可以使用xp_cmdshell执行ipconfig命令:
sql;">
--开启xp_cmdshell
exec sp_configure'show advanced options',1
reconfigure with override
exec sp_configure'xp_cmdshell',1
reconfigure with override
exec sp_configure'show advanced options',0
reconfigure with override
go
begin
declare @ipline varchar(200)
declare @pos int
declare @ip varchar(40)
set nocount on
set @ip = null
if object_id('tempdb..#temp') is not null drop table #temp
create table #temp(ipline varchar(200))
insert #temp exec master..xp_cmdshell'ipconfig'
select @ipline = ipline
from #temp
where upper(ipline) like '%IPv4 地址%'--这里需要注意一下,系统不同这里的匹配值就不同
if @ipline is not null
begin
set @pos = charindex(':',@ipline,1);
set @ip = rtrim(ltrim(substring(@ipline,@pos + 1,len(@ipline) - @pos)))
end
select distinct(rtrim(ltrim(substring(@ipline,len(@ipline) - @pos)))) as ipaddress from #temp
drop table #temp
set nocount off
end
go @H_
301_11@
但是很多情况下由于安全问题是不允许使用xp_cmdshell,可以通过查询SYS.DM_EXEC_CONNECTIONS :
sql;">
SELECT SERVERNAME = CONVERT(NVARCHAR(128),SERVERPROPERTY('SERVERNAME')),LOCAL_NET_ADDRESS AS 'IPAddressOf
sqlServer',CLIENT_NET_ADDRESS AS 'ClientIPAddress'
FROM SYS.DM_EXEC_CONNECTIONS WHERE SESSION_ID = @@SPID@H_
301_11@