복붙노트

[SQL] 데이터베이스의 트랜잭션 로그가 가득

SQL

데이터베이스의 트랜잭션 로그가 가득

나는 전체 기간 동안 거래를 열고 보유하고 긴 실행중인 프로세스를 가지고있다.

나는이 실행되는 방식으로 제어 할 수 없습니다.

트랜잭션은 트랜잭션 로그 채우기, SQL 서버 로그 파일의 크기를 늘릴 수 없습니다 전체 기간에 대해 열린 상태이기 때문이다.

프로세스가 오류와 함께 실패 그래서 "트랜잭션 로그는 데이터베이스 'XXX'를위한 가득 차있다."

나는 데이터베이스 속성에서 트랜잭션 로그 파일의 크기를 증가하여이를 방지하기 위해 시도,하지만 난 같은 오류가 발생합니다.

확실하지 내가 다음에 시도해야하는지. 이 시행 착오를 재생하는 것은 쉽지 않다, 그래서이 프로세스는 몇 시간 동안 실행됩니다.

어떤 아이디어?

사람이 관심이 있다면, 과정의 Microsoft Dynamics CRM 4.0 조직 가져 오기입니다.

디스크 공간의 많음이있다, 우리는 간단한 로깅 모드에서 로그를 가지고 과정을 발로 전에 로그를 백업 한.

- = - = - = - = - UPDATE - = - = - = - = -

감사 의견에 대한 모든 지금까지. 다음은 로그가 열려있는 트랜잭션으로 인해 성장하지 않을 것이라고 믿고 나를 이끄는 것입니다 :

나는 다음과 같은 오류를 얻고있다 ...

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

그 조언을 다음 그래서 내가 "하려면 sys.databases의 log_reuse_wait_desc 열"에 가서는 값 "ACTIVE_TRANSACTION"를 개최했다.

마이크로 소프트에 따르면 : http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx

그 말 다음 :

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

• 트랜잭션은 (SQL 서버 2005 엔터프라이즈 에디션 이상 버전 만 해당) 지연됩니다. 지연된 트랜잭션은 효과적으로 그 롤백으로 인해 일부 사용할 수없는 자원의 차단 액티브 한 트랜잭션 (transaction)이다. 이연 거래 방법의 원인에 대한 자세한 내용은 이연 거래를 참조 지연된 상태의 그들을 밖으로 이동합니다.

내가 뭔가를 오해 적이 있습니까?

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

그냥 30기가바이트 초기 로그 파일 크기 설정과 과정을 시작했다. 이 완료하는 데 시간 정도 소요됩니다.

- = - = - = - 최종 UPDATE - = - = - = -

이 문제는 실제로 사용 가능한 디스크 공간을 모두 소모 로그 파일에 의해 발생했다. 마지막 시도에서 나는 120기가바이트을 해제하고 그것은 여전히 ​​그것을 사용하고 궁극적으로 실패했습니다.

나는이 과정이 하룻밤 실행되었을 때, 그것은 실패에 다시 롤링 때문에 이전에 발생 몰랐어요. 이번에는 롤백하기 전에 로그 파일 크기를 확인 할 수 있었다.

감사합니다 귀하의 의견에 대한 모든.

