SQL Server 가 설치된 서버의 CPU 사용율이 급등하고 있다면..

대부분의 경우에는 디스크 IO를 많이 유발시키거나 아니면 인덱스를 잘 못 타고 있어서 발생하고 있는 경우가 대 부분입니다.

그런데 이러한 경우 프로필러로 보면 어떤 쿼리에서 문제가 되는지 일부는 쉽게 확인 할 수 있지만..

CPU의 과도한 사용 때문에 응답이 늦는 경우에는 발견하기 어려운 경우도 종종 발생합니다.

 

이럴 때 확인 할 수 있는 쿼리는 아래 와 같습니다.

 

1. 실행 가능 작업의 값 확인 하기


SELECT
Scheduler_ID,
Current_Tasks_Count,
Runnable_Tasks_Count
FROM
SYS.DM_OS_SCHEDULERS
WHERE
Scheduler_ID < 255

 

2. CPU를 많이 사용하는 상위 50개의 SQL 문 확인하기

 

SELECT TOP 50 (a.total_worker_time/a.execution_count) AS [Avg_CPU_Time],
Convert(Varchar,Last_Execution_Time) AS 'Last_execution_Time',
Total_Physical_Reads,
SUBSTRING(b.text,a.statement_start_offset/2,
(case when a.statement_end_offset = -1 then len(convert(nvarchar(max), b.text)) * 2
else
a.statement_end_offset end - a.statement_start_offset)/2) AS Query_Text,
dbname=Upper(db_name(b.dbid)),
b.objectid AS 'Object_ID'
FROM sys.dm_exec_query_stats a
CROSS APPLY
sys.dm_exec_sql_text(a.sql_handle) AS b
ORDER BY
[Avg_CPU_Time] DESC

 

요즘 DB 에 대해 조금 깊이 있게 공부를 하고 있는데..

알면 알 수록 재미 있는 부분들이 많이 있네요. ^^

'IT 이야기 > DataBase' 카테고리의 다른 글

MSSQL for Linux  (0) 2016.11.18
Redis Architecture (번역문)  (0) 2016.06.27
SQL Server Performance Monitor Counter Part 1  (0) 2015.05.27
MS-SQL 성능 개선 - Index rebuild  (0) 2015.05.27
MSSQL File Size 구성  (0) 2015.05.27

 본 글은 Brad McGehee 님이 기고한 글을 번역한 문서입니다.

작성된지는 조금 오래(2005년) 되었지만 DB 서버의 성능을 측정하는 지표로 활용하는데에는 전혀 부족함이 없어 보입니다.

물론 SQL Server 버젼별로 성능 카운터가 더 많이 추가 되어서 버젼별로 상세한 상태를 확인 하는 부분에 대해서는 MSDN 의 On-Line 문서를 확인 하시는 것도 좋을 것 같습니다.

 

 번역 내용에 오역이 있더라도 널리 양해를 구합니다. (본문도 첨부합니다. )

 

Tips for Using SQL Server Performance Monitor Counters

By : Brad McGehee
Aug 24, 2005

 

 

SQL Server Access Methods object: Page Splits/sec

 

SQL Server 에서 I/O  초과하는 이유  하나는 page splitting이다. Page splitting  index data page  찾을  현재 page 새로 할당  page 사이에서 발생한다.  일반적으로 page splitting  일어 나는 동안 디스크 I/O 초과할  있고 성능을 저하 시키게 된다.

만약 서버상에서 많은 수의 page splits  발생하는 것을 확인하길 원한다면 SQL Server Access Methods object: Page Splits/sec 으로 모니터링   있습니다만약 page splits  높다면 index 들의 fill factor  증가시키는 것을 고려   있습니다. Fill factor  증가는 데이터를 채우기 전의 (pages)  많이 만든 다음 page split  발생되기 때문에 성능의 향상을 가져올  있습니다.

높은 수치의 Page Splits / sec  무엇을 의미하는가 ? 거기에 대한 간단한 답은 없습니다그것은 시스템상의 I/O subsystem상의 무엇인가로부터 영향을 받는 다는 것입니다하지만 일반적인 기본 조건에서 디스크 I/O 성능의 문제를 발견한다면  카운터는 보통 100 이상의 수치를 나타낼 것이고   Fill factor  증가가 성능의 향상을 가져올  있습니다.

*****

QL Server Buffer Manager Object: Cache Size (pages)

