데이터베이스의 트랜잭션 로그가 가득 찼습니다.


108

전체 기간 동안 트랜잭션을 보류하는 장기 실행 프로세스가 있습니다.

나는 이것이 실행되는 방식을 통제 할 수 없습니다.

트랜잭션은 전체 기간 동안 열려 있기 때문에 트랜잭션 로그가 가득 차면 SQL Server에서 로그 파일의 크기를 늘릴 수 없습니다.

따라서 프로세스가 오류와 함께 실패합니다 "The transaction log for database 'xxx' is full".

데이터베이스 속성에서 트랜잭션 로그 파일의 크기를 늘려이를 방지하려고 시도했지만 동일한 오류가 발생합니다.

다음에 무엇을 시도해야할지 모르겠습니다. 프로세스는 몇 시간 동안 실행되므로 시행 착오를하기가 쉽지 않습니다.

어떤 아이디어?

관심있는 사람이 있다면 프로세스는 Microsoft Dynamics CRM 4.0.

충분한 디스크 공간이 있으며 로그가 단순 로깅 모드로되어 있으며 프로세스를 시작하기 전에 로그를 백업했습니다.

-=-=-=-=-업데이트-=-=-=-=-

지금까지 의견을 보내 주셔서 감사합니다. 다음은 열린 트랜잭션으로 인해 로그가 커지지 않을 것이라고 믿게 만든 이유입니다.

다음과 같은 오류가 발생합니다.

Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

그래서 그 조언에 따라 " log_reuse_wait_desc column in sys.databases"로 갔고 " "의 가치를 유지했습니다 ACTIVE_TRANSACTION.

Microsoft에 따르면 : http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx

이는 다음을 의미합니다.

트랜잭션이 활성 상태입니다 (모든 복구 모델). • 로그 백업을 시작할 때 장기 실행 트랜잭션이있을 수 있습니다. 이 경우 공간을 확보하려면 다른 로그 백업이 필요할 수 있습니다. 자세한 내용은이 항목 뒷부분의 "장기 실행 활성 트랜잭션"을 참조하십시오.

• 트랜잭션이 지연됩니다 (SQL Server 2005 Enterprise Edition 이상 버전 만 해당). 지연된 트랜잭션은 사용할 수없는 리소스로 인해 롤백이 차단 된 활성 트랜잭션입니다. 지연된 트랜잭션의 원인과이를 지연된 상태에서 제거하는 방법에 대한 자세한 내용은 지연된 트랜잭션을 참조하십시오.

내가 뭔가를 오해 했나요?

-=-=-=-업데이트 2-=-=-=-

초기 로그 파일 크기를 30GB로 설정하여 프로세스를 시작했습니다. 완료하는 데 몇 시간이 걸립니다.

-=-=-=-최종 업데이트-=-=-=-

이 문제는 실제로 사용 가능한 모든 디스크 공간을 사용하는 로그 파일로 인해 발생했습니다. 마지막 시도에서 120GB를 확보했지만 여전히 모든 것을 사용했고 결국 실패했습니다.

프로세스가 하룻밤 사이에 실행될 때 실패시 롤백 되었기 때문에 이전에 이런 일이 발생한다는 것을 몰랐습니다. 이번에는 롤백 전에 로그 파일 크기를 확인할 수있었습니다.

귀하의 의견에 감사드립니다.


re "... and have backed the log".... 데이터베이스가 단순 모드 인 경우 로그를 백업 할 수 없으며 로그 백업은 단순 모드에 적용되지 않습니다. 대량 로그됩니까?
SqlACID

1
전체 DB를 백업하고 축소하여 로그가 1MB로 줄어 들었습니다. 그런 다음 로그 파일의 크기를 처음에는 20GB로, 이제는 30GB로 늘 렸습니다.
짐보

답변:


19

일회성 스크립트입니까, 아니면 정기적으로 발생하는 작업입니까?

과거에는 일시적으로 로그 파일에 많은 공간이 필요한 특수 프로젝트의 경우 두 번째 로그 파일을 만들어서 크게 만들었습니다. 프로젝트가 완료되면 추가 로그 파일을 제거했습니다.


일회성 직업이라고 말하지는 않겠지 만 우리가해야하는 일은 드뭅니다. 두 번째 로그 파일을 만들지 않았지만 현재 로그 파일의 초기 크기를 30GB로 늘 렸습니다. 마지막 실행 중에 20GB로 설정되었지만 여전히 실패했습니다.
Jimbo

작업 할 드라이브가 하나뿐이라는 점을 감안할 때 두 번째 로그 파일이 큰 파일 하나를 갖는 것보다 낫습니까?
짐보

지금 기억 하겠지만, 추가 파일은 대부분 다른 더 큰 드라이브에 액세스 할 수있게 해주었습니다.
Mike Henderson

2
가져 오는 데이터의 크기는 얼마입니까? 30GB의 데이터를 가져 오는 경우 로그 파일이 최소한 그 이상이어야 할 수 있습니다.
Mike Henderson

