Microsoft SQL Server 管理 (常用管理及維護命令)

--查詢當前連接的實例名
select @@servername


--察看任何數據庫屬性
sp_helpdb master

 

--設置單用戶模式,同時立即斷開所有用戶
alter database Northwind set single_user with rollback immediate


--恢復正常
alter database Northwind set multi_user

 

--察看數據庫屬性
sp_helpdb


--察看數據庫恢復模式
select databasepropertyex('Northwind','recovery')


--設置自動創建統計
alter database Northwind set auto_create_statistics on/off


--設置自動更新統計
alter database Northwind set auto_update_statistics on/off


--查看作業列表
select * from msdb..sysjobs


--查看作業詳細信息
exec msdb..sp_help_job @job_name = 'HQCRM-CrmNew-CrmNew_2Dimension-NANJINGCRM-216'


--修改作業信息
exec msdb..sp_update_job @job_id = 0x4CA27521C9033C48954E7BFC6B965395, @enabled = 1


--察看服務器角色
exec sp_helpsrvrolemember


--添加服務器角色
exec sp_addsrvrolemember 'member_name','sysadmin'


--刪除服務器角色
exec sp_dropsrvrolemember 'member_name','sysadmin'


--察看數據庫角色
exec sp_helprole


--添加數據庫角色
exec sp_addrole 'role_name'


--刪除數據庫角色
exec sp_droprole 'role_name'


--查看用戶信息
exec sp_helpuser


--注意刪除guest帳戶
use dbname
go
exec sp_dropuser guest

 

--修改對象擁有者
exec sp_changeobjectowner 'old_onwer.table_name', 'new_owner'

 

--查看BUILTIN\Administrators帳號
exec master..xp_logininfo 'BUILTIN\Administrators', 'members'


--修改默認數據庫
exec sp_defaultdb 'login', 'defaultdb'


--創建新的登陸
exec sp_addlogin @loginame = 'esProgram',@passwd = 'h1J2P97vfdlK34',@defdb = 'career'

 

--更改登陸數據庫訪問權限
use <dbname>
exec sp_grantdbaccess @loginame ='esProgram',@name_in_db = 'esProgram'

 

--把角色db_appuser添加用戶帳號中
use <dbname>
exec sp_addrolemember @rolename = 'db_appuser',@membername = 'esProgram'


--預測增長
use master
/* Procedure for 8.0 server */
create proc usp_databases
as
set nocount on
declare @name sysname
declare @SQL nvarchar(600)
/* Use temporary table to sum up database size w/o using group by */
create table #databases (
      DATABASE_NAME sysname NOT NULL,
      size int NOT NULL)
declare c1 cursor for 
   select name from master.dbo.sysdatabases
    where has_dbaccess(name) = 1 -- Only look at databases to which we have access
open c1
fetch c1 into @name
while @@fetch_status >= 0
begin
   select @SQL = 'insert into #databases
     select N'''+ @name + ''', sum(size) from '
     + QuoteName(@name) + '.dbo.sysfiles'
   /* Insert row for each database */
   execute (@SQL)
   fetch c1 into @name
end
deallocate c1
select 
   DATABASE_NAME,
   DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */
   RUN_DT=GETDATE()
from #databases
order by 1
GO

create table DatabaseSizeReport
(Database_Name Varchar(32),
Database_Size int, 
CreateDt datetime)

insert into DatabaseSizeReport exec usp_databases

select * from DatabaseSizeReport


--快捷方式
ALT-F1   sp_help
CTRL-1   sp_who
CTRL-2   sp_lock


--查看對象空間
exec sp_spaceused <db_name>/<table_name>


--察看文件是否存在
exec xp_fileexist "c:\test.txt"


--察看文件詳細信息
exec master..xp_getfiledetails "c:\test.txt"

 

--查看系統出錯日誌
set nocount on --執行一個查詢或者是存儲過程是要保證這個是開的。可以提高速度
create table #sunying_error_lg
(errortext varchar(500),
continuerow int)
insert into #sunying_error_lg exec master..xp_readerrorlog
select * from #sunying_error_lg
drop table #sunying_error_lg

 

