클러스터 로그 확인

 

Get-ClusterLog -UseLocalTime -Destination .

(Get_Cluster).ClusterLogLevel

 

 

리소스 정보

PS> Get-ClusterResource

PS> Get-ClusterResource "SQL Server" | Get-ClusterParameter

 

 

그림에서도 볼 수 있듯이 SQL Server 리소스의 HealthCheckTimeout, FailureConditionLevel 값을 확인할 수 있으며 아래와 같이 쿼리를 통해서도 이러한 속성값을 변경할 수 있습니다.

 

 

ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY HealthCheckTimeout = 60000;

ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY FailureConditionLevel = 3; 

 

 

 

 

 

이벤트 로그

Get-EventLog [-AsString] [-ComputerName <string[]>] [-List] [<CommonParameters>]

 

Get-EventLog [-LogName] <string> [[-InstanceId] <Int64[]>] [-After <DateTime>] [-AsBaseObject] [-Before <DateTime>] [-ComputerName <string[]>] [-EntryType <string[]>] [-Index <Int32[]>] [-Message <string>] [-Newest <int>] [-Source <string[]>] [-UserName <string[]>] [<CommonParameters>]

 

PS> Get-EventLog -list

 

최근 3개의 시스템 로그 확인하고 Message 내용을 좀 더 자세히 보기 위해 Format-List cmdlet 을 사용합니다.

PS> Get-EventLog System -newest 3

 PS> Get-EventLog System -newst 1 | Format-list

 

 

시스템 이벤트 로그 중 Source 값이 EventLog 인 것에 대한 필터링

PS> Get-EventLog System | Where-Object {$_.Source -eq "EventLog"}

 

 

이벤트 로그 Source(EventLog) 와 EventID(6005) 에 대한 OR 필터링

PS> Get-EventLog System -Source EventLog | Where-Object {$_.EventID -eq "6005"}

 

Index 번호를 사용하여 해당 이벤트 상세 확인

PS> $a = Get-EventLog System -Index 406

 PS> $a | Format-List -property *

 

 

이벤트 로그 메시지에 포함된 문자열을 검색하여 해당 정보를 text 파일로 기록합니다.

PS> Get-EventLog System -message "*uptime*"

 PS> Get-EventLog System -index 467 | Format-List > uptime.txt

 

이벤트 로그 발생 빈도 카운트

PS> $events = Get-EventLog System

 PS> $events | Group-Object -property source -noelement | Sort-Object -property count -descending


'Microsoft > Cluster' 카테고리의 다른 글

Cluster RHS  (0) 2019.01.17


Resource Hosting Subsystem 이라는 RHS online, Offline, Isavlie , Lookalive 등을 담당하는데요. 이는 cluster resource dll 의 하위 프로세스

정도로 이해하셔도 됩니다. RHS looksalive 5 단위로 모니터링 하고, 실패시 5번까지 check 합니다. 여기서 failed 감지되면 60초를 기다리지 않고 즉시, IsAlive 체크로 실제 상태를 점검합니다.

 

  • LooksAlive is a quick light lightweight check that happens every 5 seconds by default
  • IsAlive is a more verbose check that happens every 60 seconds by default. 

 

여기서 5 60초는 리소스 속성에서 변경이 가능합니다.

 

그리고 IsAlive Check 에서 적절한 응답이 없는 경우 바로 Recover Action 하지 않고 300 동안 대기합니다.

이 설정은 Deadlock Timeout 값으로 설정이 가능합니다.

변경은 아래와 같이 설정하면 됩니다.

(Get-ClusterResource Resource Name).DeadlockTimeout = 300000

 

300 이후 failed 찍히고, 즉시(15분내 1) 재시작을 시도하며, 2 실패시 Failover 하게 됩니다.

하지만 timeout 같은 경우가 아닌, 리소스의 문제가 감지되면 즉시 Action 하게 되므로 설정의 변경 의미는 없습니다.

 

IsAlive 실패하는 경우는 아래의 경우들이 있을수 있습니다.

 

  • Deadlocks in a resource DLL
  • Crashes in a resource DLL
  • RHS process itself terminates in the cluster
  • Cluster service fails on the node
  • Operating system failures (e.g. resource exhaustion)

 

File Server 리소스의 failed 간혈적으로 발생한다면 smb, msxsrv등의 server services 관련 Hotfix 설치하시면 증상에 도움이 됩니다.

