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')
可以看到fileid=2和3的文件都有部分VLF status變成了2,此時如果直接刪除,會遇到報錯
USE master
GO
--Remove TestDB_log2 file
ALTER DATABASE TestDB REMOVE FILE TestDB_log2
對於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')
此時可以刪除fileid=3的文件,注意對應的邏輯名是TestDB_log2
--Remove TestDB_log2 file
ALTER DATABASE TestDB REMOVE FILE TestDB_log2
此時查看dbfile信息,會發現TestDB_log2還在
--Checking log information
SELECT file_id, name, type_desc, physical_name, size, max_size FROM 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;