--獲得dbcc命令的完整列表
dbcc help('?')

 

--檢測數據庫損壞情況
alter database <dbname> set single_user with rollback immediate
dbcc checkdb (<dbname>,repair_fast)


--數據庫損壞處理步驟
1.檢查SQL SERVER和Windows NT錯誤日誌,看是否能找出問題所在。例如,可能硬盤驅動器已滿。
2.以單用戶模式啓動SQL Server。
3.用@dbname參數執行sp_resetstatus(比如,sp_resetstatus @dbname="pubs")。來使數據庫擺脫損壞狀態
4.以單用戶模式重新啓動SQL Server。
5.如果數據庫仍處於置疑狀態,可將它重設回正常模式,並試着用下面命令轉儲置疑的數據庫的事務:dump transaction Northwind with no_log
6.再次以單用戶模式啓動SQL Server,如果數據庫出現了,可對其進行詳細的DBCC檢查(checkdb,checkalloc,等等)
7.運行一些隨機查詢,看看是否會遇到問題。
8.如果沒有問題出現,可停止並重新啓動SQL Server,然後將數據庫投入生產應用。

 

--將數據庫置於緊急模式
sp_configure 'allow updates',1
reconfigure with override
go
update master..sysdatabases set status=-32768 where name='pubs'
go
sp_configure 'allow updates',0
reconfigure with override
go


--當數據庫處於這種模式時,你只能從中讀取數據。
--查看日誌空間
dbcc sqlperf(logspace)


--查看高速緩存命中率
dbcc sqlperf(lrustats)


--查看活動事務(open transaction)
dbcc opentran


--如果有事務是活動的比如(SPID:54 UID:1),還有看這個事務打開了多久了。如果有人忘了,可以用
--kill 54
--來幹掉他

--查看用戶使用set命令的全部內容
dbcc useroptions


--比如可以查看set nocount on
--系統函數
app_name()函數返回當前從SQL Server請求數據的應用程序名稱。
get_date()函數返回SQL Server上的當前時間。
host_name()函數確定是哪臺工作站正在連接到SQL Server。
system_user函數提供正在連接的用戶的登陸名
db_name()告訴你連接是哪個數據庫


--@@identity標識列
drop table sunying_test
create table sunying_test (aid int identity,val varchar(500))
insert into sunying_test (val) select 'abc' --@@identity爲1
insert into sunying_test (val) select 'abc' --@@identity爲2
insert into sunying_test (val) select 'abc' --@@identity爲3
select * from sunying_test
select @@identity


--在不同連接裏查@@identity她返回null
select @@identity


--和@@identity相同,不同點即使停止SQL Server並且重新建立連接,這個命令仍然會返回正確的值
select ident_current('<table_name>')


--查看I/O,執行計劃
set statistics io on
select count(*) from sunying_test


--斷開一個數據庫的所有用戶
sp_who
create procedure usp_killusers @dbname varchar(50) as
set nocount on
declare @strSQL varchar(255)
print 'Killing Users'
print '---------------------'
create table #tmpUsers(
spid int,
eid int,
status varchar(30),
loginname varchar(50),
hostname varchar(50),
blk int,
dbname varchar(50),
cmd varchar(30))
insert into #tmpUsers exec sp_who
declare logincursor cursor
read_only
for select spid,dbname from #tmpUsers where dbname=@dbname
declare @spid varchar(10)
declare @dbname2 varchar(40)
open logincursor
fetch next from logincursor into @spid,@dbname2
while (@@fetch_status<>-1)
begin
if (@@fetch_status<>-2)
begin
    print 'Killing '+@spid
    set @strSQL='KILL '+@spid
    exec (@strSQL)
end
fetch next from logincursor into @spid,@dbname2
end
close logincursor
deallocate logincursor
drop table #tmpUsers
print 'Done'
go

usp_killusers 'crmnew'


--top的使用
select top n * from <tablename> --返回表中前n行記錄
select top n percent * from <tablename> --返回表中最前面的n%行記錄

 

