MS SQL 日常维护管理常用脚本(一)

时间:2022-10-10 21:40:06

    SQL SERVER 数据库日常维护,管理,巡检过程中你可能经常需要用到一些SQL语句(亦或方法)来查看数据库服务器环境(操作系统版本, 磁盘空间,CPU,RAM信息),数据库信息(数据库版本,实例名称...),数据库对象等。

查看数据库信息

 

查看数据库服务器名称

  方法1:SQL脚本查询,可以通过下面脚本来查询。

  默认实例

默认实例查询
  1. SELECT @@SERVERNAME AS SERVERNAME; 
  2. SELECT SERVERPROPERTY('servername') AS ServerName; 
  3. SELECT srvname AS ServerName FROM sys.sysservers; 
  4. SELECT SERVERPROPERTY('MachineName') AS ServerName

  命名实例

命名实例查询
  1. SELECT SUBSTRING(@@SERVERNAME, 0, CHARINDEX('\', @@SERVERNAME))AS SERVERNAME;
  2.  
  3. SELECT SUBSTRING(CONVERT(VARCHAR(100),SERVERPROPERTY('servername')), 0, CHARINDEX('\',CONVERT(VARCHAR(100),SERVERPROPERTY('servername')))) AS ServerName;
  4.  
  5. SELECT SUBSTRING(srvname, 0, CHARINDEX('\', srvname)) AS ServerName FROM sys.sysservers;
  6.  
  7. SELECT SERVERPROPERTY('MachineName') AS ServerName

 

  方法2:在数据库实例单击右键,选择“属性”——》“常规”选项里面,你可以看到服务器名称(划红线部分)

MS SQL 日常维护管理常用脚本(一)

 

  方法3:都不好意思说了,你懂的。

 

查看数据库实例名称

  方法1:去服务(services.msc)里面查找SQL Server(××××)这样的服务,有多少个就就有多少数据库实例,一般默认实例是SQL Server (MSSQLSERVER)

  方法2:去SQL配置管理器的SQL Server服务配置里面找上面描述的服务。

  方法3:脚本查询,只是截取数据库服务名称的实例名(其实这个还真没必要,通过上面的脚本就可查看实例,注意默认实例)

Code Snippet
  1. SELECT @@SERVICENAME AS InstantName;
  2.  
  3. SELECT ISNULL(SERVERPROPERTY('InstanceName'),'MSSQLSERVER') AS InstanceName;

   下面脚本仅对命名实例有效,默认实例查询处理的是计算机名称

Code Snippet
  1. SELECT SUBSTRING(@@SERVERNAME,CHARINDEX('\', @@SERVERNAME)+1,100) AS InstantName;
  2.  
  3. SELECT SUBSTRING(srvname, CHARINDEX('\', srvname) +1, 100) AS InstantName FROM sys.sysservers;

 

查看数据库版本号

方法1:SQL 1:

Code Snippet
  1. SELECT    SERVERPROPERTY('productversion') AS ProductVersion ,
  2.           SERVERPROPERTY('productlevel') AS ProductLevel ,
  3.           SERVERPROPERTY('edition') AS Edition

方法2:SQL 2: 看起来比较麻烦

Code Snippet
  1. SELECT @@VERSION AS PRODUCT_VERSION;

  Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59

  Copyright (c) 1988-2005 Microsoft Corporation         

Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

如何从 9.00.4035.00 (Intel X86) 读取一些信息呢?

  第一个数字:8 代表2000版本, 9 代表2005版本, 10 代表2008 版本

  第二个数字:50 代表R2版本, 00 代表非R2版本

  第三个数字:如上所示4035中第一个数字4代表打了补丁SP3,其规则如下所示

      1: 代表没有打补丁

      2: 代表打了SP1补丁

      3: 代表打了SP2补丁,以此类推

      035 : 代表相关的hotfix版本,我们在进行升级,备份,恢复一定要看清楚这个版本,只有在同一版本下的相关数据才能进行恢复(同版本备份文件),这点要注意。

方法3:在数据库实例上单击右键,选择“属性”——》“常规”选项里面,你可以看到服务器名称,平台,操作系统,数据库版本信息。

 

查看数据库已经打的补丁

方法1:如上所示,可以通过9.00.4035.00 (Intel X86) 来确定已经数据库已经打的最新补丁SP3。

方法2:在数据库实例上单击右键,选择“属性”——》“常规”选项里面,可以通过看到的版本信息查看补丁

方法3:在SQL配置管理器,找到相应的实例的SQL Server服务,单击右键属性.

MS SQL 日常维护管理常用脚本(一)

 

查看实例数据库的相关信息

查看实例有哪些数据库,创建时间、排序规则.......

  方法1:SQL 查询. 其实在视图sys.databases里面你可以查看很多关于数据库的信息,例如,数据库用户访问设置,数据库的状态......

  SELECT * FROM sys.databases

  方法2: 在Mircrosoft SQL Server Management Studio管理器里面查看。

查看排序规则信息

1:查看实例排序规则

    SELECT SERVERPROPERTY(N'Collation')

2:查看数据库排序规则

    SELECT name, collation_name FROM sys.databases

查询当前数据库的磁盘使用情况

如需要查询其他数据库,则需在前面指定数据库名称

    EXEC sp_spaceused;

查看数据库启动相关参数

    EXEC sp_configure;

查看数据库启动时间

方法1:

Code Snippet
  1. SELECT CONVERT(VARCHAR(30), LOGIN_TIME,120) AS StartDateTime
  2. FROM master..sysprocesses WHERE spid=1

查看所有数据库名称及大小

方法1:

  EXEC sp_helpdb;

方法2:

Code Snippet
  1.   SELECTdatabase_id AS DataBaseId ,
  2.         DB_NAME(database_id) AS DataBaseName ,
  3.         CAST(SUM(SIZE) * 8.0 / 1024 AS DECIMAL(8, 4)) AS [Size(MB)]
  4.     FROMsys.master_files
  5. GROUP BY database_id

 

查看所有数据库用户登录信息

  EXEC sp_helplogins;

查看所有数据库用户所属的角色信息

  EXEC sp_helpsrvrolemember

更改某个数据对象的用户属主

  sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'

注意:更改对象名的任一部分都可能破坏脚本和存储过程。把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本。查看某数据库下,对象级用户权限sp_helprotect

查看链接服务器

  EXEC sp_helplinkedsrvlogin

查看远端数据库用户登录信息

  sp_helpremotelogin

查看数据库下某个数据对象的大小

  sp_spaceused @objname

查看某数据库下某个数据对象的索引信息

  sp_helpindex @objname

查看某数据库下某个数据对象的的约束信息

  sp_helpconstraint @objname

查看表的相关信息

方法1:

    sp_help 'TABLE_NAME'

方法2:

    sp_desc  参考我的博客MS SQL 模仿ORACLE的DESC

修复迁移服务器时孤立用户时

方法1:

  USE {目标数据库}

  EXEC sp_change_users_login 'Update_One', '{目标数据库已存在的用户名}', '{创建的登录用户名}'

方法2

Code Snippet
  1. declare @cmd nvarchar(4000)
  2.  
  3. set @cmd = N'exec [?].sys.sp_change_users_login @Action = ''Auto_Fix''
  4.  
  5. , @UserNamePattern = ''qa''
  6.  
  7. , @LoginName = null
  8.  
  9. , @Password = ''abc'' '
  10.  
  11. exec sp_msforeachdb@cmd

查看数据库数据文件情况

查看数据库实例各个数据库的数据文件信息

方法1: 选择某个数据库,然后单击右键属性...(后面我就不说了,不知道的自己百度)

方法2:SQL

Code Snippet
  1. SELECT database_id                    AS DataBaseId   ,
  2.       DB_NAME(database_id)           AS DataBaseName ,
  3.       Name                           AS LogicalName  ,
  4.       type_desc                      AS FileTypeDesc ,
  5.       Physical_Name                  AS PhysicalName ,
  6.       State_Desc                     AS StateDesc ,
  7.       CASE WHEN max_size = 0  THEN N'不允许增长'
  8.            WHEN max_size = -1 THEN N'自动增长'
  9.            ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2)) + 'G'
  10.       END                            AS MaxSize ,
  11.       CASE WHEN is_percent_growth = 1
  12.            THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
  13.            ELSE RTRIM(CAST(Growth AS CHAR(10))) + 'M'
  14.       END                            AS Growth ,
  15.       Is_Read_Only                   AS IsReadOnly ,
  16.       Is_Percent_Growth              AS IsPercentGrowth ,
  17.       CAST(size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) AS [Size(GB)]
  18.   FROM sys.master_files

查看单个数据库的数据文件信息:

      SQL 1:上面SQL加上查询条件

      SQL 2:

Code Snippet
  1. SELECT    Name                                     AS DataBaseName ,
  2.           Physical_Name                            AS PhysicalName ,
  3.           type_desc                                AS FileTypeDesc ,
  4.           State_Desc                               AS StateDesc    ,
  5.           (( size * 8.0 ) / 1024 / 1024 )          AS [Size(GB)]   ,
  6.           CASE WHEN max_size = 0  THEN N'不允许增长'
  7.                WHEN max_size = -1 THEN N'自动增长'
  8.                ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2)) + 'G'
  9.           END AS MaxSize ,
  10.           CASE WHEN is_percent_growth = 1
  11.                THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
  12.                ELSE RTRIM(CAST(Growth AS CHAR(10))) + 'M'
  13.           END AS Growth ,
  14.           Is_Read_Only                             AS IsReadOnly      ,
  15.           Is_Percent_Growth                        AS IsPercentGrowth ,
  16.           CAST(size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) AS [Size(GB)]
  17. FROM      sys.database_files ;

      SQL 3:

Code Snippet
  1. SELECT fileid        AS FileId       ,
  2.         groupid      AS GroupId      ,
  3.         size         AS DataBaseSize ,
  4.         growth       AS Growth       
  5.         perf         AS Perf         ,
  6.         name         AS NAME         ,
  7.         filename     AS FILENAME
  8. FROM   MESDB.dbo.sysfiles ;

查看数据库服务器各数据库日志文件的大小及利用率/状态

    DBCC SQLPERF(LOGSPACE)

查看当前数据库的文件状态

    EXEC ('DBCC showfilestats') 

查看数据库存储过程

查看有哪些存储过程

方法1:

  EXEC sp_stored_procedures;

方法2:

  SELECT * FROM sys.procedures;

方法3:

  SELECT * FROM sys.sysobjects WHERE xtype='P';

查看存储过程基本信息

EXEC sp_help 'dbo.sp_who_lock'

查看存储过程源代码

方法1:

    EXEC sp_helptext 'procedureName'

方法2:

    SELECT  *

    FROM    SYS.SQL_MODULES

    WHERE   object_id = OBJECT_ID(N'procedureName')

方法3:

Code Snippet
  1.  SELECT s.text                     AS ProcedureText ,
  2.         s.encrypted                AS Encrypted ,
  3.         s.number                   AS number ,
  4.         CONVERT(NCHAR(2), o.xtype) AS xtype ,
  5.         DATALENGTH(s.text)         AS ProcedureLen
  6.     FROMdbo.syscomments s ,
  7.         dbo.sysobjects o
  8.    WHEREo.id = s.id
  9.         AND s.id = OBJECT_ID(N'procedureName')
  10. ORDER BY s.number ,
  11.         s.colid
  12. OPTION  ( ROBUST PLAN )

 

服务器环境信息

查看数据库所在机器操作系统参数

  方法1:

    EXEC master..xp_msver

详解:xp_msver返回有关 Microsoft SQL Server 的版本信息。xp_msver 还返回有关服务器的实际内部版本号的信息以及服务器环境的有关信息,例如处理器类型(不能获取具体型号), RAM 的容量等等。用脚本基本上很难获取详细的硬件信息。

  方法2:登录服务器,直接查看服务器信息。

查看数据库服务器磁盘分区剩余空间。

  方法1:

    EXEC master.dbo.xp_fixeddrives;

  方法2:登录服务器直接查看或用工具

  方法3:请看MS SQL 监控磁盘空间告警里面介绍的方法

查看数据库服务器磁盘容量信息

  方法1:请看MS SQL 监控磁盘空间告警里面介绍的方法

  方法2:登录服务器直接查看或用工具

查看数据库服务器CPU/内存的大概信息

 

Code Snippet
  1.  SELECT cpu_count                          AS [Logical CPU Count] ,
  2.         hyperthread_ratio                  AS [Hyperthread Ratio] ,
  3.         cpu_count / hyperthread_ratio      AS [Physical CPU Count],
  4.         physical_memory_in_bytes / 1048576 AS [Physical Memory (MB)] ,
  5.         sqlserver_start_time
  6.     FROMsys.dm_os_sys_info
  7. OPTION  ( RECOMPILE ) ;

 

小结:用SQL查看服务器硬件信息,似乎不是个好主意,很难得到精确地信息,例如CPU型号、内存条的频率