SQL Server 如何刪除多餘的事務日誌文件

sqlserver按照嚴格順序寫入日誌文件,如果有兩個日誌文件,sqlserver只會寫滿一個之後再寫另一個,因此多個日誌文件對性能提升並沒有什麼用處。如果創建了多個日誌文件想要刪除應該如何處理?

下面以full模式爲例,sample模式更加簡單

CREATE DATABASE [TestDB]
 ON  PRIMARY 
( NAME = N'TestDB', FILENAME = N'D:\SQL DATA\TestDB.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'TestDB_log1', FILENAME = N'D:\SQL DATA\TestDB_log1.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%), 
( NAME = N'TestDB_log2', FILENAME = N'D:\SQL DATA\TestDB_log2.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

USE TestDB
GO

CREATE TABLE TestTable
(
	ID INT IDENTITY(1,1),
	Value BIGINT
)

--Change recovery model for TestDB to FULL
ALTER DATABASE TestDB SET RECOVERY FULL;

插入一些測試數據

USE TestDB
GO

--Checking log information before insertion
SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files

--Inserting data into TestTable
;WITH ValueTable AS
(
	SELECT 1 n
	UNION ALL 
	SELECT n+ 1
	FROM ValueTable
	WHERE n < 10000 --Value 10000 is used to facilitate testing process, please be careful in choosing this value for your server to avoid overloading it
) 
INSERT INTO TestTable (Value)
SELECT n
FROM ValueTable 
OPTION (MAXRECURSION 0)

--Checking log information after insertion
SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files

查看日誌信息及status

DBCC LOGINFO('TestDB')

VLFs_with_Status=2

可以看到fileid=2和3的文件都有部分VLF status變成了2,此時如果直接刪除,會遇到報錯

USE master
GO
--Remove TestDB_log2 file
ALTER DATABASE TestDB REMOVE FILE TestDB_log2

ALTER_DATABASE_TestDB

對於simple模式,等待checkpoint自動截斷或手動收縮日誌後,status會變成0,再次刪除即可。

對於full模式,則需要發起日誌備份(若未進行過全備還需要進行全備)。

--Full backup
BACKUP DATABASE TestDB TO DISK =N'D:\SQL DATA\TestDB.bak'
--Transaction log backup
BACKUP LOG TestDB TO DISK =N'D:\SQL DATA\TestDB.trn'

再次查看日誌信息及status

DBCC LOGINFO('TestDB')

DBCC LOGINFO

此時可以刪除fileid=3的文件,注意對應的邏輯名是TestDB_log2

--Remove TestDB_log2 file
ALTER DATABASE TestDB REMOVE FILE TestDB_log2

Remove TestDB

此時查看dbfile信息,會發現TestDB_log2還在

--Checking log information
SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files	

sys.database_files

再進行一次日誌備份,然後會發現TestDB_log2已經被刪除了

--Transaction log backup
BACKUP LOG TestDB TO DISK =N'D:\SQL DATA\TestDB.trn'

--Checking log information
SELECT file_id, name, type_desc, physical_name, size, max_size FROM sys.database_files;	

Checking log information

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