3
로그 크기가 핵심입니다. 현재 작업이 다시 실패했고 실패한 지점에서 로그 파일의 크기를 보았을 때 내 눈을 믿을 수 없었습니다. 계정의 절반 만 처리했으며 이미 53GB였습니다. 이 프로세스를 완료하려면 다른 60-70GB 부근의 어딘가를 정리해야 할 것 같습니다.
Jimbo

95

이 문제를 해결하려면 복구 모델단순으로 변경 한 다음 파일 로그 축소

1. 데이터베이스 속성> 옵션> 복구 모델> 단순

2. 데이터베이스 작업> 축소> 파일> 로그

끝난.

그런 다음 데이터베이스 속성> 파일> 데이터베이스 파일> 경로 에서 db 로그 파일 크기를 확인합니다.

전체 SQL 서버 로그를 확인하려면 SSMS> 데이터베이스> 관리> SQL Server 로그> 현재에서 로그 파일 뷰어를 엽니 다.


10
아니요, 문제가 해결되지는 않습니다. 문제는 로그 파일이 디스크 공간이 부족할 때까지 장기 실행 프로세스 중에 커졌다는 것입니다. 로그 파일을 1TB의 여유 공간이있는 다른 드라이브로 일시적으로 이동하여 수정되었습니다. 장기 실행 프로세스 (트랜잭션 열기 보류)가 진행중인 동안에는 로그 파일을 축소 할 수 없습니다. 이 프로세스는 전적으로 파일 증가의 원인이었습니다.
Jimbo 2014 년

@Jimbo가 이미 말했듯이 이것은 OP의 문제를 해결하지 않습니다. 현재 사용하지 않는 공간을 확보 할 수 있지만 긴 트랜잭션이 다시 실행되는 즉시 공간이 다시 차지됩니다 (아마도 더 일찍 실패 할 수 있음)
Marcel

완전한! 감사!
Yuri Monteiro

문제가 해결되지 않았습니다. 내 로그에는 500 바이트 만 있습니다. 이 문제는 어제 백업을 한 후에 시작된 것 같습니다.
Ricardo França

전체 드라이브에 여유 공간이 몇 메가 남았다면 이것은 확실히 수정입니다.
Steve Bauman

36

이 오류가 한 번 발생했는데 디스크 공간이 부족한 서버의 하드 드라이브가되었습니다.


1
OP의 업데이트를 읽으십시오. 이것이 문제로 밝혀졌습니다.
Colm

18

당신은 마십시오 자동 증가 활성화무제한 파일 성장을 로그 파일에 대해 모두 사용 가능? "데이터베이스 속성> 파일"에서 SSMS를 통해 편집 할 수 있습니다.


예. 제한없이 10 % 자동 증가하도록 설정되어 있습니다. 문제는 열린 트랜잭션이있는 동안에는 자동 증가가 작동하지 않는다는 것입니다.
짐보

1
거래 규모가 얼마나 될지 아십니까? 트랜잭션 로그 크기를 그 추정치보다 크게 설정하십시오. 어쨌든 디스크 할당이 문제가되지 않는다면 데이터와 로그를 위해 처음에 충분한 공간을 할당하십시오. 성능이 향상됩니다. 10 % 자동 증가 하지 말고 몇 GB 만 ​​늘리면 성능이 충분할 것입니다.
Luis LL

3
SQL Server 트랜잭션을 완료하는 데 더 많은 공간이 필요한 경우 트랜잭션 중에 로그 자동으로 증가시킵니다.
Ross McNab 2013

안녕하세요 로스, 저는 공개 트랜잭션이 질문에 대한 업데이트의 성장을 방해한다고 생각하는 논리를 제공했습니다. 내 추론이 틀렸습니까?
Jimbo

1
@Jimbo SQL Server는 예약 할 필요가 없습니다. 자동 증가가있는 경우 SQL Server는 트랜잭션 중에 자동 증가를 수행합니다. 충분히 크면 많은 시간을 절약 할 수 있지만 프로세스에 영향을주지 않아야합니다.
Luis LL

10

이것은 구식 접근 방식이지만 SQL에서 반복 업데이트 또는 삽입 작업을 수행하는 경우 (오래 실행되는 작업) 주기적으로 (프로그래밍 방식으로) "체크 포인트"를 호출하는 것이 좋습니다. "체크 포인트"를 호출하면 SQL이 모든 메모리 전용 변경 (더티 페이지, 호출 됨) 및 트랜잭션 로그에 저장된 항목을 디스크에 기록합니다. 이렇게하면 트랜잭션 로그를 주기적으로 정리하여 설명한 것과 같은 문제를 방지 할 수 있습니다.


1
불행히도 나는 프로세스가 수행되는 방식을 제어 할 수 없습니다. Dynamics CRM은 Microsoft 응용 프로그램이며 조직 가져 오기 프로세스는 해당 응용 프로그램의 일부입니다.
Jimbo 2013

1

다음은 로그를 자릅니다.

USE [yourdbname] 
GO

