SQL Server數(shù)據(jù)庫日常維護命令與腳本

1. 查看數(shù)據(jù)庫信息

  1. 查看數(shù)據(jù)庫服務(wù)器名稱
-- 默認實例
SELECT @@SERVERNAME AS SERVERNAME; 
SELECT SERVERPROPERTY('servername') AS ServerName; 
SELECT srvname AS ServerName FROM sys.sysservers; 
SELECT SERVERPROPERTY('MachineName') AS ServerName;

-- 命名實例
SELECT SUBSTRING(@@SERVERNAME, 0, CHARINDEX('\', @@SERVERNAME))AS SERVERNAME;

SELECT SUBSTRING(CONVERT(VARCHAR(100),SERVERPROPERTY('servername')), 0, CHARINDEX('\',CONVERT(VARCHAR(100),SERVERPROPERTY('servername')))) AS ServerName;

SELECT SUBSTRING(srvname, 0, CHARINDEX('\', srvname)) AS ServerName FROM sys.sysservers;

SELECT SERVERPROPERTY('MachineName') AS ServerName;
  1. 查看數(shù)據(jù)庫實例名稱
SELECT @@SERVICENAME AS InstantName;

SELECT ISNULL(SERVERPROPERTY('InstanceName'),'MSSQLSERVER') AS InstanceName;

-- 只對命名實例有效
SELECT SUBSTRING(@@SERVERNAME,CHARINDEX('\', @@SERVERNAME)+1,100) AS InstantName;

SELECT SUBSTRING(srvname, CHARINDEX('\', srvname) +1, 100) AS InstantName FROM sys.sysservers;
  1. 查看數(shù)據(jù)庫版本號
SELECT  SERVERPROPERTY('productversion') AS ProductVersion ,
        SERVERPROPERTY('productlevel') AS ProductLevel ,
        SERVERPROPERTY('edition') AS Edition;
        
SELECT @@VERSION AS PRODUCT_VERSION;
  1. 查看數(shù)據(jù)庫實例
SELECT * FROM sys.databases;
  1. 查看排序規(guī)則信息
-- 實例排序規(guī)則
SELECT SERVERPROPERTY(N'Collation');

-- 數(shù)據(jù)庫排序規(guī)則
SELECT name, collation_name FROM sys.databases;
  1. 查詢當(dāng)前數(shù)據(jù)庫的磁盤使用情況
EXEC sp_spaceused;

-- 查看某個數(shù)據(jù)對象的大小
EXEC sp_spaceused @objname;
  1. 查看數(shù)據(jù)庫啟動的相關(guān)參數(shù)
 EXEC sp_configure;
  1. 查看服務(wù)器啟動時間
SELECT CONVERT(VARCHAR(30), LOGIN_TIME,120) AS StartDateTime
FROM master..sysprocesses WHERE spid=1;
  1. 查看所有數(shù)據(jù)庫名稱與大小
-- 方法1
EXEC sp_helpdb;

-- 方法2
SELECT database_id AS DataBaseId ,
       DB_NAME(database_id) AS DataBaseName ,
       CAST(SUM(SIZE) * 8.0 / 1024 AS DECIMAL(8, 4)) AS [Size(MB)]
  FROM sys.master_files 
  GROUP BY database_id; 
  1. 查看數(shù)據(jù)庫的用戶和進程信息
-- 查看所有
EXEC sp_who;

-- 查看活動用戶和進程
EXEC sp_who 'active';
  1. 查看所有數(shù)據(jù)庫用戶登錄信息
EXEC sp_helplogins;
  1. 查看所有數(shù)據(jù)庫用戶所屬的角色信息
EXEC sp_helpsrvrolemember;
  1. 更改某個數(shù)據(jù)對象的用戶屬主

注意:更改對象名的任一部分都可能破壞腳本和存儲過程。把一臺服務(wù)器上的數(shù)據(jù)庫用戶登錄信息備份出來可以用add_login_to_aserver腳本。查看某數(shù)據(jù)庫下,對象級用戶權(quán)限sp_helprotect

EXEC sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
  1. 查看鏈接服務(wù)器
EXEC sp_helplinkedsrvlogin;
  1. 查看遠端數(shù)據(jù)庫用戶登錄信息
EXEC sp_helpremotelogin;
  1. 查看某數(shù)據(jù)庫下某個數(shù)據(jù)對象的索引信息
EXEC sp_helpindex @objname;
  1. 查看某數(shù)據(jù)庫下某個數(shù)據(jù)對象的的約束信息
EXEC sp_helpconstraint @objname;
  1. 查看表的相關(guān)信息
EXEC sp_help 'TABLE_NAME';
  1. 查看數(shù)據(jù)庫數(shù)據(jù)文件情況
-- 查看數(shù)據(jù)庫實例各個數(shù)據(jù)庫的數(shù)據(jù)文件信息
SELECT database_id                 AS DataBaseId,
    DB_NAME(database_id)           AS DataBaseName,
    Name                           AS LogicalName,
    type_desc                      AS FileTypeDesc,
    Physical_Name                  AS PhysicalName,
    State_Desc                     AS StateDesc ,
    CASE WHEN max_size = 0  THEN N'不允許增長'
         WHEN max_size = -1 THEN N'自動增長'
         ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2)) + 'G'
    END                            AS MaxSize ,
    CASE WHEN is_percent_growth = 1
         THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
         ELSE RTRIM(CAST(Growth AS CHAR(10))) + 'M'
    END                            AS Growth ,
    Is_Read_Only                   AS IsReadOnly ,
    Is_Percent_Growth              AS IsPercentGrowth ,
    CAST(size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) AS [Size(GB)]
FROM sys.master_files;

-- 查看單個數(shù)據(jù)庫的數(shù)據(jù)文件信息
SELECT  Name                    AS DataBaseName,
        Physical_Name           AS PhysicalName,
        type_desc               AS FileTypeDesc,
        State_Desc              AS StateDesc,
        (( size * 8.0 ) / 1024 / 1024 )   AS [Size(GB)],
        CASE WHEN max_size = 0  THEN N'不允許增長'
             WHEN max_size = -1 THEN N'自動增長'
             ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2)) + 'G'
        END AS MaxSize ,
        CASE WHEN is_percent_growth = 1
             THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
             ELSE RTRIM(CAST(Growth AS CHAR(10))) + 'M'
        END AS Growth ,
        Is_Read_Only                             AS IsReadOnly      ,
        Is_Percent_Growth                        AS IsPercentGrowth ,
        CAST(size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) AS [Size(GB)]
FROM  sys.database_files;

-- 通過數(shù)據(jù)庫名稱查看數(shù)據(jù)文件
SELECT fileid      AS FileId,
      groupid      AS GroupId,
      size         AS DataBaseSize,
      growth       AS Growth, 
      perf         AS Perf,
      name         AS NAME,
      filename     AS FILENAME
FROM  <DatabaseName>.dbo.sysfiles ;
  1. 查看數(shù)據(jù)庫服務(wù)器各數(shù)據(jù)庫日志文件的大小及利用率/狀態(tài)
DBCC SQLPERF(LOGSPACE);

或

EXEC ('DBCC SQLPERF(LOGSPACE)');
  1. 查看當(dāng)前數(shù)據(jù)庫的文件狀態(tài)
EXEC ('DBCC showfilestats');
  1. 查看數(shù)據(jù)庫存儲過程
-- 方法1
EXEC sp_stored_procedures;

-- 方法2
SELECT * FROM sys.procedures;

-- 方法3
SELECT * FROM sys.sysobjects WHERE xtype='P';
  1. 查看存儲過程基本信息
EXEC sp_help 'sp_who';
  1. 查看存儲過程源代碼:
-- 方法1
EXEC sp_helptext '<procedureName>'

-- 方法2
SELECT  * FROM SYS.SQL_MODULES
WHERE object_id = OBJECT_ID(N'<procedureName>');

-- 方法3
SELECT s.text                     AS ProcedureText,
       s.encrypted                AS Encrypted,
       s.number                   AS number,
       CONVERT(NCHAR(2), o.xtype) AS xtype,
       DATALENGTH(s.text)         AS ProcedureLen
 FROM dbo.syscomments s, dbo.sysobjects o
 WHERE o.id = s.id AND s.id = OBJECT_ID(N'procedureName')
 ORDER BY s.number, s.colid
 OPTION  ( ROBUST PLAN );
  1. 檢查數(shù)據(jù)庫完整性
DBCC checkdb(<DBName>)

-- Tablock選項提高速度
DBCC checkdb(<DBName>) with tablock

2. 查看服務(wù)器環(huán)境信息

  1. 查看數(shù)據(jù)庫所在機器操作系統(tǒng)參數(shù)
EXEC master..xp_msver;

詳解:xp_msver返回有關(guān) Microsoft SQL Server 的版本信息。
xp_msver 還返回有關(guān)服務(wù)器的實際內(nèi)部版本號的信息以及服務(wù)器環(huán)境的有關(guān)信息,例如處理器類型(不能獲取具體型號), RAM 的容量等等。

  1. 查看數(shù)據(jù)庫服務(wù)器磁盤分區(qū)剩余空間。
EXEC master.dbo.xp_fixeddrives;
  1. 查看數(shù)據(jù)庫服務(wù)器CPU/內(nèi)存的信息
SELECT  cpu_count                     AS [Logical CPU Count] ,
      hyperthread_ratio               AS [Hyperthread Ratio] ,
      cpu_count / hyperthread_ratio   AS [Physical CPU Count],
      physical_memory_kb / 1024       AS [Physical Memory (MB)] ,
      sqlserver_start_time
FROM sys.dm_os_sys_info
OPTION  ( RECOMPILE ) ;

3. 數(shù)據(jù)庫備份

  1. 備份數(shù)據(jù)庫
declare @sql varchar(255)
set @sql = 'backup database <DBName> to disk = ''<File Path>' + rtrim(convert(varchar, getdate(), 112)) + '.bak''';
exec(@sql);
  1. 刪除15天前備份文件
declare @sql varchar(255);
set @sql = 'del <File Path>' + rtrim(convert(varchar, getdate()-15), 112)) + '.bak''';
exec master..xp_cmdshell @sql;
  1. 完全備份
USE Master
GO 

declare @str varchar(100) 
set @str='<FilePath>'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),'',''),':','')+'.bak' 
BACKUP DATABASE <DBName> TO DISK=@str 
WITH (
    RETAINDAYS=15,
    NOFORMAT,
    NOINIT,
    NAME=N'Demo完整備份',
    SKIP,
    NOREWIND, 
    NOUNLOAD,
    STATS=10
)
GO
  1. 差異備份
USE Master 
GO  

declare @str varchar(100)  

set @str='<FilePath>'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),'',''),':','')+'.diff'