--優化索引的充滿度,她對索引的性能影響很大
dbcc showcontig (T_Contract_Pdt)
/* --執行以後顯示如下
DBCC SHOWCONTIG 正在掃描 'T_Contract_Pdt' 表...
表: 'T_Contract_Pdt'(124071728);索引 ID: 1,數據庫 ID: 7
已執行 TABLE 級別的掃描。
- 掃描頁數.....................................: 95
- 掃描擴展盤區數...............................: 14
- 擴展盤區開關數...............................: 40
- 每個擴展盤區上的平均頁數.....................: 6.8
- 掃描密度[最佳值:實際值]....................: 29.27%[12:41]這個值不能低應該儘可能接近100%,低了說明有碎片
- 邏輯掃描碎片.................................: 18.95% --這個值高意味着表中存在很多碎片
- 擴展盤區掃描碎片.............................: 57.14% --這個值高意味着表中存在很多碎片
- 每頁上的平均可用字節數.......................: 1800.2
- 平均頁密度(完整)...........................: 77.76% --這個值是關鍵,系統默認是98%,這個值低的話說明有大量的插入操作。最好控制在85%-98%
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
*/


--解決碎片問題,重建索引
dbcc dbreindex (<table_name>,'<index_name>',<fill factor>)
dbcc dbreindex (T_Contract_Pdt)
dbcc showcontig (T_Contract_Pdt)


/* --執行以後顯示如下
DBCC SHOWCONTIG 正在掃描 'T_Contract_Pdt' 表...
表: 'T_Contract_Pdt'(124071728);索引 ID: 1,數據庫 ID: 7
已執行 TABLE 級別的掃描。
- 掃描頁數.....................................: 75
- 掃描擴展盤區數...............................: 10
- 擴展盤區開關數...............................: 9
- 每個擴展盤區上的平均頁數.....................: 7.5
- 掃描密度[最佳值:實際值]....................: 100.00%[10:10]
- 邏輯掃描碎片.................................: 0.00%
- 擴展盤區掃描碎片.............................: 0.00%
- 每頁上的平均可用字節數.......................: 121.3
- 平均頁密度(完整)...........................: 98.50%
DBCC 執行完畢。如果 DBCC 輸出了錯誤信息,請與系統管理員聯繫。
*/


--重建索引開銷很大。可以用整理索引碎片來代替,但最徹底最好的方式是重建索引
dbcc indexdefrag (<db_name>,<table_name>,<index_name>)


--backupset表提供有關備份的詳細信息
select * from msdb..backupset

 

--查看登陸用戶
select * from master..syslogins


--查看用戶信息
select * from Northwind..sysusers


--sysusers和syslogins表的sid相對應,但在還原或者附加數據庫可能出現不一致的現象,可以使用比如:
sp_change_users_login 'report'


--查看不匹配的用戶
sp_change_users_login 'auto_fix', <username>


--糾正這個用戶名,如果這個用戶登陸不存在的話會創建他。也可以用Update_One參數修復如下
sp_change_users_login 'update_one', <username>,<loginname>


--恢復損壞的master庫
1.使用\Program Files\Microsoft SQL Server\80\Tools\Binn目錄下的rebuildm.exe文件重建master數據庫。重建master數據庫可以使用你的數據庫文件完整無缺。記得把數據文件和日誌文件備份到其他地方。
2.使用-m參數啓動SQL Server,這樣可以以單用戶模式重新啓動SQL Server。
3.從最近一次已知最好的備份來還原master數據庫。
4.覈實master數據庫是不是已經成功還原,確認所有數據庫都已恢復正常並運行。從最近一次已知最好的備份來還原msdb數據庫。
5.以普通模式停止和啓動SQL Server
6.向生產用戶開放數據庫

 

--重建其他數據庫。
\Program Files\Microsoft SQL Server\MSSQL\Install\
instmsdb.sql--msdb數據庫
instnwnd.sql--Northwind數據庫
instpubs.sql--pubs數據庫
--注意重建msdb以後,作業,DTS包和其他關鍵信息將會丟失。重建以後要還原她

--查看執行計劃
set statistics profile on
select * from course_info
set statistics profile off
--在查詢分析器裏選擇查詢--顯示執行計劃,顯示服務器跟蹤,顯示客戶統計
--暫停服務器後已經連接的客戶機連接不受影響,可以繼續執行,但拒絕新的客戶機連接請求。建議DBA在實際管理中,先選擇暫停,然後在選擇關閉