-- TRUNCATE TRANSACTION LOG --
DBCC SHRINKFILE(yourdbname_log, 1)
BACKUP LOG yourdbname WITH TRUNCATE_ONLY
DBCC SHRINKFILE(yourdbname_log, 1)
GO

-- CHECK DATABASE HEALTH --
ALTER FUNCTION [dbo].[checker]() RETURNS int AS BEGIN  RETURN 0 END
GO

4
Pinal,이 기능은 SQL Server 2008 이상에서 완전히 제거되었습니다 : brentozar.com/archive/2009/08/…
Conor

3
이후 버전에서는 BACKUP LOG <myDB> TO DISK = N'NUL : '을 시도하십시오.
HansLindgren

1

데이터베이스 복구 모델이 가득 차고 로그 백업 유지 관리 계획이없는 경우 트랜잭션 로그가 .NET으로 인해 가득 차기 때문에이 오류가 발생합니다 LOG_BACKUP.

이렇게하면이 데이터베이스에 대한 작업 (예 : 축소)이 방지되고 SQL Server 데이터베이스 엔진에서 9002 오류가 발생합니다.

이 동작을 극복하려면 문제를 해결하기위한 자세한 단계를 보여주는 LOG_BACKUP으로 인해 데이터베이스 'SharePoint_Config'의 트랜잭션 로그가 가득 찼습니다 .


0

"디스크 공간을 확보하기 위해 데이터베이스 테이블에서 이전 행을 삭제하는 동안 'ACTIVE_TRANSACTION'으로 인해 '...'데이터베이스의 트랜잭션 로그가 가득 찼습니다.이 오류는 다음과 같은 경우에 발생한다는 것을 깨달았습니다. 제 경우에는 be deleted가 1000000보다 컸기 때문에 1 개의 DELETE 문을 사용하는 대신 DELETE TOP (1000000) .... 문을 사용하여 삭제 작업을 나누었습니다.

예를 들면 :

이 문을 사용하는 대신 :

DELETE FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

다음 문을 반복적으로 사용 :

DELETE TOP(1000000) FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

0

내 문제는 다음과 같은 제한된 삭제여러 번 실행하여 해결되었습니다.

전에

DELETE FROM TableName WHERE Condition

DELETE TOP(1000) FROM TableName WHERECondition

-1

질문에 대한 대답은 테이블에서 행을 삭제하는 것이 아니라 활성 트랜잭션으로 인해 차지하는 tempDB 공간입니다. 이것은 업데이트를 삽입하고 트랜잭션을 삭제하려는 병합 (upsert)이 실행될 때 주로 발생합니다. 유일한 옵션은 DB가 단순 복구 모델로 설정되어 있는지 확인하고 파일을 최대 공간으로 늘리는 것입니다 (다른 파일 그룹 추가). 여기에는 고유 한 장점과 단점이 있지만 이것이 유일한 옵션입니다.

다른 옵션은 merge (upsert)를 두 개의 작업으로 분할하는 것입니다. 하나는 삽입을 수행하고 다른 하나는 업데이트 및 삭제를 수행합니다.


질문을 읽으면 DB가 이미 단순 복구 모드에 있다는 것을 알 수 있습니다. 장기 실행 트랜잭션이 하나있을 때는 도움이되지 않습니다. 파일은 트랜잭션이 커밋되거나 롤백 될 때까지 계속 증가합니다. "거래를 전체 기간 동안 보류하는 장기 실행 프로세스가 있습니다."라는 질문의 첫 번째 줄을 읽습니다.
짐보

-1

이 시도:

USE YourDB;  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE YourDB
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 50 MB.  
DBCC SHRINKFILE (YourDB_log, 50);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE YourDB
SET RECOVERY FULL;  
GO 

도움이되기를 바랍니다.


이것은 시도 된 첫 번째 작업 중 하나였으며 질문 텍스트에도 언급되어 있습니다. 이것은 단일 열린 트랜잭션이 로그를 채우고 사용 가능한 모든 디스크 공간을 사용하는 문제를 해결하지 못합니다. 이 전체 프로세스는 단순 모드에서 수행되었습니다. 그러나 당신은 질문을 읽지 않은
Jimbo

-1

여기 내 영웅 코드가 있습니다. 나는이 문제에 직면했다. 이 코드를 사용하여이 문제를 해결하십시오.

 USE master;

    SELECT 
        name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
    FROM 
        sys.databases 
    WHERE 
        name = 'XX_System';

    SELECT DATABASEPROPERTYEX('XX_System', 'IsPublished');


    USE XX_System;
    EXEC sp_repldone null, null, 0,0,1;
    EXEC sp_removedbreplication XX_System;


    DBCC OPENTRAN;
    DBCC SQLPERF(LOGSPACE);
    EXEC sp_replcounters;



    DBCC SQLPERF(LOGSPACE);

코드를 붙여 넣는 대신 항상 컨텍스트에 답하십시오. 자세한 내용은 여기 를 참조하십시오.
gehbiszumeis

-1

이 시도:

가능한 경우 MSSQLSERVERSQLSERVERAGENT 서비스를 다시 시작하십시오 .

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