예전에 가이드 드렸던 kb2775511 등이 대표적입니다.


'Microsoft > Cluster' 카테고리의 다른 글

Cluster Information - Powershell  (0) 2019.01.17

[환경]

Windows2012 R2 Remote Desktop Session Host



[이슈사항]

Windows2012 R2 Remote Desktop Session Host 올린이후 Jeus 성능이 현저히 낮아지는 증상이 나타남.


1. Remote Desktop Session Host 역할이 서버에 설치되면 예를 들어, 특정 Application에서 File Write System 프로세스의 Worker 쓰레드에서 이를 처리하게 되는데 다음 화면의 Call Stack과 같이 이 과정에 TSFairShare.sys 드라이버가 관여하게 됩니다.


2. 이는 Remote Destkop Session Host 역할이 설치됨으로써 Resource 대한 Fair Share 기능이 추가되기 때문입니다. 기능은 2008 R2부터 도입이 되었고 이름 그대로 여러 Remote Session 사용할 특정 Session에서 Resource(CPU, Disk, Network) 사용량에 대해 조절하게 됩니다.

  1. Network Fairshare Dynamically distributes available bandwidth across sessions based on the number of active sessions to enable equal bandwidth utilization.
  2. Disk Fairshare Prevents sessions from over utilizing disk usage by equal distribution of disk I/O among sessions.
  3. CPU Fairshare Dynamically distributes processor time across sessions based on the number of active sessions and load on these sessions. This was introduced in Windows Server 2008 R2 and has been improved for heavier loads in Windows Server 2012.


[해결방안]


1. CPU Fair Share

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System 하위에 있는 EnableCPUQuota 값을 0으로 변경

 

2. Network Fair Share

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\NetFS 하위에 있는 EnableFairShare 값을 0으로 변경

 

3. Disk Fair Share

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\Disk 하위에 있는 EnableFairShare 값을 0으로 변경


끝.


그룹정책이 SQL 계정에 적용 되었을 때 계정의 상태를 확인 하는 쿼리입니다.

해당 쿼리는 SQL Server 2008 R2 이상에서 적용 하시기 바랍니다. (2005 버젼에서는 ExpirationDate 이 없습니다.)

 

SELECT name

,       LOGINPROPERTY ( name , 'IsExpired' ) AS [IsExpired]

,       LOGINPROPERTY ( name , 'IsLocked' ) AS [IsLocked]

,       LOGINPROPERTY ( name , 'PasswordLastSetTime' ) AS [PasswordLastSetTime]

,       DATEADD(DAY, CAST(LOGINPROPERTY(name, 'DaysUntilExpiration') AS int), GETDATE()) AS ExpirationDate

FROM sys.server_principals

WHERE type = 'S'




컬럼 설명

이름

만료 상태 확인 (0 : 정상)

잠김 상태 확인 (0 : 정상)

Password 마지막 변경일

Password 만료일

 

테스트 환경 그룹정책 내용


 

관련Site

https://msdn.microsoft.com/en-us/library/ms345412(v=sql.105).aspx


일반적은 VSS를 사용하여 Backup을 진행하는 Program VSS Requestor라고 합니다.

VSS Requestor의 경우 VSS 관련 Component에게 Request를 하여 Backup을 진행하게 됩니다.

이때, VSS 서비스의 경우 요구에 따라 Backup 진행시 Shadow 복사본을 생성하여 Data에 대한 변경 사항 등을 Tracking 하여 Backup을 진행하게 됩니다.

이때 Shadow 복사본이 존재하게 되는 공간이 Shadows Storage입니다.

따라서 Shadow 복사본 생성시에 Shadow 복사본이 존재하는 Shadows storage의 공간이 부족하게 되시면 Shadow 복사본이 생성되지 않게되시고 Backup 등이 실패하실 수 있습니다.




ShadowStroage의 경우 Default MAX 값이 Volume 15% 크기로 자신의 Volume에 설정되게되며, Shadow Copy 본의 크기가 증가한다고 해서 Volume Max 값이 증가하지는 않습니다.

그리고 Backup이 진행되실때 3rd Party 백업 솔루션에서 해당 Max 값을 변경하는 것이 가능하십니다.