BACKUP DATABASE <DBName> TO DISK=@str 
WITH (
  DIFFERENTIAL,
  RETAINDAYS=8,
  NOFORMAT,
  NOINIT, 
  NAME=N'Demo差異備份',
  SKIP,
  NOREWIND, 
  NOUNLOAD,
  STATS=10
)
GO 
  1. 日志備份
USE Master 
GO  

declare @str varchar(100)  

set @str='<FilePath>'+replace(replace(replace(convert(varchar,getdate(),20),'-',''),'',''),':','')+'.trn'  

BACKUP LOG <DBName> TO DISK=@str  
WITH (
    RETAINDAYS=3,
    NOFORMAT,
    NOINIT, 
    NAME=N'Demo 日志備份',
    SKIP,
    NOREWIND, 
    NOUNLOAD,
    STATS=10 
)
GO 

4. 數(shù)據(jù)庫常用操作

  1. 數(shù)據(jù)庫重命名、修改恢復(fù)模式、修改用戶模式
-- 數(shù)據(jù)庫重命名
ALTER DATABASE <DBName> MODIFY NAME = <NewDBName>

--設(shè)置數(shù)據(jù)庫為完整恢復(fù)模式
alter database <DBName> set recovery full

--只允許一個用戶訪問數(shù)據(jù)庫, 并指定10秒后回滾事務(wù)  
alter database <DBName> set single_user   
  with rollback after 10 seconds

