部分具有統計功能的TSQL語句(例如DBCC語句,全局函數,系統存儲過程)
這些功能也能幫助用戶了解和監控SQLSERVER的運行情況
DBCC語句,DBCC語句是SQL2005的數據庫控制臺命令
DBCC語句不僅能檢查數據庫的性能和活動,還能檢查數據庫的物理和邏輯一致性
許多DBCC語句能夠對檢測到的問題進行修復,例如
1 1、DBCC CHECKTABLE 2 --檢查組成表或索引視圖的所有頁和結構的完整性 3 --例如,檢查AdventureWorks數據庫中的HumanResources.Employee表的數據頁完整性 4 --請執行 5 USE [AdventureWorks] 6 GO 7 DBCC CHECKTABLE('HumanResources.Employee') 8 --如果發現有錯誤可以運行下面這句嘗試修復 9 DBCC CHECKTABLE('HumanResources.Employee',REPAIR_ALLOW_DATA_LOSS)
當使用DBCC 語句驗證表、數據庫文件甚至整個數據庫的完整性時,如果報告了任何錯誤,可以重新執行DBCC命令,并且使用REPAIR_ALLOW_DATA_LOSS 參數嘗試修復
報告的所有錯誤,但是這些修復可能會導致某些數據丟失
論壇上有一個帖子句出現這個情況
安裝SQL Server 2000的服務器有次突然宕機了,重啟后select *查詢某張表時出現報錯信息“服務器:消息 823,級別 24,狀態2,行1”,
請問該如何解決?現在web應用頁面查詢報錯,無法顯示數據。報錯服務器:消息 823,級別 24,狀態2,行1,連接中斷
1 --823錯誤屬于硬件錯誤,這個時候就可以使用下面sql語句修復那一張表 2 DBCC CHECKTABLE('HumanResources.Employee',REPAIR_ALLOW_DATA_LOSS
2、DBCC CHECKALLOC
DBCC CHECKALLOC將檢查數據庫中所有頁的分配,而不管其所屬的頁類型或對象類型。他還可以驗證各種內部結構,
這些結構可用于跟蹤這些頁和他們之間的關系
DBCC CHECKALLOC報告了任何錯誤,建議通過數據庫備份來還原數據庫,而不是運行修復。如果備份不存在,則運行修復也可糾正報告的錯誤;
但是,糾正這些錯誤時可能需要刪除某些頁,進而刪除數據
1 DBCC CHECKALLOC('AdventureWorks') 2 GO
3、DBCC CHECKDB
檢查指定數據庫中所有對象的分配、結構和邏輯完整性。下面示例將對當前數據庫執行DBCC CHECKDB
1 DBCC CHECKDB('AdventureWorks')
如果發現有錯誤,可以嘗試使用下面sql語句來修復錯誤
1 --------------------------------------------------------- 2 --設置單用戶模式 3 ALTER DATABASE [GPOSDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 4 GO 5 --先使用下面這句 6 DBCC checkdb([GPOSDB],REPAIR_REBUILD) 7 --如果上面那句修復不了錯誤,再使用下面這句 8 DBCC checkdb([GPOSDB],REPAIR_ALLOW_DATA_LOSS) 9 --設置多用戶模式 10 ALTER DATABASE [GPOSDB] SET MULTI_USER 11 GO 12 -------------------------------------------------------------
運行DBCC CHECKDB命令,相當于依次運行下面DBCC檢查語句
(1)對數據庫運行DBCC CHECKALLOC
(2)對數據庫中的每個表和視圖運行DBCC CHECKTABLE
(3)驗證數據庫中的Service Broker數據
(4)對數據庫運行DBCC CHECKCATALOG
(5)驗證數據庫中每個索引視圖的內容
這意味著無須再運行DBCC CHECKTABLE、DBCC CHECKALLOC、DBCC CHECKCATALOG
如果DBCC CHECKDB報告了任何錯誤,建議從數據看備份還原數據庫,而不運行具有repair選項的修復語句。
如果不存在備份,則運行修復將更正報告的錯誤。 但是,使用REPAIR_ALLOW_DATA_LOSS修復錯誤可能會導致某些數據丟失
4、DBCC OPENTRAN
顯示指定數據庫內最早的活動事務和最舊的分布,以及非分布式復制事務相關的信息 ,該語句可以用來查找長時間活動的事務
5、DBCC SQLPERF()
顯示自上次SQLSERVER服務器以來的相關統計信息。
1 DBCC SQLPERF(LOGSPACE) --顯示所有數據庫事務日志的使用情況 2 DBCC SQLPERF(IOSTATS) --顯示磁盤I/O情況 3 DBCC SQLPERF(NETSTATS) --顯示網絡的活動情況
全局函數
SQLSERVER提供了多個全局變量來記錄系統的狀態,全局變量為函數形式,作為全局函數引用
例如:
1 SELECT @@MAX_CONNECTIONS --返回SQLSERVER實例允許同時進行的最大用戶連接數 2 3 SELECT @@CONNECTIONS --顯示自上次啟動SQLSERVER以來登錄或試圖登錄的次數 4 5 SELECT @@ERROR --顯示TSQL語句的錯誤代碼 6 7 SELECT @@SPID --顯示當前用戶的服務器進程標識符id 8 9 SELECT @@PROCID --顯示當前過程的存儲過程標識符id 10 11 SELECT @@ROWCOUNT --顯示受上一語句影響的行數 12 13 SELECT @@SERVERNAME --返回本地SQLSERVER實例名稱 14 15 SELECT @@VERSION --顯示SQLSERVER安裝日期、版本、處理器類型、Windows操作系統版本號
系統存儲過程
下列SQLSERVER系統存儲過程可以作為多監視任務的一種功能強大的備選方法。
1 EXEC [sys].[sp_monitor]
顯示SQLSERVER統計信息,如總的處理事件、讀寫次數、登錄或試圖登錄SQLSERVER次數
1 EXEC [sys].[sp_who] @loginame = NULL -- sysname
報告有關當前SQLSERVER用戶和進程的快照信息,包括當前正在執行的語句,以及該語句是否被阻塞[sp_who]結果集將安裝spid值升序排序。
如果是并行處理,則會為特定的SPID創建子線程。主線程用spid=xxx和ecid=0標示。其他子線程具有相同的spid=xxx,但ecid>0。
因此,該spid號將有多行返回,而且這些行都放置在該spid在整個列表中的所在處。子線程將隨機排列,但父線程除外(ecid=0);
在該spid中,父線程首先列出
1 EXEC [sys].[sp_lock]
用來報告數據庫中有關鎖的信息
各個列的解釋
spid:請求鎖的進程的數據庫進程id spid號
dbid:數據庫標識號
objid:對象標識號。可以在相關數據庫中使用object_name()函數來標識對象。值為99時是一種特殊情況,表示用于記錄數據庫中頁分配的其中一個系統頁的鎖
indid:索引的索引標識號
type:鎖的類型
resource:標識被鎖定的資源的值。值的格式取決于type列標識的資源類型
mode:請求的鎖模式
status:鎖的請求狀態,GRANT表示已獲取鎖;WAIT表示鎖被另一個持有鎖(模式相沖突)的進程阻塞;
CNVRT表示鎖正在從另一種模式進行轉換,但是轉換被另一個持有鎖(模式相沖突)的進程阻塞
1 EXEC [sys].[sp_spaceused] @objname = N'', -- nvarchar(776) 2 @updateusage = '' -- varchar(5)
顯示保留的磁盤空間以及當前數據庫中的表、索引視圖或Service Broker隊列所使用的磁盤空間,或顯示由整個數據庫保留和使用的磁盤空間
1 EXEC [sys].[sp_help] @objname = N'' -- nvarchar(776)
報告有關數據庫對象(syssysobjects兼容視圖中列出的所有對象)、用戶定義數據類型或SQLSERVER2005提供的數據類型信息
[sp_help]返回的結果集取決于@objname 參數。如果未指定@objname 參數,則[sp_help]將列出當前數據庫中所有對象的對象名稱、所有者和對象類型。
1 --例如:列出有關master數據庫中每個對象的信息 2 USE master 3 GO 4 EXEC [sys].[sp_help] 5 6 7 --例如:顯示有關Person.Contact表的信息 8 USE [AdventureWorks] 9 GO 10 EXEC [sys].[sp_help] @objname = N'Person.Contact' -- nvarchar(776) 11 GO
如有不對的地方,歡迎大家拍磚o(∩_∩)o
文章列表