현재 공간이 부족하시다면 다른 Volume에 해당 공간이 생성되실 수 있도록 설정이 가능하시고, 해당 공간을 Backup 솔루션에서 사용한다면 해당 값을 수동으로 변경하였을때 서비스 상에도 이슈는 없는지 확인 부탁드립니다.


만일 Shadowsotrage 크기 조절을 수동으로 진행하실 경우 하기의 내용에 대해서 적용해 볼 수 있습니다.

 D 볼륨

vssadmin resize shadowstorage /for=D: /on=D: /maxsize=1111G

 E 볼륨

vssadmin resize shadowstorage /for=E: /on=E: /maxsize=1167G

 

노란 부분을 수정하셔서 Volume 위치를 조절할 수 있으십니다.


The Basics of the Volume Shadow Copy Service (VSS)

https://blogs.technet.microsoft.com/josebda/2007/10/10/the-basics-of-the-volume-shadow-copy-service-vss/ 


[환경]

Windows2016 1607

 

[이슈사항]

시작버튼이 클릭후 창이 뜨지않는 현상


[확인내용]


1.     Service -> Application Identity – 자동으로 실행시 “엑세스가 거부되었습니다” 레지스트리로 가서 강제시작으로 키 변경을 합니다..

Start DWORD = 2 (기본값 3/ 수동)




2.  현재 테스트머신의 그룹정책-보안설정-응용프로그램제어정책-appLocker-실행파일 규칙에 3가지의 허용 Roul이 적용되어 있습니다.

BUILTIN\Administrators /모든파일 /허용

Everyone / %WINDIR%

Everyone / %Programfiles%




3.   정책적용후 시스템 재시작 혹은 GPUPDATE를 한뒤 시작버튼의 비정상작동과 개인설정을 클릭시  에러메세지가 발생합니다.



4.  그룹정책에 Windows설정 – 보안설정 – 응용프로그램제어정책 – 패키지된 앱규칙에서 “자동으로 규칙만들기”를 클릭합니다.


5.  응용프그램 및 권한 부분에서 Everone 그룹에 이컴퓨터에 설치된 모든 패키지된 앱에 대해 규칙생성을 클릭후 다음을 클릭합니다.

6. 다음을 클릭합니다.

7.  규칙검토 후 만들기를 클릭합니다. (패키지된 앱 순으로 정책이 생성됩니다)


8   패키된 앱 정책이 정상적으로 만들어 졌습니다.

9 시스템 재시작 혹은 GPUPDATE 를 한뒤 시작버튼 클릭과 사용자 배경으로 정상적으로 확인됩니다.


[문의사항]

서버 메모리 사용량 90% 임계치 초과

Svchost.exe (Eventlog, lmhosts) 메모리 사용량 증가

 

[환경]

Windows Server 2008 R2 SP1

SQL Server

 

[제안]


 

1. 모니터링 카운터

버퍼 캐시 메모리 부족을 확인하기 위해 SQLServer:Buffer Manager Buffer cache hit ratio, Page life expectancy 카운터를 모니터링 하시기 바랍니다.

아래 제시된 임계값은 일반적으로 알려진 허용 수치입니다. 절대값이 아니므로 임계값 이하라고해서 반드시 메모리가 부족한 상황은 아닙니다.

메모리 부족 판단이 어려울 경우 참고용으로 활용하실 수는 있습니다.

성능모니터(perfmon)으로 카운터를 추가해서 확인해도 관계 없습니다.

 

Buffer cache hit ratio – 캐시 적중률 (90% 이상)

SELECT (a.cntr_value * 1.0 / b.cntr_value) * 100.0 as BufferCacheHitRatio

FROM sys.dm_os_performance_counters  a

JOIN  (SELECT cntr_value,OBJECT_NAME

    FROM sys.dm_os_performance_counters 

    WHERE counter_name = 'Buffer cache hit ratio base'

        AND OBJECT_NAME = 'SQLServer:Buffer Manager') b ON  a.OBJECT_NAME = b.OBJECT_NAME

WHERE a.counter_name = 'Buffer cache hit ratio'

AND a.OBJECT_NAME = 'SQLServer:Buffer Manager'

 

Page life expectancy – 페이지 메모리 상주 시간 (300초 이상)

시간() 개념이기 때문에 무제한 증가하지도 값을 유지하지도 않습니다.

300 이상의 값까지 증가한 0으로 다시 초기화되는 상황은 정상이라고 판단해도 무방합니다.