--SQL SERVER2000推薦使用動態分配內存的方法,實例會在Windows操作系統的調度下動態獲得內存。選中SQL Server保留物理內存複選框指定爲SQLSERVER保留與內存設置相等的物理內存空間,這樣操作系統不能使用爲SQL SERVER保留的內存空間。在最小查詢內存文本框裏可以設置分配給每個用戶執行查詢的最小內存,默認爲1024KB
--如果SQL SERVER服務器非常重要,要確定足夠的內存來運行,可以選指定固定大小的內存。配置了固定內存並不表明一開始SQLSERVER2000服務器就佔用設置的內存,而是隨着需要內存的增加不斷增加,最後只能使用最多的內存。

--索引填充因子假如設置爲60%那麼就規定了在向索引頁面中插入索引數據時最多可以佔用的頁面空間是(60%*8KB=4.8KB)。剩下的約40%(40%*8KB=3.2KB)的空間保留供索引的數據更新使用。如果更新後索引數據超出了原有索引頁面的存儲空間後,SQL SERVER2000會自動將原索引頁面大致一半的數據遷移到新的頁面中,稱爲頁的分裂。頁的分裂操作將會導致系統性能的嚴重下降。
--什麼是恢復間隔,默認是0這表示用於快速恢復的自動設置,表示由SQLSERVER2000自動決定什麼時間生成檢查點。
--什麼是檢查點,如果系統崩潰進行恢復時,需要從頭到尾掃描日誌文件的內容,執行重做或者回滾的操作。如果沒有檢查點,每次恢復都要從頭開始掃描,這對於大容量的日誌文件來說,會導致恢復的時間比較長。有了檢查點,就可以從距離發生故障點最近的檢查點開始做起就可以了。可以大大減少恢復的時間。
--恢復間隔其實就是檢查點發生頻率的參數


--手動執行檢查點
checkpoint;


--查詢服務器當前運行參數
select * from master..sysconfigures

--服務器出錯日誌默認路徑
C:\Program Files\Microsoft SQL Server\MSSQL\LOG

--master庫是最重要的數據庫存儲系統信息,磁盤空間,文件分配和使用,系統級的配置參數,所有的登陸帳戶信息,初始化信息和其他數據庫信息等。
--msdb庫是SQLSERVER代理服務使用的數據庫。爲報警,作業,任務調度和記錄操作員操作提供存儲空間。
--tempdb庫是臨時數據庫,她爲所有臨時表,臨時存儲過程以及其他的臨時操作提供空間。每次重起改數據庫裏的信息就是丟失。
--model庫是存儲了所有用戶數據庫和tempdb數據庫的模板。
--啓動
1.啓動master庫
2.啓動model庫
3.啓動msdb庫
4.清除tempdb庫
5.啓動tempdb庫
--DBCC(data base consistency checker),數據庫控制檯命令,也稱數據庫一致性檢查是SQLSERVER2000提供的一類特殊的命令,用於執行特殊的數據庫管理操作


--查詢所有的DBCC命令
dbcc help('?')
--查詢指定DBCC命令的語法說明
dbcc help('checkalloc')
--返回當前連接的活動設置
dbcc traceon(3604)
go
dbcc useroptions
go
--檢查指定數據庫的磁盤空間分配結構的一致性
dbcc checkalloc('Northwind',repair_allow_data_loss|repair_fast|repair_rebuild)
repair_allow_data_loss:完成所有的修復,有可能會導致一些數據丟失
repair_fast:進行小的,不耗時的修復操作,不會有丟失數據
repair_rebuild:完成所有的修復,包括較長時間的修復比如重建索引

 

--檢查數據庫中系統表內及系統表間的一致性
dbcc checkcatalog('Northwind')


--用於檢查指定表上的約束完整性
use Northwind
go
dbcc checkconstraints('Customers')
go


--檢查指定數據庫中的所有對象的分配和結構完整性
dbcc checkdb('Northwind')


--檢查指定表或索引視圖的數據,索引及text,ntext和image頁的完整性
use Northwind
go
dbcc checktable('Customers')
go