만약 서버상에 얼마나 많은 물리적인 RAM  SQL 서버의 data cache  할당되었는지 보고 싶다면 SQL Server Buffer Manager Object: Cache Size (pages) 으로 확인   있습니다 수치는 page 안에서 표현됩니다그렇기 때문에 8K(8,192) 단의로 확인할  있으며 이것으로 RAM  K 할당되어져 있는지 확인   있습니다.

일반적으로  수치는 서버 전체 RAM  사이즈와 유사한 것이 좋고 NT, SQL Server 기타 다른 유틸리티들의 ram 보다 작습니다.

만약 특정 양의 RAM 데이터 캐시에 할당하였다면 당신이 예상하는 것보다  사이즈는 작을 것입니다이럴  당신을  원인을 찾기 위해 확인을   필요가 있습니다아마도 당신은 SQL Server 동적 RAM 할당하거나 SQL Server 순간적으로 성능 최적화을 위해 적은 양의 RAM으로  사용되는 것을 원하지 않을 것입니다어떤 이유에서건 이것에 대한 해결책이 필요하고 데이터 캐시의 양이 SQL Server SQL Server 성능에 영향을 미친다는 사인이   있습니다.

실제로는 다른 항목으로 SQL Server 메모리가 부족하지 않는지 확인 하는  좋은 방법이 있기 때문에  카운터를 보기 위해 많은 시간을 허비하지는 않습니다.

 

*****

 

SQLServer: SQL Statistics: Batch Requests/Sec 

SQL Server 얼마나 바쁜지 피부로 느끼기 위해 확인하는 카운터는 SQLServer: SQL Statistics: Batch Requests/Sec  입니다 카운터는 SQL Server 초당 수신한 batch request들의 수를 나타내고 일반적으로 서버의 CPU 얼마나 busy 한지를 측정하는 용도로 이용합니다일반적으로 말하지만 초당 1000 batch request  넘는다면 이것은 매우 busy  상태의 SQL Server 나타내고 있고 만약 CPU 병목현상을 이미 경험하지 못하였다면  그러한 상황이 닦칠  있다는 의미이기도 합니다물론 이것은 상대적은 수치이고  좋은 하드웨어를 갖고 있다면  많은 수의 batch request  처리   있습니다.

네트웍 병목 현상으로는 일반적으로 100 Mbps 네트웍 카드는 일반적으로 초당 3000 batch request  가능합니다만약  서버가  정도로 busy 상태를 유지한다면 네트웍 카드를 하나  추가하거나 1 Gbps 네트웍 카드로 변경하는 것이 필요합니다.

일부 DBA 들을 SQLServer: Databases: Transaction/Sec: _Total   SQL Servver  전체 활동량을 측정하기 위해 이용합니다.  하지만 이것은 그리 좋은 생각이 아닙니다Transaction/Sec   모든 activity  측정하지 않고 Transaction 안에 있는 activity 만을 측정하게 됩니다그렇기 때문에 Transaction/Sec  대신에 항상 SQLServer: SQL Statistics: Batch Requests/Sec 카운터를 이용하여 측정하는 것이 좋습니다.

*****

SQLServer: SQL Statistics: SQL Compilations/Sec

Transact-SQL 코드의 SQL 컴파일이 발생하는 것은 SQL Server 수행하는 정상적인 영역의 일부입니다하지만 컴파일은 CPU  기타 리소스를 많이 사용하기 때문에 SQL  가능하면 캐시 안의 수행 계획 (execution plan)안에서 재수행   있도록 작성하는 것이 좋습니다. (execution plan 컴파일이 발생할  생성됩니다.)   많은 실행 계획들이 이용됐다는 것은 서버상의  적은 오버헤드를 유발시키고 성능을 더욱 향상시키게 됩니다.

서버상에서 얼마나 많은 compilation 발생했는지 확인하기 위해서는 SQLServer: SQL Statistics: SQL Compilations/Sec 카운터를 이용할  있는습니다.  예상할  있듯이  카운터를 초당 얼마나 많은 컴파일이 발생했는지는 나타냅니다.

일반적으로 초당 100 compilation 이상 발생한다면 서버상에 불필요한 오버헤드를 발생하고 있다는 것입니다수치가 높다는 것은 서버가 의미없이 바쁘거나 수행중에 불필요한 재컴파일이 발생한다는 것입니다예를 들어 object 스키마가 변경되었거나 병렬 실행 계획이 질렬로 수행된다거나통계가 재계산되었거나 다른 일들이 발생하였다면 SQL Server 강제적으로 재컴파일   있습니다어떤 경우에는 불필요한 컴파일을 숫자를 줄일  있습니다 곳에서 page   자세한 내용을 확인   있습니다.