SELECT object_name, counter_name, cntr_type

FROM sys.dm_os_performance_counters 

WHERE counter_name = 'Page life expectancy'

AND OBJECT_NAME = 'SQLServer:Buffer Manager'

 

 

2. Max Server Memory 현재 설정값 확인

sp_configure 'show advanced options', 1

go

reconfigure

go

 

sp_configure 'max server memory (mb)'

reconfigure

go

 

(아래 캡쳐에서는 2048MB(2GB) 설정됨)

 

3. Max Server Memory 설정

주의) 업무시간대에 진행하실 것을 권고 드립니다.

온라인 중에 적용 가능하지만, Plan Cache 초기화되어 적용 얼마간 CPU 사용량이 급증하고 성능이 저하될 수 있습니다.

-- ) 10GB(10240MB)로설정

sp_configure 'max server memory (mb)', 10240

reconfigure

go

 


'Microsoft > SQL' 카테고리의 다른 글

SQL Account expired date 확인 방법  (0) 2018.09.07
트랜젝션 로그 불리는 방법  (0) 2018.08.03
Disk I/O Query  (0) 2018.08.03
DBCC SHRINKFILE & Internal  (0) 2018.08.03

 

 

/*


데이터가 있는 테이블을 자가 복제 하여 트랜젝션 로그를 늘릴 수 있습니다.

해당 테스트에서 사용 하는 테이블 [AdventureWorks2012].[Person].[Person]  [AdventureWorks2012] DB 에서 용량이 가장 테이블 입니다.

sp_helpdb [DatabaseName] 로 중간 중간 파일의 용량을 확인 합니다.

 

truncate table [dbo].[Person]

*/

 

--1 단계 테이블을 생성 합니다.

SET ANSI_NULLS ON

GO

 

SET QUOTED_IDENTIFIER ON

GO

 

