Ограничение SQL Журнал транзакций сервера - PullRequest
0 голосов
/ 08 марта 2020

В настоящее время у меня есть сценарий SQL, который берет все таблицы с определенным именем и удаляет записи из него.

В этих таблицах содержатся миллионы записей, поэтому журнал транзакций продолжает расти даже при установленном восстановлении ПРОСТО. Я помещаю удаление в сторону транзакции, и одновременно удаляется только около 50000 записей. Может кто-нибудь предложить какой-то способ не позволить журналу транзакций бесконтрольно расти. Ниже приведен пример грубого запуска SQL.

DECLARE delete_cur CURSOR FOR   
SELECT DISTINCT Name FROM Sys.tables WHERE name like 'ToDelete_%'

OPEN delete_cur
FETCH NEXT FROM delete_cur
INTO @tableName  
WHILE @@FETCH_STATUS = 0 AND @timeToStop = 0
BEGIN
    SELECT @RowCount = NULL, @MaxID = NULL, @MinID = NULL, @ID = NULL, @TableRowCount = 0               

    IF NOT Exists (Select 1 from ArchiveInfoAuditTables WHERE Name = @tableName)
    BEGIN
        SET @params = N'@MaxID_Out DECIMAL(18,0) OUT, @MinID_Out DECIMAL(18,0) OUT, @RowCount_Out DECIMAL(18,0) OUT';

        SET @SQL = 'SELECT @RowCount_Out = COUNT(ID), @MaxID_Out = MAX(ID), @MinID_Out = MIN(ID) FROM ' + @tableName
        print @SQL
        EXEC sp_executesql @SQL, @params, @RowCount_Out = @RowCount OUT, @MaxID_Out = @MaxID OUT, @MinID_Out = @MinID OUT;          
        PRINT @tableName + ' Row Count: ' + CONVERT(VARCHAR, @RowCount) + ' Max ID: ' + CONVERT(VARCHAR, @MaxID)  + ' Min ID: ' + CONVERT(VARCHAR, @MinID)      

        SET @params = N'@ID_Out DECIMAL(18,0) OUT, @Date DATETIME';

        SET @SQL = 'SELECT TOP 1 @ID_Out = ID FROM ' + @tableName + ' WHERE AuditTimeStamp < @Date ORDER BY ID DESC'
        print @SQL
        EXEC sp_executesql @SQL, @params, @ID_Out = @ID OUT, @Date = @JanOfCurrentYear          

        INSERT INTO DeleteInfo (Name, StartDeletingFromID, MaxID, MinID, NumberOfRows)
            VALUES (@tableName, @ID, @MaxID, @MinID, @RowCount)
    END
    ELSE 
    BEGIN
        SELECT TOP 1 @ID = StartDeletingFromID FROM DeleteInfo WHERE Name = @tableName          
    END

    IF (@ID IS NULL)
    BEGIN 
        PRINT 'No Record needs to be deleted for Table: ' + @tableName
        GOTO Fetch_Next
    END 

    WHILE 1 = 1
        BEGIN
            BEGIN TRANSACTION
                SET @params = N'@RowCount_Out DECIMAL(18,0) OUT, @NumOfRowsToDelete_Out BIGINT, @ID_Out DECIMAL(18,0)'
                SET @SQL = 'DELETE TOP (@NumOfRowsToDelete_Out) FROM ' + @tableName + ' WHERE ID <= @ID_Out ;' 
                + 'SELECT @RowCount_Out = @@RowCount'

                PRINT @SQL 
                EXEC sp_executesql @SQL, @params, @RowCount_Out = @TempRowCount OUT, @NumOfRowsToDelete_Out = @NumOfRowsToDelete, @ID_Out = @ID

                SET @TableRowCount += @TempRowCount
                SET @TotalRowCount += @TableRowCount
            COMMIT TRANSACTION
            CHECKPOINT;

            SET @MSG = 'Deleted ' + CAST(@TableRowCount AS VARCHAR) + '. ' + CONVERT(varchar, @TimeElapsed) + ' elapsed.'
            RAISERROR (@MSG, 0, 1) WITH NOWAIT  
            IF @TempRowCount < @NumOfRowsToDelete BREAK;
        END

    Fetch_Next:
        PRINT '/******************************************************************/'
        FETCH NEXT FROM delete_cur   
        INTO @tableName         

END

END_HERE:
    CLOSE delete_cur;  
    DEALLOCATE delete_cur;  

1 Ответ

0 голосов
/ 08 марта 2020

Вы можете ограничить размер журнала (здесь мы ограничиваем размер до 512 МБ):

ALTER DATABASE [DatabaseName] MODIFY FILE ( NAME = N'DATABASENAME_Log', SIZE = 512000KB , FILEGROWTH = 0)

Создать задание обслуживания для резервных копий БД и сжать журнал

вы можете использовать эту простую команду для сжатия файла журнала

DBCC SHRINKFILE (DataFile1, 512)
...