簡體   English   中英

SQL 大插入事務日志已滿錯誤

[英]SQL Large Insert Transaction log full Error

我試圖在 8 個表中插入近 1,75,00,000。 我有存儲過程。 在該過程的開始和結束時,我已經編寫了 Transaction。

錯誤:由於“ACTIVE_TRANSACTION”,數據庫“Database”的事務日志已滿。

注意:我想保留交易中的所有內容,其自動化過程。 這個過程每個月都會在數據庫上運行

CREATE OR ALTER PROCEDURE [dbo].[InsertInMainTbls]
AS
BEGIN
PRINT('STARTED [InsertInMainTbls]')

DECLARE @NoRows INT
DECLARE @maxLoop INT
DECLARE @isSuccess BIT=1
BEGIN TRY

    BEGIN TRAN
        --1st table
        SET @NoRows = 1
        SELECT @maxLoop=(MAX([col1])/1000)+1 FROM ProcessTbl
        SELECT 'loop=='+ CAST(@maxLoop as Varchar)
        WHILE (@NoRows <= @maxLoop)
        BEGIN
                INSERT INTO MainTbl WITH(TABLOCK)
                ( col1,col2,col3....col40)
                SELECT
                ( val1,val2,val3....val40)FROM
                ProcessTbl
                WHERE [col1] BETWEEN (@NoRows*1000)-1000 
                AND (@NoRows*1000)-1
            SET @NoRows = @NoRows+1;
        END 
    --2nd table
    .
    .
    .
    --8th table
    SET @isSuccess=1;  
    COMMIT TRAN

END TRY
BEGIN CATCH

        PRINT ERROR_MESSAGE();
        SELECT  ERROR_MESSAGE() 'ErrorMsg'  ;
        SET @isSuccess=0;
    ROLLBACK TRAN

END CATCH

盡管擁有如此龐大的事務是無稽之談,雖然您可以通過使用時間戳或 GUID 標記行來手動回滾,但要這樣做,您需要在事務日志文件中有必要的空間存儲從第一個插入到最后一個插入的所有行,以及其他用戶同時執行的所有事務。 許多解決方案可以解決您的問題:1) 擴大您的事務日志文件 2) 添加一些補充日志文件 3) 刪除或減少事務范圍

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM