SQL Server 事務日誌常用SQL

一、 查詢日誌的使用空間

1. 查詢日誌率及當前大小

DBCC SQLPERF(LOGSPACE);

 

2. 查詢日誌文件當前大小及最大大小

select db.name as database_name,
    db.is_auto_shrink_on,
    db.recovery_model_desc,
    mf.file_id,
    mf.type_desc,
    mf.name as logic_file_name,
    mf.size*8/1024as size_MB,
    mf.physical_name,
    iif(mf.max_size=-1,-1,mf.max_size*8/1024) as max_size_MB,
    mf.growth,
    mf.is_percent_growth,
    mf.state_desc
from sys.databases db
inner join sys.master_files mf
    on db.database_id=mf.database_id
where mf.type=0
order by size_MB desc;

 

3. 查看os磁盤剩餘空間

exec sys.xp_fixeddrives

 

二、 日誌收縮

1. 收縮方法

-- 將目標庫改爲sample模式
USE [master]
GO
ALTER DATABASE testdb SET RECOVERY SIMPLE WITH NO_WAIT   --簡單模式
GO
USE testdb 
GO
DBCC SHRINKFILE (N'testdb_log',20,TRUNCATEONLY)
GO

-- testdb_log爲日誌文件邏輯名;20(MB)爲收縮的目標size,若不指定則縮小到日誌初始大小
-- TRUNCATEONLY釋放文件末尾所有可用空間給操作系統,但不在文件內部執行頁移動。數據文件只收縮到最後分配的區。如果指定了target_size,則會忽略該參數。TRUNCATEONLY只適用於數據文件。對於日誌文件,不使用該參數也會返回磁盤空間。

--改回full模式(測試環境不必執行)
USE [master]
GO
ALTER DATABASE testdb SET RECOVERY FULL WITH NO_WAIT
GO

2. 查詢日誌無法收縮原因

SELECT name,recovery_model_desc,log_reuse_wait_desc FROM sys.databases WHERE name = '庫名';

可能原因及對應解決方法

原因名

解釋

解決方法

NOTHING

當前有一個或多個可重複使用的虛擬日誌文件

正常,不需處理

CHECKPOINT

自上次日誌截斷之後,尚未出現檢查點,或者日誌頭部尚未跨一個虛擬日誌文件移動(所有恢復模式)。類似oracle的active狀態redolog。

這是日誌截斷延遲的常見原因,一般正常,不需處理

 

LOG_BACKUP

需要日誌備份,以將日誌的頭部前移(僅適用於完整恢復模式或大容量日誌恢復模式)

進行日誌備份後

ACTIVE_BACKUP_OR_RESTORE

數據備份或還原正在進行(所有恢復模式)時,將阻止截斷。

一般正常,但需要檢查備份日誌時間是否過長,若想直接截斷日誌,需要先kill掉正在進行備份/還原的會話

ACTIVE_TRANSACTION

事務處於活動狀態,一個長時間運行或者未提交的事務可能存在於日誌備份的開頭。

 

事務被延遲。“延遲的事務”是有效的活動事務,因爲某些資源不可用,其回滾受阻

檢查最老的活動事務(最久未提交)

DBCC OPENTRAN

GO

select st.text,t2.*

from sys.dm_exec_sessions as t2,sys.dm_exec_connections as t1

cross apply sys.dm_exec_sql_text(t1.most_recent_sql_handle) as st

where t1.session_id=t2.session_id and t1.session_id>50

DATABASE_MIRRORING

數據庫鏡像暫停,或者在高性能模式下,鏡像數據庫明顯滯後於主體數據庫(僅限於完整恢復模式)

檢查數據同步問題

REPLICATION

在事務複製過程中,與發佈相關的事務仍未傳遞到分發數據庫(僅限於完整恢復模式)。

給標有replication的數據庫任意一個表創建事務複製,然後刪除,再執行收縮(這是數據庫的一個BUG)。當使用CDC時,也會有該問題。

DATABASE_SNAPSHOT_CREATION

正在創建數據庫快照(所有恢復模式)

這是日誌截斷延遲的常見原因,通常也是主要原因,一般不需處理

LOG_SCAN

正在進行日誌掃描(所有恢復模式)

這是日誌截斷延遲的常見原因,通常也是主要原因

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