因爲某個事務長期不提交,致使日誌不能被截斷,ldf文件持續增加,卻不能收縮。
sql
1、搭建測試環境數據庫
1. 建立數據庫,恢復模式爲簡單服務器
CREATE DATABASE [db01]ide ON PRIMARY測試 ( NAME = N'db01', FILENAME = N'C:\sqldata\db01.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )this LOG ONspa ( NAME = N'db01_log', FILENAME = N'C:\sqldata\db01_log.ldf' , SIZE = 1024KB , FILEGROWTH = 1024KB)日誌 ALTER DATABASE [db01] SET RECOVERY SIMPLEblog |
2. 建立表並插入一條新記錄進程
USE db01 CREATE TABLE table1 (UserID int,pwd char(20),OtherInfo char(4100),modifydate datetime) INSERT table1 VALUES ( 123,'456','this is the first record',getdate() ) |
3. 備份數據庫
BACKUP DATABASE [db01] TO DISK = N'C:\Backup\db01.bak' WITH FORMAT, INIT |
2、執行事務但不提交
1. 執行一個事務,但不提交
BEGIN TRAN T1 SELECT * FROM table1 WITH (NOLOCK) |
2. 從同一個服務器進程id(SPID)執行如下循環,反覆修改數據,使ldf增加
BEGIN TRAN T2 DECLARE @i int SET @i=0 WHILE @i<10000 BEGIN UPDATE table1 SET pwd = cast(floor(rand()*100000) as varchar(20)), OtherInfo=cast(floor(rand()*100000) as char(4100)), modifydate = GETDATE() WHERE UserID=123 SET @i=@i+1 END COMMIT TRAN T2 |
說明:因爲第一筆交易未完成,當後續事務從同一個鏈接執行,被視爲嵌套事務。
3. 在新的進程中,嘗試收縮日誌文件
DBCC SHRINKFILE (N'db01_log' , 0, TRUNCATEONLY) |
注:不能在事務內執行SHRINKFILE操做。
5. 查看數據庫的磁盤使用空間
此時,ldf文件爲6MB。而這個數據庫最初建立時ldf文件爲1MB。上述實驗,說明嵌套事務中,某一個事務未提交,將致使事務日誌不能截斷。
參考 http://support.microsoft.com/kb/295108
3、查找未提交的事務
執行DBCC OPENTRAN
DBCC OPENTRAN |
返回的信息以下:
數據庫 'db01' 的事務信息。 最先的活動事務: SPID (服務器進程 ID): 53 UID (用戶 ID): -1 名稱 : T1 LSN : (39:65:1) 開始時間 : 11 27 2013 11:18:59:950AM SID : 0x010500000000000515000000b9970467bf7ed144e62fd7bbf4010000 DBCC 執行完畢。若是 DBCC 輸出了錯誤信息,請與系統管理員聯繫。 |
4、處理未提交的事務
1. 提交事務
COMMIT TRAN T1 |
2. 收縮日誌文件
DBCC SHRINKFILE (N'db01_log' , 0, TRUNCATEONLY) |
3. 使用DBCC OPENTRAN查看活動事務,結果以下
數據庫 'db01' 的事務信息。 最先的活動事務: SPID (服務器進程 ID): 54 UID (用戶 ID): -1 名稱 : T1 LSN : (39:65:1) 開始時間 : 11 27 2013 2:18:59:950PM SID : 0x010500000000000515000000b9970467bf7ed144e62fd7bbf4010000 DBCC 執行完畢。若是 DBCC 輸出了錯誤信息,請與系統管理員聯繫。 |
4. 查看ldf文件
此時,ldf文件從6MB收縮到1MB。說明事務已提交,事務日誌被截斷,從而能夠釋放磁盤空間。