SQL Server에서 열을 int로 업데이트 할 때 트랜잭션 로그를 채우는 방법


18

SQL Server 2005 테이블 BRITTNEY_SPEARS_MARRIAGES이 있고 다음과 같은 열이 있습니다.

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

이제 다른 테이블이 있습니다 BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

문제는 우리 업데이트 할 것입니다 MarrigeId에 열을 intA로부터 tinyint. 우리는 브리트니가 모든 것을 말하고 행하기 전에 많은 결혼 생활을 할 것이라고 생각합니다.

이제 BRITTNEY_SPEARS_MARRIAGE_STORIES테이블에 1,800 만 개의 행이 있으며 (소녀에게 문제가 있음) 업데이트를 수행 할 때 트랜잭션 로그가 가득 차고 SQL Server 상자가 죽습니다.

이 문제를 어떻게 해결할 수 있습니까?

"이 SQL Server를 업데이트하겠습니다.이 열을 업데이트하겠습니다.이 SQL Server를 신뢰하십시오. 모든 것을 확인하는 동안 트랜잭션 로그를 채우지 마십시오."

답변:


7

트랜잭션 로그를 사용하지 않도록 SQL Server에 지시 할 방법이 없습니다.

당신이 일은 공간이 필요할 때 오래된 로그 항목을 덮어 쓰게됩니다 SIMPLE에 데이터베이스의 복구 모델을 설정합니다. 그러나 특정 시점 복원과 같은 특정 유형의 복원을 수행 할 수 없으므로 프로덕션 서버에서는이 작업을 수행하지 않아야합니다.

또는 트랜잭션 로그 파일을 더 크게 설정할 수 있습니다-비과학적인 규칙으로 A) 트랜잭션 로그에 테이블 크기보다 최소 1.5 배 더 많은 여유 공간이 있는지 또는 B) 트랜잭션 로그는 최소한 이 정도의 디스크 여유 공간이 있는 드라이브로 자동 증가 할 수 있습니다.

로그를 백업하여 트랜잭션 로그 공간을 비울 수 있습니다. 로그 내용에 신경 쓰지 않으면 파일을 버립니다. 이에 대한 지름길은 BACKUP LOG <Your Database Name> TO DISK = 'NUL:'입니다. 함축 된 의미를 완전히 확신하지 않는 한 프로덕션 서버에서는이 작업을 다시 수행하지 마십시오 .

주의해야 할 또 다른 사항은 (질문과 완전히 관련이 없지만) 확장하는 테이블에 클러스터형 인덱스가 정의되어 있는지 확인하는 것입니다. 그렇지 않은 경우 테이블에서 매우 많은 양의 힙 조각화가 발생할 수 있으며 이와 같이 변경하면 불필요하게 커질 수 있습니다.


5
  • 외래 키를 삭제
  • int대신에 새 테이블 만들기tinyint
  • 일괄 처리 당 1000 행을 이동하십시오 (새 테이블에 삽입하고 이전 행에서 삭제)
  • 이전 테이블을 삭제
  • 다음을 사용하여 새 테이블의 이름을 이전 이름으로 바꿉니다. sp_rename
  • 외래 키를 다시 만듭니다

pS 트랜잭션 로그가 큰 경우 ... 복구 모델을 확인하십시오. 복구 모델이 아닌 simple경우 로그를 마지막으로 백업 한 후 얼마나 걸립니까?


로그를 백업 한 이후에 데이터베이스를 백업해도 로그가 작아지지는 않습니다.
HLGEM

@ HLGEM : 당신은 맞습니다, 나는 그 주제에 관한 Paul Randal의 기사를 읽었습니다. 그러나 전체 백업 만 수행하면 로그가 계속 커질 수 있습니다.
Andomar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.