CREATE TABLE [dbo].[Person](

        [BusinessEntityID] [int] NULL,

        [PersonType] [nchar](2) NULL,

        [NameStyle] [bit] NULL CONSTRAINT [DF_Person_NameStyle]  DEFAULT ((0)),

        [Title] [nvarchar](8) NULL,

        [FirstName] [nvarchar](50) NULL,

        [MiddleName] [nvarchar](50) NULL,

        [LastName] [nvarchar](50) NULL,

        [Suffix] [nvarchar](10) NULL,

        [EmailPromotion] [int] NULL CONSTRAINT [DF_Person_EmailPromotion]  DEFAULT ((0)),

        [AdditionalContactInfo] [xml] NULL,

        [Demographics] [xml] NULL,

        [rowguid] [uniqueidentifier] NULL,

        [ModifiedDate] [datetime] NULL

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 

GO

--2단계 원본 테이블에서 데이터를 가져 옵니다.

 

 

INSERT [dbo].[Person] (BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate)

SELECT BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate FROM [AdventureWorks2012].[Person].[Person]

 

--데이터 백업용 테이블을 생성 합니다.

SELECT * INTO Person2 FROM [dbo].[Person]

 

--3단계 자가 복제를 시작 합니다. 순서는 (테이블 1에 데이터 입력 -> 테이블 2 데이터 입력 -> 테이블 1 Delete ) 입니다.

 

DECLARE @int int

SET @int = 0

WHILE (@int < 5)

BEGIN

 

INSERT [dbo].[Person] (BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate)

SELECT BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate FROM [dbo].[Person2]

 

INSERT [dbo].[Person2] (BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate)

SELECT BusinessEntityID, PersonType, NameStyle, Title, FirstName, MiddleName, LastName, Suffix, EmailPromotion, AdditionalContactInfo, Demographics, rowguid, ModifiedDate FROM [dbo].[Person]

 

DELETE [dbo].[Person]

 

SET @int = @INT +1

 

END

 

/*

 

 

(19972 행이 영향을 받음)

 

(39944 행이 영향을 받음)

 

(39944 행이 영향을 받음)

 

(59916 행이 영향을 받음)

 

(59916 행이 영향을 받음)

 

(59916 행이 영향을 받음)

 

(119832 행이 영향을 받음)

 

(119832 행이 영향을 받음)

 

(119832 행이 영향을 받음)

 

(239664 행이 영향을 받음)

 

(239664 행이 영향을 받음)

 

(239664 행이 영향을 받음)

 

(479328 행이 영향을 받음)

 

(479328 행이 영향을 받음)

 

(479328 행이 영향을 받음)

 

 

sp_helpdb [SUNY]

SUNY    1       C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SUNY.mdf        PRIMARY 1583104 KB     Unlimited      1024 KB data only

SUNY_log       2       C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\SUNY_log.ldf   NULL    4632576 KB     2147483648 KB  10%        log only

 

*/

 

 

*/


[오류 사항]

  • 오류 : 오류 메시지는 SQL Server I/O 대한 병목 현상을 나타냅니다.
  • sql server has encountered 1 occurrence(s) of i/o requests taking longer than 15 seconds to complete
  • autogrow of file 'templog' in database 'tempdb' was cancelled by user or timed out after 117437ms
  • 담당자: 김석수 책임
  • 시간: 2시간

 

 

[추후 동일 증상 발생 확인 사항]

  1. 현재 대기 보류 중인 I/O 확인 합니다.

SELECT SUM(pending_disk_io_count) AS [Number of pending I/Os] FROM sys.dm_os_schedulers

 

  1. 1 쿼리에서 보고 I/O 카운터에 대하여 세부 사항을 확인 합니다.
  • IO_Pending 값이 0 이면 SQL Server 아직 I/O 처리 하지 않은 입니다.
  • IO_Pending 값이 1 이면 Windows 에서 아직 I/O 처리 하지 않은 입니다.

SELECT *  FROM sys.dm_io_pending_io_requests

 

  1. 보류 중인 I/O 통해서 디스크 병목 현상을 확인 합니다.

SELECT DB_NAME(mf.database_id) AS [Database] , mf.physical_name ,r.io_pending , r.io_pending_ms_ticks , r.io_type , fs.num_of_reads , fs.num_of_writes

     FROM sys.dm_io_pending_io_requests AS r INNER JOIN sys.dm_io_virtual_file_stats(NULL, NULL)

                                                                 AS fs ON r.io_handle = fs.file_handle INNER JOIN sys.master_files

                                           AS mf ON fs.database_id = mf.database_id

     AND fs.file_id = mf.file_id ORDER BY r.io_pending , r.io_pending_ms_ticks DESC ;

 

  1. I/O 유발 쿼리를 찾습니다.

select top 5 (total_logical_reads/execution_count) as avg_logical_reads,

                   (total_logical_writes/execution_count) as avg_logical_writes,

           (total_physical_reads/execution_count) as avg_physical_reads,

           Execution_count, statement_start_offset, p.query_plan, q.text

from sys.dm_exec_query_stats

      cross apply sys.dm_exec_query_plan(plan_handle) p

      cross apply sys.dm_exec_sql_text(plan_handle) as q

order by (total_logical_reads + total_logical_writes)/execution_count Desc

 

  1. 테이블 당 인덱스 사용 통계 / 테이블 가장 많은 I/O 작업을 유발하는 테이블을 확인 합니다.

SELECT d.name as [Database],  OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],         

I.[NAME] AS [INDEX NAME],         

USER_SEEKS,         

USER_SCANS,         

USER_LOOKUPS,         

USER_UPDATES

FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S         

INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = S.[OBJECT_ID]              

AND I.INDEX_ID = S.INDEX_ID

Join sys.Databases d on s.database_id = d.database_id

WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1

Order by USER_SEEKS + USER_SCANS + USER_LOOKUPS + USER_UPDATES desc

 

 

SELECT d.name, t.name, OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],      

 I.[NAME] AS [INDEX NAME],      

  A.LEAF_INSERT_COUNT,       

  A.LEAF_UPDATE_COUNT,       

  A.LEAF_DELETE_COUNT

 

FROM   SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A       

INNER JOIN SYS.INDEXES AS I          ON I.[OBJECT_ID] = A.[OBJECT_ID]  

join sys.tables t on i.object_id = t.object_id     

join sys.databases d on a.database_id = d.database_id

AND I.INDEX_ID = A.INDEX_ID WHERE  OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1

order by A.LEAF_INSERT_COUNT + A.LEAF_UPDATE_COUNT + A.LEAF_DELETE_COUNT desc

 

  • Tempdb 증가 원인 추적

USE TEMPDB;

 

-- TEMPDB allocated by session:

