mssql vlf count 확인 및 축소
DB Skill/MSSQL 2021. 8. 19. 00:48
mssql db를 사용하다보면 vlf count가 증가하는 것을 볼수 있다.
vlf count가 증가하면 DML 및 로그 백업시 지연 이슈가 발생 할 수 있기 때문에 적절하게 축소해 주는것이 유리하다
2019 버전에서는 계속해서 증가하지 않도록 개선이 되었으나, 이하 버전에서는 관리가 필요
vlf 확인
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 사용자 DB + TempDB 이름을 임시 테이블로 저장, 변수 선언
IF OBJECT_ID(N'tempdb..#DB') IS NOT NULL
BEGIN
DROP TABLE #DB
END
CREATE TABLE #DB (name sysname, dbid smallint)
INSERT INTO #DB (name, dbid)
SELECT name, dbid FROM master.dbo.sysdatabases
--WHERE name not in ('master', 'msdb', 'model')
GO
print '*** TR Log VLFs'
DECLARE @dbname SYSNAME
DECLARE @min_dbid SMALLINT
DECLARE @SQL VARCHAR(8000)
DECLARE @productversion VARCHAR(128)
DECLARE @Majorversion INT
SET @productversion = convert(VARCHAR(128), SERVERPROPERTY('ProductVersion'))
SET @Majorversion = convert(INT, left(@productversion, charindex('.', @productversion) - 1))
IF OBJECT_ID(N'tempdb..#LOGFILECNT') IS NOT NULL
BEGIN
DROP TABLE #LOGFILECNT
END
CREATE TABLE #LOGFILECNT (
seq INT identity
,dbname SYSNAME
,logcount INT
)
SET @min_dbid = 0
WHILE (@min_dbid IS NOT NULL)
BEGIN
SELECT @min_dbid = MIN(dbid)
FROM #DB
WHERE dbid > @min_dbid
IF (@min_dbid IS NULL)
BREAK
SELECT @dbname = NAME
FROM #DB
WHERE dbid = @min_dbid
INSERT INTO #LOGFILECNT (dbname)
SELECT @dbname
SET @SQL = 'USE [' + @dbname + ']; '
IF @Majorversion < 11
BEGIN
SET @SQL = @SQL + '
CREATE TABLE #T1 (c1 nvarchar(30), c2 nvarchar(30), c3 nvarchar(30), c4 nvarchar(30), c5 nvarchar(30), c6 nvarchar(30), c7 nvarchar(30))
INSERT INTO #T1 EXEC (''DBCC LOGINFO'')
UPDATE #LOGFILECNT SET logcount = (SELECT count(*) FROM #T1)
WHERE dbname = ''' + @dbname + '''
DROP TABLE #T1
'
END
ELSE
BEGIN
SET @SQL = @SQL + '
CREATE TABLE #T1 (c1 nvarchar(30), c2 nvarchar(30), c3 nvarchar(30), c4 nvarchar(30), c5 nvarchar(30), c6 nvarchar(30), c7 nvarchar(30), c8 nvarchar(30))
INSERT INTO #T1 EXEC (''DBCC LOGINFO'')
UPDATE #LOGFILECNT SET logcount = (SELECT count(*) FROM #T1)
WHERE dbname = ''' + @dbname + '''
DROP TABLE #T1
'
END
EXEC (@SQL)
END
SELECT dbname
,logcount
FROM #LOGFILECNT
ORDER BY seq
IF OBJECT_ID(N'tempdb..#LOGFILECNT') IS NOT NULL
BEGIN
DROP TABLE #LOGFILECNT
END
GO
vlf 축소
-- checkpoit 발생
CHECKPOINT
-- 버퍼 클린
DBCC DROPCLEANBUFFERS
-- Log Backup
BACKUP LOG TestDB TO DISK = N'e:\BACKUP\TestDB_log.trn' WITH NOFORMAT, NOINIT, NAME = N'TestDB Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
-- DB Shrink
USE TestDB
GO
DBCC SHRINKFILE (N'TestDB_log' , 0, TRUNCATEONLY)
GO
USE [master]
GO
ALTER DATABASE TestDB MODIFY FILE ( NAME = N'TestDB_log', SIZE = 10GB )
GO
dbcc loginfo(TestDB)
'DB Skill > MSSQL' 카테고리의 다른 글
mssql '데이터베이스 보안 주체는 데이터베이스의 스키마을(를) 소유하며 삭제할 수 없습니다' (0) | 2021.08.20 |
---|---|
mssql 형변환 잘못된 쿼리 확인 (0) | 2021.08.19 |
mssql waitresource 기반 page정보로 table 및 index 확인 (0) | 2021.08.19 |
mssql 사용자 데이터베이스 이동(mdf, ldf 위치 변경) (0) | 2021.08.19 |
mssql tempdb 물리적 위치 변경 (0) | 2021.08.18 |