SQL Large Insert Transaction log full 错误

SQL Large Insert Transaction log full Error

提问人:Sanman Chavan 提问时间:3/27/2020 最后编辑:Dale KSanman Chavan 更新时间:3/27/2020 访问量:647

问:

我正在尝试在 1,75,00,000 个表中插入近 8 个。 我有存储过程。在该过程的开始和结束时,我写了 Transaction。

错误:由于“ACTIVE_TRANSACTION”,数据库“数据库”的事务日志已满。

注意:我想保留交易中的所有内容,即其自动化过程。此过程将每月在数据库上运行

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
sql-服务器 交易 sql-插入 事务日志

评论


答:

0赞 user7370003 3/27/2020 #1

尽管拥有如此庞大的事务是无稽之谈,但您可以通过使用 timesptamp 或 GUID 之类的东西标记行来执行手动回滚,为此,您需要在事务日志文件中拥有必要的空间来存储从第一个插入到最后一个插入的所有行, 加上其他用户同时执行的所有事务。许多解决方案可以解决您的问题: 1) 放大事务日志文件 2)添加一些补充日志文件 3)删除或缩小交易范围

评论

0赞 TomTom 3/27/2020
这几乎可以概括它。玩大数据,预留大空间。我习惯于有时看到 TB 大小的事务日志分配 - 当需求是它们时,空间必须适当调整大小。