select *, (allocated_mb - deallocated_mb)reserved_mb from

(

select session_id

   ,(((sum(internal_objects_alloc_page_count + user_objects_alloc_page_count)*8024)/1024)/1024) as allocated_mb

   ,(((sum(internal_objects_dealloc_page_count + user_objects_dealloc_page_count)*8024)/1024)/1024) as deallocated_mb

from sys.dm_db_task_space_usage

group by session_id

) x where allocated_mb > 0;

 

-- TEMPDB allocated by object:

select o.type_desc

, substring(o.name,1,charindex('__',o.name)+1)+right(o.name,12) table_shortname

, si.name index_name

, case si.index_id when 0 then 'HEAP' when 1 then 'CLUSTERED' else 'NONCLUSTERED' end index_type

, row_count

, ((reserved_page_count * 8024) / 1024 / 1024)reserved_mb

, create_date

from sys.dm_db_partition_stats ps

left join sys.objects o on ps.object_id = o.object_id

left join sys.indexes si on si.object_id = o.object_id and si.index_id = ps.index_id

where is_ms_shipped = 0

order by reserved_page_count desc;

 

-- TEMPDB Data/Log File Auto Growth events:

DECLARE @filename VARCHAR(500)

SELECT @filename = SUBSTRING(path, 0,LEN(path) - CHARINDEX('\',REVERSE(path)) + 1)+ '\Log.trc'

   FROM sys.traces

      WHERE is_default = 1 ;

SELECT TOP 100

  te.Name AS EventName

  ,StartTime

  ,NTDomainName

  ,NTUserName

  ,LoginName

  ,ApplicationName

  ,HostName

  ,DatabaseName

  ,Filename

  ,IntegerData/128 [Size MB]

  ,CAST(Duration/1000000. AS DECIMAL(20,2)) AS [Duration sec]

  ,EndTime

  ,SPID

  ,SessionLoginName

  ,Error

  ,Success

  ,IsSystem

FROM fn_trace_gettable(@fileName, DEFAULT) gt

  INNER JOIN sys.trace_events te ON EventClass = te.trace_event_id

WHERE EventClass IN(92, 93) -- Data/Log File Auto Grow

AND DatabaseName = 'tempdb'

ORDER BY StartTime DESC;

 

  • Tempdb 대한 추적 플래그 T1118 을 설정 합니다.
  • DBCC traceon(1118, -1)

 


  • 사용 Script
    1. DBCC SHRINKFILE Automation Script
    • 대상 장비 변경 시 아래 변수만 수정하시면 됩니다.
    • @TargetSizeMB : SHRINKFILE 작업 데이터 파일 크기
    • @ShrinkUnitSize
    • SHRINKFILE 수행 단위(MB), 값이 경우 서비스에 영향을 줄 수 있으며, 일반적으로 1GB 혹은 사용량이 적을 경우 5GB까지 변경 사용
    • 사용량이 많은 시스템일 경우 100MB/512MB 조절 사용 필요, ShrinkfileSize를 줄일 경우 시스템 영향도를 줄일 수 있습니다.
    • @DatabaseName : SHRINKFILE 대상 데이터베이스 이름, 가급적 해당 데이터베이스 이동 사용(use 데이터베이명 혹은 SSMS SHRINKFILE 대상 DB 이동)

    SET NOCOUNT ON

    use 'SHRINKFILE데이터베이스명

    GO 

    DECLARE            

           @shrinkUnitSize            INT                        -- Unit of Shrinkfile Size

    ,      @TotalSizeMB        INT                        -- Current DataFile Size

    ,      @TargetSizeMB       INT                        -- Size Of Target

    ,      @filename                  VARCHAR(50)         -- Shrinkfile File Name

    ,      @start_time                DATETIME            -- Start Time

    ,      @databaseName       SYSNAME                    -- Target Database Name

    ,      @loopCnt                   INT                        -- loop Variables

     

    SET @TargetSizeMB = 300000  -- 현재 데이터파일 크기

    SET @shrinkUnitSize = 500 -- SHRINKFILE Size 단위(MB) - 초기 500MB

    SET @DatabaseName = 'SHRINKFILE데이터베이스명'

    SET @loopCnt = 1

     

    --SET Current Database Size, Change FileId or Set the FileName, 데이터베이스 Logical Finename

    SELECT @TotalSizeMB = size/128, @filename = name

      FROM sys.sysaltfiles where dbid=db_id(@DatabaseName) and fileid = 1

     

    --SHRINKFILE 결과

    SELECT @TotalSizeMB AS CurrentSizeMB, GETDATE() AS StartTime

     

    WHILE (@TotalSizeMB > @TargetSizeMB) -- for Loop Shrinkfile to @TargetSize

    BEGIN

             SET @start_time = GETDATE()

             SET @TotalSizeMB = @TotalSizeMB - @shrinkUnitSize       

     

             DBCC SHRINKFILE (@filename, @TotalSizeMB) WITH NO_INFOMSGS

     

             PRINT 'idx = ' + CAST(@loopCnt AS varchar(10)) +

                  ', totalSizeMB = ' + CAST(@TotalSizeMB AS varchar(10))

                  + ', duration = ' + CAST(DATEDIFF(s, @start_time, getdate()) AS varchar(10))

     

             SET @loopCnt = @loopCnt + 1

    END

     

    --SHRINKFILE 결과

    SELECT @TotalSizeMB AS ShrinkSizeMB, GETDATE() AS EndTime

    GO

     

     

    1. DBCC SHRINKFILE internal
    • DBCC SHRINKFILE DbccSpaceReclaim->DbccFilesCompact->DbccLOBCompact 입니다.
    • DbccSpaceReclaim : DML구문으로 인해 발생 미사용 Extents 대한 Clean-up 데이터 이동에 사용 Extents 대한 제거 작업
    • DbccFilesCompact : Truncate 대상 이전에 있는 페이지를 이동하고 Truncation 수행
    • DBCC SHRINKFILE 파일의 지점부터 수행 순차적으로 수행 됩니다. 지정에 위치한 Extents들을 데이터 파일 비어 있는 공간으로 이동을 하게 되고,

       이 단계에서 인덱스 Page들에 대한 Linked List Chain 느슨하게 풀리게 되면서 인덱스 조각도가 심화되는 상황이 발생 됩니다.

    • DbccLOBCompact : LOB(Large Object) 대한 Compact 작업 수행

    è 데이터 파일에 대한 DBCC SHRINKFILE 성능 저하 발생 구간

    Step

    Command

    Description

    1

    DbccSpaceReclaim

    Clean up deferred allocations and purge empty extents preparing for data moves.  

    2

    DbccFilesCompact

    Moves pages beyond the target to before the target and truncate file as required.

    3

    DbccLOBCompact

    Compacting the LOB data.

     




    è 1GB짜리 데이터 파일에 대한 SHRINKFILE 진행


    1. 미사용 Extents 대한 Clean-up 데이터 이동에 사용 Extents 대한 제거 작업이 진행 되고, 1GB 데이터파일의 부분의 여유 공간을 확인합니다. -> DbccSpaceReclaim
    2. 750MB 이내에 할당되지 않은 Page 대한 정보를 수집합니다.
    3. 750MB->1GB 사이에 위치한 GAM(Global Allocation Map) Marking되어 있는 모든 페이지를 검색 , Truncation 수행되어야 하는 위치(750MB->1GB=250MB)에 할당되어 있는 Page(데이터 혹은 인덱스)들을 에서 조회한

    할당되지 않은 Page 이동합니다. -> DbccFilesCompact

    1. DBCC SHRINKFILE 구문에 TRUNCATEONLY 구문이 명시되어 있지 않은 경우, LOB(Large Object) 대한 Compact작업이 수행되게 됩니다. -> DbccLOBCompact
    2. DBCC SHRINKFILE 옵션
    • TRUNCATEONLY : 파일 끝의 모든 여유 공간을 운영 체제로 해제하지만 파일 내에서 페이지 이동을 수행하지 않습니다. 데이터 파일은 마지막으로 할당된 익스텐트까지만 축소됩니다
    • NOTRUNCATEONLY : target_percent 지정하거나 지정하지 않고 데이터 파일의 끝에 있는 할당된 페이지를 파일 앞의 할당되지 않은 페이지로 이동합니다파일 끝의 여유 공간이 운영 체제에 반환되지 않고, 파일의 물리적 크기가 변경되지 않습니다. 그러므로 NOTRUNCATE 지정하면 파일이 축소되지 않는 것처럼 보입니다.

    + Recent posts