SQL Server Transaction Log ap gwosi anpil pandan yon ETL ap ekzekite

posée 2 days ago14 vuesht

0

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.
Environnement :SQL Server, SSIS, ETLSQL Server 2022Windows Server 2022

🤖 Diagnostic IA

Généré par IA. Ce n'est pas une réponse — la communauté ci-dessous le confirme ou le corrige. Vérifiez toujours avant de vous y fier.

1 réponse

1
🟢 Vérifiée par l'auteur🟢 Confirmé par 1

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)

  1. 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.)

  1. 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).
  2. 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.

  3. 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.

Connectez-vous pour dire si ça a marché.

answered a day ago
  • Thank you @Vel Jules it works

    jeanpierre a day ago

Sign in and verify your email to post an answer.