해결법

  1. ==============================

    1.이것은 한 번 스크립트, 또는 정기적으로 일을 발생?

    이것은 한 번 스크립트, 또는 정기적으로 일을 발생?

    과거에는 일시적으로 로그 파일을위한 공간을 많이 필요로 특별 프로젝트, 나는 두 번째 로그 파일을 생성하고 거대했다. 프로젝트가 완료되면 우리는 여분의 로그 파일을 제거했습니다.

  2. ==============================

    2.이 문제를 해결하려면 다음 축소 간단한 파일 로그에 복구 모델을 변경

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

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

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

    끝난.

    그런 다음에 당신의 DB 로그 파일 크기를 확인 데이터베이스 속성> 파일> 데이터베이스 파일> 경로

    전체 SQL 서버 로그를 확인하려면 : 열려있는 로그 파일 뷰어에서 SSMS> 데이터베이스> 관리> SQL 서버 로그> 현재

  3. ==============================

    3.나는 한 번이 오류를 가지고 있으며 디스크 공간이 부족 서버의 하드 드라이브 었죠.

    나는 한 번이 오류를 가지고 있으며 디스크 공간이 부족 서버의 하드 드라이브 었죠.

  4. ==============================

    4.로그 파일을 모두 사용할 수는 자동 증가와 무제한 파일 성장을 활성화해야합니까? 당신은 "데이터베이스 속성> 파일"에서 SSMS를 통해 다음을 편집 할 수 있습니다

    로그 파일을 모두 사용할 수는 자동 증가와 무제한 파일 성장을 활성화해야합니까? 당신은 "데이터베이스 속성> 파일"에서 SSMS를 통해 다음을 편집 할 수 있습니다

  5. ==============================

    5.이것은 옛날 방식이지만, 당신이 반복 갱신 또는 삽입 작업 SQL에서 뭔가를 수행하는 경우 오랜 시간 동안 실행, 그것은 주기적으로 (프로그래밍) 호출 "체크 포인트"에 대한 좋은 아이디어 있다고. 호출 "체크 포인트는"모든 트랜잭션 로그에 저장된 메모리 전용 변경 (더티 페이지는, 그들이라는 것) 및 항목의 디스크에 쓰기에 SQL됩니다. 이 때문에, 주기적으로 트랜잭션 로그를 청소 설명한 것과 같은 문제를 방지하는 효과가있다.

    이것은 옛날 방식이지만, 당신이 반복 갱신 또는 삽입 작업 SQL에서 뭔가를 수행하는 경우 오랜 시간 동안 실행, 그것은 주기적으로 (프로그래밍) 호출 "체크 포인트"에 대한 좋은 아이디어 있다고. 호출 "체크 포인트는"모든 트랜잭션 로그에 저장된 메모리 전용 변경 (더티 페이지는, 그들이라는 것) 및 항목의 디스크에 쓰기에 SQL됩니다. 이 때문에, 주기적으로 트랜잭션 로그를 청소 설명한 것과 같은 문제를 방지하는 효과가있다.

  6. ==============================

    6.다음은 로그를 자릅니다.

    다음은 로그를 자릅니다.

    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
    
  7. ==============================

    7.데이터베이스 복구 모델이 가득하고 로그 백업 유지 관리 계획을 가지고 있지 않은 경우 트랜잭션 로그가 LOG_BACKUP로 인해 전체되기 때문에,이 오류가 발생합니다.

    데이터베이스 복구 모델이 가득하고 로그 백업 유지 관리 계획을 가지고 있지 않은 경우 트랜잭션 로그가 LOG_BACKUP로 인해 전체되기 때문에,이 오류가 발생합니다.

    이이 데이터베이스 (예를 들어, 축소)에 대한 조치를 방지 할 수 및 SQL Server 데이터베이스 엔진은 9002 오류가 발생합니다.

    난 당신이 데이터베이스 'SharePoint_Config'이 트랜잭션 로그를 확인하는 조언이 문제를 극복하기 위해 프로그램 문제를 해결하는 단계를 설명하는 것이 LOG_BACKUP로 인해 가득 차있다.

  8. ==============================

    8.내가 오류 충족 :. '...' "데이터베이스의 트랜잭션 로그를 디스크 공간을 확보하기위한 내 데이터베이스의 테이블에서 오래된 행을 삭제하는 동안 'ACTIVE_TRANSACTION'로 인해 가득 나는이 오류가 발생할 것이라는 점을 깨달았다 경우 행의 수 삭제 내 경우에는보다 큰 1,000,000이었다. 그래서 그 대신 1 DELETE 문을 사용하는, 내가 .... 문을 DELETE TOP (1000000)를 사용하여 삭제 작업을 나누었다.

    내가 오류 충족 :. '...' "데이터베이스의 트랜잭션 로그를 디스크 공간을 확보하기위한 내 데이터베이스의 테이블에서 오래된 행을 삭제하는 동안 'ACTIVE_TRANSACTION'로 인해 가득 나는이 오류가 발생할 것이라는 점을 깨달았다 경우 행의 수 삭제 내 경우에는보다 큰 1,000,000이었다. 그래서 그 대신 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())
    
  9. ==============================

    9.여러 해결할 내 문제는 같은 제한 삭제의 실행

    여러 해결할 내 문제는 같은 제한 삭제의 실행

    전에

    DELETE FROM TableName WHERE Condition
    

    DELETE TOP(1000) FROM TableName WHERECondition
    
  10. ==============================

    10.질문에 대한 대답은 테이블에서 행을 삭제하는 것이 아니라, 그것으로 인해 액티브 한 트랜잭션 (transaction)에 채택되고있는 임시 데이터베이스 공간입니다. 우리가 거래를 업데이 트를 삽입하고 삭제하려고 병합 (upsert)되고있는 실행이 대부분의 경우이 문제가 발생합니다. 유일한 옵션은 반드시 DB는 단순 복구 모델로 설정하고도 (타 파일 그룹을 추가) 최대 공간에 파일을 증가시키는 것이다. 이 자신의 장점을 가지고과 단점 만이 유일한 옵션입니다.

    질문에 대한 대답은 테이블에서 행을 삭제하는 것이 아니라, 그것으로 인해 액티브 한 트랜잭션 (transaction)에 채택되고있는 임시 데이터베이스 공간입니다. 우리가 거래를 업데이 트를 삽입하고 삭제하려고 병합 (upsert)되고있는 실행이 대부분의 경우이 문제가 발생합니다. 유일한 옵션은 반드시 DB는 단순 복구 모델로 설정하고도 (타 파일 그룹을 추가) 최대 공간에 파일을 증가시키는 것이다. 이 자신의 장점을 가지고과 단점 만이 유일한 옵션입니다.

    당신이 가진 것을 다른 옵션은 두 가지 작업으로 병합 (upsert)를 분할하는 것입니다. 업데이트 및 삭제를 수행 삽입하고 다른 작업을 수행 하나.

  11. ==============================

    11.이 시도:

    이 시도:

    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 
    

    나는 그것이 도움이되기를 바랍니다.

  12. ==============================

    12.여기 나의 영웅 코드입니다. 나는이 문제에 직면했습니다. 그리고이 문제를 해결하기 위해이 코드를 사용합니다.

    여기 나의 영웅 코드입니다. 나는이 문제에 직면했습니다. 그리고이 문제를 해결하기 위해이 코드를 사용합니다.

     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);
    
  13. ==============================

    13.가능 재시작 서비스 MSSQLSERVER 및 SQLSERVERAGENT합니다.

    가능 재시작 서비스 MSSQLSERVER 및 SQLSERVERAGENT합니다.

  14. from https://stackoverflow.com/questions/17674973/the-transaction-log-for-the-database-is-full by cc-by-sa and MIT license