1. 查看數(shù)據(jù)庫信息
- 查看數(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;
- 查看數(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;
- 查看數(shù)據(jù)庫版本號
SELECT SERVERPROPERTY('productversion') AS ProductVersion ,
SERVERPROPERTY('productlevel') AS ProductLevel ,
SERVERPROPERTY('edition') AS Edition;
SELECT @@VERSION AS PRODUCT_VERSION;
- 查看數(shù)據(jù)庫實例
SELECT * FROM sys.databases;
- 查看排序規(guī)則信息
-- 實例排序規(guī)則
SELECT SERVERPROPERTY(N'Collation');
-- 數(shù)據(jù)庫排序規(guī)則
SELECT name, collation_name FROM sys.databases;
- 查詢當(dāng)前數(shù)據(jù)庫的磁盤使用情況
EXEC sp_spaceused;
-- 查看某個數(shù)據(jù)對象的大小
EXEC sp_spaceused @objname;
- 查看數(shù)據(jù)庫啟動的相關(guān)參數(shù)
EXEC sp_configure;
- 查看服務(wù)器啟動時間
SELECT CONVERT(VARCHAR(30), LOGIN_TIME,120) AS StartDateTime
FROM master..sysprocesses WHERE spid=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;
- 查看數(shù)據(jù)庫的用戶和進程信息
-- 查看所有
EXEC sp_who;
-- 查看活動用戶和進程
EXEC sp_who 'active';
- 查看所有數(shù)據(jù)庫用戶登錄信息
EXEC sp_helplogins;
- 查看所有數(shù)據(jù)庫用戶所屬的角色信息
EXEC sp_helpsrvrolemember;
- 更改某個數(shù)據(jù)對象的用戶屬主
注意:更改對象名的任一部分都可能破壞腳本和存儲過程。把一臺服務(wù)器上的數(shù)據(jù)庫用戶登錄信息備份出來可以用add_login_to_aserver腳本。查看某數(shù)據(jù)庫下,對象級用戶權(quán)限sp_helprotect
EXEC sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
- 查看鏈接服務(wù)器
EXEC sp_helplinkedsrvlogin;
- 查看遠端數(shù)據(jù)庫用戶登錄信息
EXEC sp_helpremotelogin;
- 查看某數(shù)據(jù)庫下某個數(shù)據(jù)對象的索引信息
EXEC sp_helpindex @objname;
- 查看某數(shù)據(jù)庫下某個數(shù)據(jù)對象的的約束信息
EXEC sp_helpconstraint @objname;
- 查看表的相關(guān)信息
EXEC sp_help 'TABLE_NAME';
- 查看數(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 ;
- 查看數(shù)據(jù)庫服務(wù)器各數(shù)據(jù)庫日志文件的大小及利用率/狀態(tài)
DBCC SQLPERF(LOGSPACE);
或
EXEC ('DBCC SQLPERF(LOGSPACE)');
- 查看當(dāng)前數(shù)據(jù)庫的文件狀態(tài)
EXEC ('DBCC showfilestats');
- 查看數(shù)據(jù)庫存儲過程
-- 方法1
EXEC sp_stored_procedures;
-- 方法2
SELECT * FROM sys.procedures;
-- 方法3
SELECT * FROM sys.sysobjects WHERE xtype='P';
- 查看存儲過程基本信息
EXEC sp_help 'sp_who';
- 查看存儲過程源代碼:
-- 方法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 );
- 檢查數(shù)據(jù)庫完整性
DBCC checkdb(<DBName>)
-- Tablock選項提高速度
DBCC checkdb(<DBName>) with tablock
2. 查看服務(wù)器環(huán)境信息
- 查看數(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 的容量等等。
- 查看數(shù)據(jù)庫服務(wù)器磁盤分區(qū)剩余空間。
EXEC master.dbo.xp_fixeddrives;
- 查看數(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ù)庫備份
- 備份數(shù)據(jù)庫
declare @sql varchar(255)
set @sql = 'backup database <DBName> to disk = ''<File Path>' + rtrim(convert(varchar, getdate(), 112)) + '.bak''';
exec(@sql);
- 刪除15天前備份文件
declare @sql varchar(255);
set @sql = 'del <File Path>' + rtrim(convert(varchar, getdate()-15), 112)) + '.bak''';
exec master..xp_cmdshell @sql;
- 完全備份
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
- 差異備份
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
- 日志備份
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ù)庫常用操作
- 數(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
- 擴展數(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>
)
- 移動文件
-- 由于在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
- 設(shè)置默認文件組、只讀文件組
--設(shè)置默認文件組
ALTER DATABASE <DBName>
MODIFY FILEGROUP <FileGroup> DEFAULT
--設(shè)為只讀文件組
--如果文件已經(jīng)是某個屬性,不能再次設(shè)置相同屬性
ALTER DATABASE <DBName>
MODIFY FILEGROUP <FileGroup> READ_WRITE
- 收縮數(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 --清空文件,清空文件后,才可以刪除文件
)
- 刪除文件、刪除文件組
-
要刪除文件,必須要先把文件上的數(shù)據(jù)刪除,或者移動到其他文件或文件組上
--刪除數(shù)據(jù)后,必須要清空文件的內(nèi)容 DBCC SHRINKFILE(<FileName>,EMPTYFILE) --刪除文件,同時也在文件系統(tǒng)底層刪除了文件 ALTER DATABASE <DBName> REMOVE FILE <FileName>
-
要刪除文件組,必須先刪除所有文件
--最后刪除文件組 ALTER DATABASE <DBName> REMOVE FILEGROUP <FileGroupName>
- 重新組織索引
-- 重新組織索引
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
- 重建索引
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
)