SQL Server Transaction Log ap gwosi anpil pandan yon ETL ap ekzekite
asked 2 days ago14 viewsht
Mwen gen yon ETL ki ap transfere yon gwo kantite done nan SQL Server. Pandan job la ap ekzekite, transaction log la ap grandi rapidman jiskaske disk la prèske plen.
INSERT INTO dbo.SalesTransactions SELECT * FROM dbo.StagingSalesTransactions;
Before ETL: 10 GB After 30 min: 35 GB After 60 min: 75 GB After 90 min: 120 GB
What I tried
Mwen fè transaction log backup regilyèman, men log la toujou ap grandi anpil pandan ETL la.
Error message
The transaction log for database 'SalesDB' is full
due to 'LOG_BACKUP'.
Expected result
Mwen ta renmen ETL la fini san transaction log la ranpli disk la, epi mwen vle konprann kòz prensipal pwoblèm nan.
🤖 AI diagnosis
AI-generated. Not an answer — the community below confirms or corrects it. Always verify before relying on it.
1 Answer
Kòz prensipal
Lè w fè yon INSERT INTO ... SELECT * sou yon gwo kantite done nan yon sèl transaksyon, SQL Server oblije kenbe tout log operasyon yo (pou kapab fè rollback si gen erè) jiskaske transaksyon an fini nèt. Se poutèt sa transaction log la ap grandi san rete pandan tout dire ETL la — li pa ka libere espas paske transaksyon an poko commit.
Menm si w ap fè log backup regilyèman, si transaksyon prensipal la poko fini (li toujou "open"), backup log la pa ka libere espas ki itilize pa pati transaksyon sa a ki poko commit.
Sa ki ka fèt (pis pou eksplore)
- Fè batch/chunk enstead de yon sèl gwo transaksyon Divize INSERT la an pi piti moso (pa egzanp 10,000-50,000 liy chak fwa), avèk yon COMMIT apre chak batch:
DECLARE @BatchSize INT = 50000;
DECLARE @RowsAffected INT = 1;
WHILE @RowsAffected > 0
BEGIN
INSERT INTO dbo.SalesTransactions
SELECT TOP (@BatchSize) *
FROM dbo.StagingSalesTransactions AS s
WHERE NOT EXISTS (
SELECT 1 FROM dbo.SalesTransactions t
WHERE t.SomeKeyColumn = s.SomeKeyColumn
);
SET @RowsAffected = @@ROWCOUNT;
-- Optionnèl: fòse yon checkpoint/log backup apre chak batch si BD a an FULL recovery
-- BACKUP LOG SalesDB TO DISK = '...';
END
(Ajiste kondisyon WHERE/logic la selon kle inik ou genyen pou evite duplike liy yo.)
-
Verifye recovery model database a
- Si ETL sa a se yon operasyon "one-time load" oswa bulk load ki pa oblije gen point-in-time recovery pandan pwosesis la, w ka konsidere mete database a (oswa fè operasyon an) an BULK_LOGGED recovery model pandan chaj la, epi retounen an FULL apre.
- Sa redwi kantite enfòmasyon ki ekri nan log la pou operasyon bulk (men fè atansyon: sa gen enplikasyon pou point-in-time recovery pandan peryòd sa a).
-
Fè log backup pi souvan pandan batch yo ap kouri, pa sèlman apre tout job la fini — sa ap ede log la rete piti si w deja ap fè batch commits.
-
Verifye disk space ak model recovery aktyèl la avèk:
SELECT name, recovery_model_desc FROM sys.databases WHERE name = 'SalesDB';
Rezime
- Kòz : yon sèl gwo transaksyon ki poko commit anpeche log backup libere espas.
- Solisyon ki pi pwobab : divize INSERT la an batch pi piti ak commit apre chak batch, epi kontinye fè log backup regilyèman pandan pwosesis la.
- Opsyonèl : eksplore BULK_LOGGED recovery model pou peryòd chaj la si sa apwopriye pou ka w la.
⚠️ Sa se yon pis jeneral — ou ta dwe teste apwòch sa a nan yon anviwònman tès anvan w aplike l an pwodiksyon, epi verifye kondisyon inik/duplika pou evite pwoblèm entegrite done.
Sign in to tell others whether this worked.
Thank you @Vel Jules it works
— jeanpierre a day ago
Sign in and verify your email to post an answer.