programing

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

testmans 2023. 4. 15. 08:30
반응형

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

저는 오랫동안 거래를 계속 진행해야 하는 과정을 가지고 있습니다.

나는 이것을 실행하는 방법을 통제할 수 없다.

트랜잭션은 전체 기간 동안 열려 있으므로 트랜잭션 로그가 채워지면 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

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

그 의미는 다음과 같습니다.

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

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

제가 뭘 잘못 이해했나요?

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

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

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

이 문제는 실제로 로그 파일이 사용 가능한 모든 디스크 공간을 소비하기 때문에 발생했습니다.마지막 시도에서 120GB의 용량을 확보했는데도 모두 사용 중이어서 결국 실패했습니다.

프로세스가 밤새 진행되었을 때 실패에 의해 롤백되었기 때문에 이전에는 이 일이 일어나고 있는 것을 깨닫지 못했습니다.이번에는 롤백 전에 로그 파일 크기를 확인할 수 있었습니다.

의견을 주셔서 감사합니다.

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

1. 데이터베이스 속성> 옵션> 회복모델> 심플

2. 데이터베이스 태스크> 축소> 파일> 로그

다 했어요.

다음으로 [Database Properties]> [ Files ]> [ Database Files ]> [ Path ]에서 db 로그 파일 크기를 확인합니다.

완전한 SQL 서버 로그를 확인하려면 SSMS > Database > Management > SQL Server Logs > Current에서 Log File Viewer를 엽니다.

이 에러가 발생한 적이 있습니다만, 서버의 하드 디스크(HDD)에 디스크 용량이 부족하게 되었습니다.

로그 파일에 대해 [자동 경로 사용]과 [제한되지 않은 파일 증가]를 선택합니다.SSMS를 통해 "데이터베이스 속성" > "파일"에서 편집할 수 있습니다.

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

과거에는 일시적으로 로그 파일을 저장할 공간이 많이 필요한 특수 프로젝트를 위해 두 번째 로그 파일을 만들어 크게 만들었습니다.프로젝트가 완료되면 추가 로그 파일을 삭제했습니다.

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

이것을 시험해 보세요.

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 

도움이 됐으면 좋겠어요.

로그를 잘라냅니다.

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

차 백업 유지 때문에 이합니다.LOG_BACKUP

그러면 이 데이터베이스에 대한 작업(수축 등)이 방지되고 SQL Server 데이터베이스 엔진에서 9002 오류가 발생합니다.

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

디스크 공간을 확보하기 위해 데이터베이스 테이블에서 오래된 행을 삭제하다가 "ACTIVE_TRANSACTION"으로 인해 데이터베이스 트랜잭션 로그가 꽉 찼습니다.삭제되는 행의 수가 제 경우 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())

위의 답변에 덧붙여, 가능하다면 서버를 해방시켜 이 문제를 해결할 수도 있습니다.데이터베이스 오버플로로 인해 서버가 이미 꽉 찬 경우 DB가 구축된 서버에서 불필요한 파일을 삭제할 수 있습니다.적어도 일시적으로 문제가 해결되어 DB를 조회할 수 있습니다.

다음과 같은 제한된 삭제를 여러실행하면 문제가 해결됩니다.

전에

DELETE FROM TableName WHERE Condition

끝나고

DELETE TOP(1000) FROM TableName WHERECondition

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

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

내 영웅 코드야나는 이 문제에 직면했다.그리고 이 코드를 사용하여 이 문제를 해결합니다.

 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);

해결: 에러로 인해 드라이브에 남아 있는 빈 공간이 충분하지 않습니다.이 문제를 해결하려면 드라이브 공간을 확장하거나 MDF/LDF/LOG 파일을 충분한 공간이 있는 드라이브로 이동할 수 있습니다.주의: 기존 경로를 아래 절차에서 확인하십시오.

데이터베이스 속성 -> [파일 선택(Select File)]옵션 이미지 설명을 여기에 입력합니다.

이것을 시험해 보세요.

가능한 경우 MSQLSERVER 및 SQLSERVERAGENT 서비스를 재시작합니다.

언급URL : https://stackoverflow.com/questions/17674973/the-transaction-log-for-the-database-is-full

반응형