--只有sysadmin,dbcreator,db_owner角色的成員可以訪問數(shù)據(jù)庫
-- rollback immediate: 立即回滾事務(wù)
alter database <DBName> set restricted_user   
  with rollback immediate

--多用戶模式
--不等待立即改變,如不能立即完成,那么會導(dǎo)致執(zhí)行錯誤 
alter database <DBName> set multi_user  
 with no_wait       
  1. 擴展數(shù)據(jù)庫:增加文件組、增加文件、修改文件大小、修改文件的邏輯名稱
--添加文件組
ALTER DATABASE <DBName> ADD FILEGROUP <FileGroup>

--添加數(shù)據(jù)文件
ALTER DATABASE <DBName>
ADD FILE
(
  NAME = <FileName>,
  FILENAME = '<FilePath>',
  SIZE = 1mb,
  MAXSIZE = 10mb,
  FILEGROWTH = 1mb
)
TO FILEGROUP <FileGroup>

--添加日志文件
ALTER DATABASE <DBName>
ADD LOG FILE
(
  NAME = <LogName>,
  FILENAME = '<LogFilePath>',
  SIZE = 1MB,
  MAXSIZE = 10MB,
  FILEGROWTH = 100KB
)

--修改數(shù)據(jù)文件的大小,增長大小,最大大小
ALTER DATABASE <DBName>
MODIFY FILE
(
  NAME = <FileName>,
  SIZE = 2MB, --必須大于之前的大小,否則報錯
  MAXSIZE= 8MB,
  FILEGROWTH = 10%
)