*****

 

SQLServer: Databases: Log Flushes/sec counter 

SQLServer: Databases: Log Flushes/sec counter   초당 로그가 디스크에 쓰여지는 (flush) 되는 수치를 나타냅니다이것은 데이터베이스 레벨별로 또는 전체에 대해서 측정할  있습니다.

정확히 log flush  무엇일까요 ? 이것을 설명하는 가장 좋은 방법은 예를 드는 방법입니다예를 들어 당신이 10 개의 INSERT 문을 수행하는 트랜잭션을 시작한다고 가정해 본다면  번째로 INSERT  실행되고 새로운 데이터가 데이터 페이지로 삽입됩니다이것은 동시에 2가지가 발생됩니다  버퍼 캐시 안에 있는 데이터 페이지는 새로운 INSERT Row 데이터로 갱신되는 것과 그리고 로그 파일을 위해 데이터를 책정합니다 것은 트랜잭션이 완료될 때까지 계속됩니다동시에 로그 캐시로부터의  트랜잭션을 위한 데이터는 즉시 log file  기록합니다하지만 버퍼 캐시에 머물고 있는 데이터는 다음  checkpoint 프로세스가 실행되기 전까지 남아 있게 되고 checkpoint  실행될  데이터 베이스는 새로운 INSERT row들이 갱신합니다.

 동안 log cache 라는 부분에 대해서 전혀 들어보지  했을 수도 있지만 log cache SQL Server  데이터를 log file  쓰기 위해 기록하는 메모리 위치입니다. Log cache  목적은  트랜잭션을 commit 하기 전에 roll back 하는데 이용하기 위해 사용 하는 것으로 매우 중요합니다.  하지만 단지  트랜잭션이 완료되면 ( 이상 롤백은   없음) log cache  물리적 로그 파일로 즉시 방출(flush) 하게 됩니다이것은 일반적인 처리입니다. SELECT 쿼리들은 데이터를 수정할   없고 트랜잭션을 생성할  없고 log 방출 역시 하지 않는 다는 것을 기억하십시요.