--檢查指定表的當前標識值
use pubs
go
dbcc checkident(jobs,noreseed|reseed new_reseed_value)


--回收alter table drop column語句刪除可變長度列或text列後的存儲空間,注意不能對系統表或臨時表執行該操作
dbcc cleantable('Northwind','Customers')
--重建指定數據庫中一個或多個索引
--create index語句比較優點
--1.允許動態重建表的索引或爲表定義的所有索引
--2.允許重建強制PRIMARY KEY或者UNIQUE約束的索引,而不必除去並重新創建些約束。
--3.允許使用一條語句重建表的所有索引,這比多個DROP INDEX和CREATE INDEX語句進行編碼容易。
--4.可以優化SQL Server數據庫的性能
--注意不能在系統表使用dbcc dbreindex
dbcc dbreindex('Northwind..Customers')
go
--通常懷疑sp_spaceused所返回的值不正確時使用,對錶和聚集索引中sysindexes表的rows,used,reserved和dpages列進行更正。
dbcc updateusage('pubs','authors')
go
--對錶或視圖上的索引和非聚集索引進行碎片整理
--上面已經說過了碎片影響性能已經處理方法,這裏就不在重複
dbcc indexdefrag(Northwind,Orders,CustomersOrders)
go

--將表駐留在內存中,和將表從內存中撤消。注意dbcc pintable適用於小表,使用時不要把大表駐留內存。這樣會嚴重影響性能
use Northwind
set @db_id=db_id('Northwind')
set @tb1_id=object_id('Northwind..Customers')
dbcc pintable(@db_id,@tb1_id)
dbcc unpintable(@db_id,@tb1_id)

--收縮數據庫,不會把物理文件大小進行收縮,對使用空間進行收縮,物理大小的收縮用dbcc shrinkfile
--Northwind數據庫中的文件有10%的可以空間,
dbcc shrinkdatabase(Northwind,10)

--收縮物理文件大小
use Northwind
sp_helpfile
dbcc shrinkfile(1,1000M)
--用於從緩衝池中刪除所有內容,即將內存中的所有數據庫有的數據全部清除
--可以用於性能測試,在不重起的情況下,清一下內存,在考察SQL語句的性能時就能得到SQL語句執行的物理IO執行情況
dbcc dropcleanbuffers
--在內存中卸載指定的擴展存儲過程動態連接庫(DLL)
--1.查詢已經裝載的DLL
sp_helextendedroc
go
--2.從內存中釋放系統存儲過程xp_sendmail的DLL
dbcc xp_sendmail(free)
go
--顯示用戶最後執行的語句,比較實用^_^
--1.顯示用戶連接的進程ID(SPID)
exec sp_who
--2.顯示語句
dbcc inputbuffer(spid)
--查詢某個數據庫執行時間最久的事務,對調優很有用^_^
dbcc opentran('master')
--顯示指定表上指定目標的當前分佈統計信息,主要是索引的統計信息
use pubs
dbcc show_statistics(authors,UPKCL_auidind)
go

--顯示指定表的數據和索引的碎片信息這個上面已經提過了
use <db_name>
dbcc showcontig(<table_name>)
go
--返回多中有用的統計信息
--1.統計事務日誌信息
dbcc sqlperf(logspace)
--2.統計線程管理信息
dbcc sqlperf(umsstats)
num user:當前UMS調度器使用的SQL Server線程數。
num runnable:實際上正在運行的SQL Server線程數。
num workers:線程池的大小,也就是實際上的工作者數量。
idle workers:當前空閒的工作者數量。
cntxt switches:在運行的線程間進行的上下文切換數。
cntxt switches(idle):空閒的線程間進行的上下文切換數。
--3.統計資源等待類型信息
dbcc sqlperf(waitstats)
--4.統計I/O資源消耗信息
dbcc sqlperf(iostats)
--5.統計先讀信息
dbcc sqlperf(rastats)
--6.統計每個線程的資源消耗信息
dbcc sqlperf(threads)
--顯示內存的統計信息,內存的細分信息
dbcc cachestats
dbcc memorystatus
--顯示遊標的統計信息
dbcc cursorstats

