축소 SQL Server 2008 R2 후 로그 파일 크기 수동 설정


10

실무에서 다소 비자발적 인 DBA가되고 있으며 실제로 무언가에 대한 도움이 필요하다.

전체 복구 모드에 40GB 데이터베이스가 있고 로그 백업이 구성되지 않았으며 84GB의 큰 로그 파일이 있습니다. 지금까지이 상황을 해결하려는 계획은 데이터베이스에서 전체 로그 백업을 실행하고 로그 파일을 축소하며 매일 밤 데이터베이스 백업으로 로그 백업을 실행하여 유지 관리 계획을 유지하는 데 도움이되는 유지 관리 계획을 수립하는 것입니다.

내 문제는 로그 파일이 아무것도 줄어들지 않고 월요일의 첫 번째 아침이 지속적으로 커지는 것을 원하지 않습니다. 파일의 크기 (데이터베이스의 약 20 %)에 대한 대략적인 추정이 있으며 가능한 한 인접한 공간을 확보하기 위해 get-go에서 이것을 설정하고 싶습니다. 데이터베이스 속성-> 파일에서 "초기 크기"를 변경 한 경우입니까? 이 문제가 발생하려면 데이터베이스가 오프라인 상태 여야한다고 생각합니까?

미리 감사드립니다


2
하루에 한 번 데이터베이스를 백업하고 밤에 한 번 로그 백업을 실행 하시겠습니까? 로그가 자체적으로 관리되도록 간단한 복구 모델을 고려해야 할 수도 있습니다.
Aaron Bertrand

Aaron, DR 복구 관점에 동의하지만 운영 복구를 위해 여전히 전체 복구를 원할 수도 있습니다. 하루에 한 번만 로그 백업을 수행하더라도 특정 시점 복구가 가능하다는 것을 잊지 마십시오.
케네스 피셔

1
@ 케네스 그래서 자정에 전체 백업을하고 12:05에 로그 백업을하면 매우 의심 스럽습니다. YMMV.
Aaron Bertrand

@Aaron, 다시 한 번 모든 작동하지만 내가 실수하지 않으면 전날 밤의 전체 백업을 사용할 수 있으며 12:05에 로그를 가져 와서 전날의 시점으로 복구 할 수 있습니다. 또한 그들이 문제에 부딪쳤다면, 로그 백하고, 전날 밤에서 복원하고, 몇 분 전으로 돌아 가기 위해 특정 시점을 수행하는 것이 별다른 문제가되지 않습니다. 나는 그들이 DR 관점보다 더 관련이 있다고 말하는 것만으로 그것을 충만하게 유지해야한다고 말하는 것이 아닙니다. 그들이 전체를 유지하는 경우 하루에 한 번 이상 로그 백업을 수행해야한다고합니다.
케네스 피셔

2
@ 케네스 (Kenneth) 그러나 하루에 한 번만 로그를 백업하는 경우 처음부터 큰 이유입니다! 어제 오전 12:07로 복구해야하는 경우 하루 동안 전체 로그를로드하여 2 분을 복구해야합니다. 별로 유용하지 않습니다.
Aaron Bertrand

답변:


6

당신이 생각하는 최적의 크기로 축소하십시오. UI를 사용하지 말고 이렇게하십시오. 200MB가 최적의 크기라고 가정 해 보겠습니다.

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

하루에 한 번만 로그 백업을 수행하고 특정 시점 복구에 관심이없는 경우 단순 복구 모델로 전환해야합니다. 이는 로그 백업이 불필요하다는 것을 의미하지만 (실제로는 불가능) 로그의 내용은 자체 관리됩니다.

로그 백업을 의미있게하려면 야간에 전체 백업을 수행 한 후 바로 다음에 단일 로그 백업을 계획하지 마십시오. 이를 통해 전체 복구 모델을 유지하고 로그 작업을 정말 어렵게 만들며 아무것도 사지 않습니다. 따라서 특정 시점 복구를 원할 경우 데이터 손실 허용 범위를 만족하는 속도로 로그 백업을 더 자주 실행하십시오. 15 분 이상 데이터를 잃지 않으려면 15 분마다 로그 백업을 실행하십시오.


고마워 간단한 복구 모델로 전환하는 것에 대한 모든 의견을 완전히 이해합니다. 불행히도 이것은 내가 결정할 수없고 여러 수준의 관료주의를 거치게 될 결정이다. 그래도 내가 제안 할 것입니다.
Tim Alexander

12

파일 관리는 완전히 온라인 작업이 될 수 있습니다. 복구 목적으로 로그 정보를 보존해야 할 필요성에 따라 두 가지 경로가 있습니다.

특정 시점 복구가 필요하지 않습니다

  1. 데이터베이스를 SIMPLE복구로 변환하십시오 . 디스크에 트랜잭션을 쓰려면 검사 점을 실행하십시오.
  2. 로그를 평평하게하십시오.
  3. 로그를 적절한 크기로 조정하십시오.

또한 고정 증가량과 무제한 증가를 설정하는 것이 좋습니다 (로그를 더 잘 관리 할 수 ​​있도록). 고정 증가량은 그 양에 따라 크게 다르므로 로그에서 볼 수있는 증가량에 따라 처음에는 1-2GB를 사용하는 것이 좋습니다. 이상적으로는 로그가 많이 자라지 않으므로 큰 영향을 미치지 않습니다. 로그가 정기적으로 커지면 크기를 다시 방문해야 할 수도 있습니다.

다음을 사용하여 달성 :

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

특정 시점 복구 필요

가장 큰 문제는 현재 활성화 된 VLF 세그먼트를 지나서 로그 파일을 축소 할 수 없다는 것입니다. 이를 확인하기 DBCC LOGINFO위해 데이터베이스 컨텍스트에서 사용할 수 있습니다 . Status = 2 인 세그먼트가 활성화되었습니다. 활성 세그먼트를 지우려면 해당 세그먼트에서 현재 활성화 된 트랜잭션이 없을 때 트랜잭션 로그 백업을 실행해야합니다. 당신의 단계는 다음과 같습니다

  1. 트랜잭션 로그 백업을 실행하십시오.
  2. 파일을 축소하십시오. (이상적으로 평평하지만 데이터베이스가 활성화되어 있으면 수행하기가 어렵습니다).
  3. 로그가 적절한 크기, 가능한 한 작은 크기가 될 때까지 1 단계와 2 단계를 반복하십시오.
  4. 로그를 적절한 크기로 조정하십시오.

다음을 사용하여 달성 :

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

여기에서 무슨 일이 일어나고 있는지 이해하기위한 추가 자료 :


2

실제로 아니요, 로그를 줄이기 위해 데이터베이스가 오프라인 일 필요는 없습니다. 그리고 이것은 아마도 로그 축소가 좋은 생각 인 몇 안되는 경우 중 하나라고 말할 것입니다. 초기 크기를 설정할 수 있지만 축소를 수행하고 특정 크기로 축소하도록 지시하는 것이 더 쉽습니다.

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

GUI를 사용하고 두 번째 단일 선택 단추와 로그의 끝 크기를 나타내는 확인란을 사용하여이를 수행 할 수도 있습니다. SSMS의 개체 탐색기에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 작업, 축소, 파일을 선택하여 GUI로 이동할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.