본질적으로 로그 방출(Log Flush) log cache 로부터 물리적인 log file  기록될  발생합니다.  그래서 기본 성질은 log flush  트랜잭션이 완료될 때마다 발생되게 되고 여러 개의 트랜젼션의 수와 관련되어 SQL Server 의해서 발생되게 됩니다그리고 예상하듯이 log flush  사이즈 (얼마나 많은 데이터를 물리적 디스크로 기록할 것인가에 대해 트랜잭션에 따라 매우 다양해 집니다 정보는 어떤 의미를 우리에게 전달할까요 ?

 

이미 우리는 disk I/O  병목에 대해서 경험하고 있다고 가정해 봅니다하지만 우리는 그에 대한 원인을 전혀 모르고 있는 상태이구요디스크 I/O 병목에 대해서 문제 해결을   있는  가지 방법은  초당 기록되는 log flushed 카운터(Log Flushes/sec counter) 캡쳐 하고 얼마나 busy 상태인지 확인 하는 것입니다이미 예상할  있듯이 만약 서버가 많은 수의 트랜잭션을 처리하고 있다면 그것은 또한 많은 수의 log flush  발생하고 있다는 의미이고  수치는 트랜잭션을 생성하는 action-type 쿼리들이 얼마나 busy 상태인지를 나타내는 서버들간의 수치로 확인 됩니다당신이  정보로 하고자 하는 것은 당신의 서버에서 예상했던 것보다  많은 수치의 log flush  발생한다는 상황입니다.

 

예를 들어  테이블에 매일 백만건의 INSERT  발생하고 거기에는 insert 하는 여러 가지 다른 방법이 있습니다.   번째로 각각의 row 개별적으로 insert   있고  INSERT 문장은 sinlgle transaction 으로 wrapped 되어 있습니다 번째는 모든 INSERT 문장은 하나의 transaction 문장 안에 포함되어 있습니다그리고 마지막으론 INSERT 문장이 다중 트랜잭션(multiple transaction) 문장안에 나뉘어져 들어가 있고 어디선가 1에서 1,000,000 까지의 INSERT 하게 됩니다  가지의 경우는 옵션이 다르고 SQL Server 상에서 작용하는 효과 역시 다르게 나타나고 초당 log flush   역시 다르게 나타납니다덧붙이자면 이것은 그렇게 생각하던 아니던 당신의 프로세스에서 하나의 트랜잭션만 발생한다고 착각하기 쉬운 경우입니다대부분의 사람들은 하나의 프로세스는 하나의 트랜잭션만 유발한다고 생각하는 경향이 있습니다.

 

..  번째 경우 백만건의 row  백만번 트랜잭션으로 INSERT 하게 되면 거기에는 또한 백만번의 log flush  발생합니다하지만  번째의 경우에는 백만건의 row   하나의 트랜잭션안에서 INSERT 하게  것입니다그리고  경우에 log flush   번만 발생하게 됩니다그리고  번째의 경우에는 log flush  수치는 트랜잭션의 수와 동일하게 됩니다.  사실 log flush  크기는  트랜젹션으로 처리하는 것보다는 백만 건의 트랜젼션으로 처리하는  보다 커질 것이다하지만 대부분의 경우에 이것은 여기에서 설명하듯이 성능을 측정하는 것에는 중요하지 않다.

 

.. 어느 옵션이 가장 좋을까 ? 모든 경우에서 당신은 여전히 많은 disk I/O  유발시킬 것입니다백만건의 row 처리  것이라면  상황을 개선시키는 확실한 방법은 없을 것이다하지만 하나 또는  개의 트랜잭션으로만 처리한다면 log flush  수치를 줄일  있고 이로 인해 disk I/O  상당 부분 줄임으로 인해 I/O 병목에 대해 개선할  있을 것입니다.

 이것으로 우리는 이것을 통해 2가지를 확인   있었습니다..  번째는 최대한 log flush  줄이기를 원한다는 것이고 이는 결국 당신의 서버상에서 트랜잭션의 수를 줄이는 것이 성능 개선의 방법이라는 것이다.

*****

SQL Server General Statistics Object: User Connections

 

SQL Server 여러 명의 사용자들이 이용하기 시작한 이후부터 성능을 확인 하기 위해 SQL Server General Statistics Object: User Connections 수치를 눈여겨  것이다 것은 현재 SQL Server 연결된 사용자의 수를 나타낸다. ( 전체 유저들의 수를 의미하는 것이 아니다. )

 

 수치를 관찰할   유저가 여러 개의 연결(connection)  유지할  있고 여러 명의 사람들이  사용자의 connection  공유할  있다는 것을 주의해라 수치가 실제 유저의 수치를 나타낸다고 착각하자 말아라 !! 대신 연관되어 측정할  있는 얼마나 “busy” 인가를 확인해라.   수치는 과거에 비해 서버가 얼마나  많이 이용되고 있는지 또는 얼마나  적게 이용되고 있는지만을 느끼는 정도로 이용해라.

 

만약 당신의 데이터베이스가 데드락(deadlocks) 으로 어려움이 있다면 SQL Server Locks Object: Number of Deadlocks/sec 값으로 측정할  있다하지만  수치가 상대적으로 높지 않다면 측정은  단위로 진행되고 인지할  있는 단지  개의 데드락만을 측정   있기 때문에  많은 정보를 보기를 원할 것이다.

 

하지만 여전히  것은 데드락 문제를 갖고 있는지 확인 하는  유용하다 구체적으로 확인하기 위해서는 SQL 프로필러의 데드락 추적 능력을 이용해라프로필러는  많은 상세한 정보를 제공할 것이다Deadlocks/sec counter  수치를 확인해서 일반적인  그림을 그리는데 사용하고  정보를 기초로 어떤 부분에 문제가 있는지 확인하기 위해서는 프로필러의   상세한 분석을 통해 문제점의 “drill” down   있도록 이용해라.

'IT 이야기 > DataBase' 카테고리의 다른 글

Redis Architecture (번역문)  (0) 2016.06.27
MSSQL 상위 50개의 SQL 문장 확인하기  (0) 2015.05.27
MS-SQL 성능 개선 - Index rebuild  (0) 2015.05.27
MSSQL File Size 구성  (0) 2015.05.27
MSSQL Transaction Log Full  (0) 2015.05.27

데이타 라는 것은 쌓이면 쌓일수록 고통스러워 합니다.

나를 좀 줄 맞춰 달라고...

애초 설계에서부터 잘 설계 하였다면..

시간이 지남에 따른 Maintenance 계획까지도 고려해서 개발했겠지만 그렇지 않은경우는..

주기적으로 상태를 확인하고 관리 해 줘야지만 클릭 = 응답 이라는 결과를 가져올 수 있겠지요.

 

전 지금 회사에서 DBA는 아니지만 부득이 DBA Role의 일부를 대신 해고 있는 관계로 DB쪽의 전문가는 아니지만..

개발자로서 DB에 대해 아는 부분만큼 정리합니다.

혹시 부족한 부분이 있으면 꼭 지적 해 주는 센스 ! 그렇다고 무시하진 말아주시공. ㅋ

----

1. 인덱스 단편화 확인

dbcc showconfig( 테이블명, '인덱스명') 으로

 

2. 인덱스 Re-build

  실행시키는 명령어에는 여러 가지가 있을지 모르겠지만 인덱스 Re-build 하는 방법은 2 가지가 있습니다.

그 절대 기준은 Lock 을 유발하느냐 안 하느냐

 

 2.1 Lock 유발 하는 rebuild

    - DBCC DBREINDEX( 테이블명, 채우기비율 )

    - ALTER INDEX 인덱스명 ON 테이블명 REBUILD WITH ( 각종 옵션들 )

 

 2.2 Lock 을 유발하지 않는 rebuild

    - DBCC INDEXDEFRAG( DB명, 테이블명, 인덱스명 )

 

3. 통계 업데이트

   UPDATE STATISTICS 테이블명

 

4. 성능 개선 확인

  위 작업을 하기 전에 현재 시스템의 Base line 이 어느 정도인지 정리하는 작업이 무엇보다 가장 중요하다 할 수 있겠습니다.

 우리의 현 상황을 제대로 알지 못하면 개선의 여지도 없기 때문에..

 특히나 엔지니어라면 '좀 느린데~~' 라는 추상적인 말 보다는 구체적인 수치로 정량화 할 수 있는 능력을 갖추어야 할 것 같습니다.

 어쨌든 위 1 ~ 3 번까지의 작업을 완료 후에는 Stored Procedure 의 실행 상태를 모니터링 하면서 작업 전 대비 얼마나 향상되었는지 확인 및 정리하시면 되겠습니다.

 

 

---------------------------

2005 부터는 ALTER INDEX 명령문을 사용해서도 On-line 서비스 중에 rebuild 할 수 있다고 해서 찾아보니...

약간의 제약 사항이 있네요.

Tech-net (http://technet.microsoft.com/ko-kr/library/ms188388.aspx)에서 퍼 온 내용입니다.

 

-----

ALL

인덱스 유형에 관계없이 테이블이나 뷰에 연결된 모든 인덱스를 지정합니다. ALL을 지정하면 하나 이상의 인덱스가 오프라인 또는 읽기 전용 파일 그룹에 있거나 지정한 작업이 하나 이상의 인덱스 유형에 대해 허용되지 않을 경우 해당 문이 실패합니다. 다음 표에서는 인덱스 작업과 허용되지 않는 인덱스 유형을 나열합니다.

이 작업에 ALL 지정

테이블에 다음 인덱스가 하나 이상 있으면 실패함

REBUILD WITH ONLINE = ON

XML 인덱스

공간 인덱스

큰 개체 데이터 형식 열: imagetextntextvarchar(max)nvarchar(max)varbinary(max) 및xml

REBUILD PARTITION = partition_number

분할되지 않은 인덱스, XML 인덱스, 공간 인덱스 또는 비활성 인덱스

REORGANIZE

ALLOW_PAGE_LOCKS가 OFF로 설정된 인덱스

REORGANIZE PARTITION =partition_number

분할되지 않은 인덱스, XML 인덱스, 공간 인덱스 또는 비활성 인덱스

IGNORE_DUP_KEY = ON

공간 인덱스

XML 인덱스

ONLINE = ON

공간 인덱스

XML 인덱스

 

---

'IT 이야기 > DataBase' 카테고리의 다른 글

Redis Architecture (번역문)  (0) 2016.06.27
MSSQL 상위 50개의 SQL 문장 확인하기  (0) 2015.05.27
SQL Server Performance Monitor Counter Part 1  (0) 2015.05.27
MSSQL File Size 구성  (0) 2015.05.27
MSSQL Transaction Log Full  (0) 2015.05.27

 MS-SQL 에서 제공하는 가장 좋은 기능이자 운영시 많은 문제를 갖고 있는 양날의 검인 복제(Replication) 에 대해 포스팅 합니다.

 

최근 한 DB 장비의 성능이 문제가 되서 장비를 2대로 분리 하는 작업을 하였습니다.

 

그런데 작업 후에 여러 가지 문제가 나타나는 걸 보는데요.

그 중 하나가 복제와 연관된 부분이고 참고할 사항이기에 정리해 봅니다.

 

위에서 언급한 것처럼 2대의 장비로 신규 구성하고 한 대의 복제를 받는 장비가 있었는데요.

신규 구성되는 장비에 대해서만 신경을 쓰다보니 복제 서버에는 많이 신경을 쓰지 못하였습니다.

그러다 보니 일일 통계를 구하는 Job 이 이틀 정도 실패를 했는데도 모르고 있다가 삼일째가 되어서야 현상에 대해 인지하기 시작하였습니다.

 

평상시에는 일찍 끝나는 작업인데도 불구하고 몇 시간이 지나도록 끝이 나지 않다가 결국은 Fail !

실패시 Event 에도 기록하지 않고 메일 설정도 없고.. 하.. 관리자의 부재가 여기서 나타나는 군요.

 

그래서.. 여기 저기 살펴보니..

File Size 증가가 1M(기본값) 으로 설정되어져 있고..

통계를 구하는 SP 에선 Isolate 가 uncommited 로 되어져 있었습니다.

이 복제 대상(Source)의 DB는 평균 2-300 Batch Request 씩 처리 되고 있는 Database에 대해  복제로 설정되어져 있었고..

 

이러다보니.. 복제는 받는 쪽에서는 끊임 없이 File size 가 증가가 되면서 또 통계 SP 에서는 Dirty read 를 시도하다보니..

내부적으로는 Latch 카운트가 엄청나게 증가하더니 결국은 Job이 실패하고 있었던것이죠.

이 때 성능 카운터로 살펴보니 Disk Queueing 이 100 이상을 오르락 내리락 하고 있었습니다.

 

간접적으로 SQL 에서는 latch 카운트 수치로 이상여부를 나타내었지만.. 실질적으로는 I/O lock 을 유발하는 상황이 아니었을까 유추하였습니다.

 

그래서...

 

여기서의 해결방법은 매우 간단하였습니다.

1. File Size 증가 (10% 이상 Free space 를 주었습니다.)

   alter database modify file ( name = 땡땡땡, size = 100GB )

2. 자동 증가 사이즈 변경

   alter database modify file ( name = 땡땡땡, filegrowth = 1GB )

3. 통계 sp 의 isolate 설정을 read commited 로 변경

   어차피 전일 데이타에 대해서 통계를 구하는 부분임으로..

   이 부분은 sp 개발하신 분이 미처 생각하지 못하고 어디서 퍼 온 소스 기반으로 작업하지 않았나 싶습니다.

 

이렇게 설정하고 다시 통계 잡을 구하니 10초 만에 끝나네요. OTL !

 

이번 경험으로 다시 한 번 느끼게 된 것이..

서버 프로그래밍을 할 때도 그렇고 DB 튜닝을 할 때도 마찬가지도 성능을 좌우하는데 있어서 가장 큰 영향을 미치는 부분은 ..

역시나 IO 였던것 같습니다.

 

한정된 자원의 효율적인 분배.

그런데.. 생각해 보면 이건 컴퓨터 상의 얘기만은 아니지 않나요 ?

우리 삶에서도 한정된 자원(시간, 돈, 체력 등)을 얼마나 효율적으로 나누어서 사용할 수 있느냐는 끝없이 선택해야만 하는 우리의 사명인것 같습니다. ㅎ

 

ps>> 글을 쓰고 나니.. 이건 복제에 대한 얘기가 아닌 듯 ㅋㅋ

MSSQL DB 를 자주 사용하다보면 Transaction Log가 Full 차게 되서 더 이상 데이타의 변경이 불가능한 경우가 발생합니다.

 

물론 DB 설정에 보면 Data 뿐만 아니라 Log 사이즈도 자동 증가 모델로 해 놓긴 하지만..

버그인지 아니면 기타 설정이 더 있는지 간혹 그렇지 않은 경우가 발생하네요.

이럴 때 유용하게 쓸수 있는 스크립트

 

alter database 데이타베이스명 set recovery simple

 

dbcc sqlperf( logspace )  -- 현재의 가용 공간 확인

 

backup log 데이타베이스명 with truncate_only

 

dbcc shrinkfile( 논지적db 화일명, 사이즈 ) 

 

dbcc sqlperf( logspace )  -- 변경 후 가용 공간 확인

 

alter database 데이타베이스명 set recovery full

+ Recent posts