미러 데이터베이스에서 트랜잭션 로그 파일을 축소 할 수 있습니까?


9

이것은 주 데이터베이스에서 로그 파일을 축소 할 수없는 이유에 대한 이전 질문 에 대한 후속 질문 입니다.

간단히 말해서 데이터베이스 미러링을 설정했지만 트랜잭션 로그를 백업 한 작업이 다시 실행되고 트랜잭션 로그가 거의 60GB로 증가했는지 확인하는 것을 잊었습니다.

미러링이 설정되었으므로이 크기 증가는 미러링 된 서버에서 복제되어 결국 모든 디스크 공간을 차지하여 미러 데이터베이스를 사용할 수 없게 만들었습니다.

이 질문에 미러 데이터베이스의 트랜잭션 로그 유지 관리에 대한, 당신은 거울에 로그를 백업 할 수 있지만 경우가에서 특별히 요청 의견 미러 데이터베이스에서 자란 로그 파일을 축소하는 방법에 대한하는 코멘트는 것을 방치

이를 수행하는 한 가지 방법은 미러 된 데이터베이스로 장애 조치하고 축소를 수행하는 것입니다. 프로덕션 환경이 아닌 환경에서이 기능을 철저히 테스트하여 원하는 동작이 예상되는지 확인하십시오.

이는 미러에서 로그 파일을 축소하는 다른 방법이있을 수 있으며이 방법이 프로덕션 서버에서 수행하기에 반드시 안전한 것은 아닙니다.

데이터베이스 미러에서 트랜잭션 로그 파일을 안전하게 축소 할 수있는 방법이 있습니까?


2
유일하게 지원되는 방법은 주 서버에서 파일을 축소하여 미러에서 파일을 축소하는 것입니다. 미러가 더 이상 주체와 동일하지 않은 경우 실제로 미러로 장애 조치를 시도하지 않습니다. 이전 질문에서 언급했듯이 미러링을 중단하고 다시 만드십시오.
Max Vernon

답변:


6

DBCC SHRINKFILE명령은 미러 데이터베이스에 주 서버에서 미러링됩니다. 몇 가지 증거가 있습니다.

프린시 펄에서 샘플 데이터베이스를 작성하십시오.

create database MirroredDb;
go

다음을 사용하여 백업에서 동일한 데이터베이스를 작성하십시오 NORECOVERY.

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

그러나 원하는 방식으로 미러링 세션을 설정하십시오.

주 데이터베이스의 데이터베이스 파일 크기에서보기 :

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

내 결과 집합은 다음과 같습니다.

name            size
MirroredDb      392
MirroredDb_log  104

미러 데이터베이스 스냅 샷을 생성하고 동일한 정보를 보면 :

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

내 결과 집합은 다음과 같습니다.

name            size
MirroredDb      392
MirroredDb_log  104

이제 주 데이터베이스 에서 트랜잭션 로그 파일을 늘리십시오 (1GB로 가져옴).

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

상기 찾고 주 데이터베이스의 트랜잭션 로그 크기, 우리는 지금 조정 크기를 참조하십시오

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

내 결과 집합은 다음과 같습니다.

name            size
MirroredDb      392
MirroredDb_log  131072

미러 된 데이터베이스 에 다른 스냅 샷을 작성 하고 트랜잭션 로그 파일 크기를 확인하십시오.

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

내 결과 집합은 다음과 같습니다.

name            size
MirroredDb      392
MirroredDb_log  131072

지금은 이렇게 DBCC SHRINKFILE교장 :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

내 결과 집합은 다음과 같습니다.

name            size
MirroredDb      392
MirroredDb_log  104

미러 된 데이터베이스 에서 세 번째 및 최종 스냅 샷을 작성 하고 크기를보십시오.

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

그리고 다음과 같은 결과 집합이 나타납니다.

name            size
MirroredDb      392
MirroredDb_log  104

여기에서 볼 수 있듯이 DBCC SHRINKFILE명령은 실제로 미러 데이터베이스에 미러링됩니다.


로그 파일의 크기가 주 서버에서도 복사되었다는 사실을 몰랐습니다. 그러나 트랜잭션 로그 크기로 인해 미러가 작동하지 않는 경우 미러를 삭제하고 다시 만드는 유일한 솔루션입니까? 미러링 프로세스가 작동하지 않을 때 미러 로그를 안전하게 축소 할 수있는 방법이 없습니까?
Rachel

미러 된 데이터베이스에 연결할 수 없으므로 실행할 수 없습니다 DBCC SHRINKFILE. 해당 데이터베이스에서 미러링을 제거하지 않고 미러 세션을 수정할 수 있다면 거기에서 수행해야 할 조사가 조금 더 있습니다. 파일 크기 때문에 일시 중지 된 것 같습니다. 파트너를 재개하려고 했습니까?
Thomas Stringer

예,하지만 즉시 일시 중지되었습니다. 미러링이 중지 된 후 너무 많은 시간이 지났기 때문에 "축소 로그 파일"부분에 도달하기 전에 많은 데이터를 계속 전송해야한다고 가정합니다. 파일을 축소하기 위해 미러 데이터베이스에서 실행할 수 있거나 파일 시스템 조작과 같은 방금 알지 못하는 다른 방법이 있기를 바랐지만 실제로는 그렇지 않습니다. 귀하의 답변은 여전히 ​​매우 도움이되므로 감사합니다 :)
Rachel

더 이상 희망하지 마십시오. 데이터베이스가 일시 중지 / 연결 해제되고 기본에서 로그 백업이 실행되면 다시 초기화하지 않고 미러를 다시 동기화하는 데 많은 시간을 할애해야합니다.
Jason Cumberland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.