提问人:Sanman Chavan 提问时间:3/27/2020 最后编辑:Dale KSanman Chavan 更新时间:3/27/2020 访问量:647
SQL Large Insert Transaction log full 错误
SQL Large Insert Transaction log full Error
问:
我正在尝试在 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
答:
0赞
user7370003
3/27/2020
#1
尽管拥有如此庞大的事务是无稽之谈,但您可以通过使用 timesptamp 或 GUID 之类的东西标记行来执行手动回滚,为此,您需要在事务日志文件中拥有必要的空间来存储从第一个插入到最后一个插入的所有行, 加上其他用户同时执行的所有事务。许多解决方案可以解决您的问题: 1) 放大事务日志文件 2)添加一些补充日志文件 3)删除或缩小交易范围
评论
0赞
TomTom
3/27/2020
这几乎可以概括它。玩大数据,预留大空间。我习惯于有时看到 TB 大小的事务日志分配 - 当需求是它们时,空间必须适当调整大小。
评论