--修改數(shù)據(jù)文件或日志文件的邏輯名稱
ALTER DATABASE <DBName>
MODIFY FILE
(
  NAME = <FileName>,
  NEWNAME = <NewFileName>
)
  1. 移動文件
-- 由于在SQL Server中文件組、文件不能離線
-- 所以必須把整個數(shù)據(jù)庫設(shè)置為離線
checkpoint
go

ALTER DATABASE <DBName>
SET OFFLINE
go

--修改文件名稱
ALTER DATABASE <DBName>
MODIFY FILE
(
  NAME = <FileName>,
  FILENAME = '<FilePath>'
)
go

--設(shè)置數(shù)據(jù)庫在線
ALTER DATABASE <DBName>
SET ONLINE
  1. 設(shè)置默認文件組、只讀文件組
--設(shè)置默認文件組
ALTER DATABASE <DBName>
MODIFY FILEGROUP <FileGroup> DEFAULT

--設(shè)為只讀文件組
--如果文件已經(jīng)是某個屬性,不能再次設(shè)置相同屬性
ALTER DATABASE <DBName>
MODIFY FILEGROUP <FileGroup> READ_WRITE
  1. 收縮數(shù)據(jù)庫、收縮文件
--收縮數(shù)據(jù)庫  
DBCC SHRINKDATABASE(
  'test',    --要收縮的數(shù)據(jù)庫名稱或數(shù)據(jù)庫ID  
  10         --收縮后,數(shù)據(jù)庫文件中空間空間占用的百分比  
)  
 
DBCC SHRINKDATABASE(
  'test',    --要收縮的數(shù)據(jù)庫名稱或數(shù)據(jù)庫ID
  10,        --收縮后,數(shù)據(jù)庫文件中空閑空間占用的百分比
  NOTRUNCATE --在收縮時,通過數(shù)據(jù)移動來騰出自由空間  
)  

DBCC SHRINKDATABASE(
  'test',      --要收縮的數(shù)據(jù)庫名稱或數(shù)據(jù)庫ID
  10,          --收縮后,數(shù)據(jù)庫文件中空間空間占用的百分比
  TRUNCATEONLY --在收縮時,只是把文件尾部的空閑空間釋放  
)

--收縮文件  
DBCC SHRINKFILE(
  wc_fg8,   --要收縮的數(shù)據(jù)文件邏輯名稱
  7         --要收縮的目標(biāo)大小,以MB為單位  
)  
                 
DBCC SHRINKFILE(
  wc_fg8,   --要收縮的數(shù)據(jù)文件邏輯名稱
  EMPTYFILE --清空文件,清空文件后,才可以刪除文件  
)
  1. 刪除文件、刪除文件組
  • 要刪除文件,必須要先把文件上的數(shù)據(jù)刪除,或者移動到其他文件或文件組上

    --刪除數(shù)據(jù)后,必須要清空文件的內(nèi)容
    DBCC SHRINKFILE(<FileName>,EMPTYFILE)
    
    --刪除文件,同時也在文件系統(tǒng)底層刪除了文件
    ALTER DATABASE <DBName>
    REMOVE FILE <FileName>
    
  • 要刪除文件組,必須先刪除所有文件

    --最后刪除文件組
    ALTER DATABASE <DBName>
    REMOVE FILEGROUP <FileGroupName>
    
  1. 重新組織索引
-- 重新組織索引
ALTER INDEX [IndexName] ON [TableName] 
REORGANIZE 
WITH ( LOB_COMPACTION = ON )

-- 批量生成重組索引
use test
go

select 'DBCC INDEXDEFRAG('+db_name()+','+o.name+','+i.name + ');'
      --,db_name(),
      --o.name,
      --i.name,
      --i.*
 from sysindexes i
 inner join sysobjects o on i.id = o.id
 where o.xtype = 'U'
    and i.indid >0
    and charindex('WA_Sys',i.name) = 0
  1. 重建索引
ALTER INDEX [IndexName] ON [TableName] 
REBUILD PARTITION = ALL
WITH ( 
     PAD_INDEX  = OFF, 
     STATISTICS_NORECOMPUTE  = OFF, 
     ALLOW_ROW_LOCKS  = ON, 
     ALLOW_PAGE_LOCKS  = ON, 
     ONLINE = OFF, 
     SORT_IN_TEMPDB = OFF 
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容