--顯示緩存中先讀和預先準備的SQL語句
dbcc sqlmgrstats
Memory Used(8k pages):如果內存頁面數量很大,該值表示一些用戶連接先讀了許多Transact-SQL語句。
Number CSql Objects:緩存中的Transact-SQL語句總的數量
Number False Hits:到內存中去查找已經緩存的Transact-SQL語句而沒有命中的值。該值應該儘可能低

--用於清除內存中的某個數據庫的存儲過程緩存內容
declear @intDBID integer
set @intDBID=(select dbid from master..sysdatabases where name='TESTDB01')
dbcc flushprocindb(@intDBID)
go
--顯示緩衝區的頭部信息的頁面信息
dbcc traceon(3604)
go
dbcc buffer(master,'sysobjects',2)
go
--顯示數據庫的結構信息
dbcc traceon(3604)
go
dbcc dbinfo(master)
go
--顯示管理數據庫的表(數據字典)信息
dbcc traceon(3604)
go
dbcc dbtable(master)
go
--查看某個索引使用的頁面信息
dbcc traceon(3604)
go
dbcc ind(master,sysobjects,0)
go

--查看某個數據庫使用的事務日誌信息
dbcc traceon(3604)
go
dbcc log(crmnew,-1)
go

--顯示過程緩衝池
dbcc traceon(3604)
go
dbcc procbuf(master,'sp_help',1,0)
go

--用於輸出某個頁面的每行指向的頁面號
dbcc traceon(3604)
go
declare @dbid int,@objectid int
select @dbid=DB_ID('master')
select @objectid=object_id('sysobjects')
dbcc prtipage(@dbid,@objectid,1,0)
go
--顯示當前連接到服務器的進程
dbcc traceon(3604)
go
dbcc pss(ADMINISTRATOR,54,1)
go
--顯示當前服務器資源情況
dbcc traceon(3604)
go
dbcc resource
go

--用於查看數據頁面的結構
dbcc traceon(3604)
go
declare @dbid int,@objectid int
select @dbid=DB_ID('master')
select @objectid=object_id('sysdatabases')
dbcc tab(@dbid,@objectid)
go

--查詢SQL語句的讀寫代價
set statistics io on
go
select count(1) from Northwind..employees
go
set statistics io off
go

(所影響的行數爲 1 行)
表 'Employees'。掃描計數 1,邏輯讀 1 次,物理讀 0 次,預讀 0 次。

--查詢SQL語句的執行時間
set statistics time on
go
select count(1) from Northwind..employees
go
set statistics time off
go

SQL Server 執行時間: 
   CPU 時間 = 0 毫秒,耗費時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,耗費時間 = 0 毫秒。
(所影響的行數爲 1 行)

SQL Server 執行時間: 
   CPU 時間 = 0 毫秒,耗費時間 = 0 毫秒。
SQL Server 分析和編譯時間: 
   CPU 時間 = 0 毫秒,耗費時間 = 0 毫秒。

--查詢SQL語句的執行計劃
set showplan_text on
go
select count(1) from Northwind..employees
go
set showplan_text off
go
|--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1003])))
       |--Stream Aggregate(DEFINE:([Expr1003]=Count(*)))
            |--Index Scan(OBJECT:([Northwind].[dbo].[Employees].[PostalCode]))

--更加詳細的執行計劃
set showplan_all on
go
select count(1) from Northwind..employees
go
set showplan_all off
go
EstimateIO和EstimeCPU是主要的評估SQL語句的執行代價的標準

--成批SQL語句的執行時間
create table #save_time(start_time datetime not null)
insert #save_time values(getdate())
go
--批處理的腳本
select * from Northwind..customers
go
select * from Northwind..products
go
--批處理語句結束
select 'SQL語句的執行時間(ms)'=datediff(ms,start_time,getdate()) from #save_time
drop table #save_time
go
--密碼文件保存在哪裏?
select * from master..sysxlogins

--事務操作
begin tran <事務名>
update t_a set val='123'
commit tran <事務名>
或者rollback tran <事務名>

----------------============華麗的分割線===============--------------------------------------



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章