Avatar billede Syska Mester
31. juli 2009 - 17:38 Der er 9 kommentarer og
1 løsning

Transaction ... hvad mangler jeg ?

Hej,

Jeg har en stor table som jeg gerne vil gøre mindre ... det er også lykkedes gangske fint ... men der er nogen ting som driller lidt ...

declare @DD date = getdate();
set @DD = dateadd(D, -30, @DD);
declare @SID smallint = 1;
WHILE @SID != 450
BEGIN
    PRINT @SID;
    BEGIN TRANSACTION
        DELETE VS FROM VillageStats VS
        INNER JOIN Villages V ON VS.SID = V.SID AND VS.VID = V.VID
        WHERE V.SID = @SID AND V.Active = 0 AND VS.Added <= @DD
    COMMIT TRANSACTION
    set @SID = @SID + 1;
END

Overstående kører fra SID 1 til 449 og sletter en masse data

Men ... inden den er færdig så er min SQL LOG fyldt ... 210 GB ... og der er ikke mere plads på disken ... fint nok, så må jeg jo antage at det hele også bliver kørt i en ydre LOG, og derfor den til sidste fylder de 210 GB ... hvilket jeg troede min BEGIN TRANSACTION/COMMIT TRANSACTION ville løse ...

Når det så er fejlen ved SID 300 ... så kan jeg jo køre samme query igen ... og så de 300 første SID er blevet kørt igennem og pladsen i min LOG er frigivet, vil den så køre igennem anden gang ... men hvordan løses det så ting bliver COMMITED med det samme ... så fejlen ikke sker igen ?

mvh
Avatar billede arne_v Ekspert
31. juli 2009 - 23:29 #1
Check om gode gamle:

BACKUP LOG database WITH NO_LOG

lige efter COMMIT gør tricket.
Avatar billede HenrikSjang Nybegynder
01. august 2009 - 12:23 #2
Ja hvis databasen kører i full recovery mode, så bliver loggen jo ikke mindre af at lave en commit, så skal der en backup til.

Hvis db'en kører i simple mode, så vil backup-tricket ikke hjælpe :/
Avatar billede Syska Mester
01. august 2009 - 21:16 #3
Databasen i Simple mode ...

Men det må da kunne løses på en måde.

Jeg skal bare kunne slette de rows uden min Log bliver udvidet til 200 GB ... for når den er færdig, så de de mange DB jo igen frigivet i log filen, og jeg kan så lave en shrink på den ... og alt er tilbage til det normale igen ...

// ouT
Avatar billede arne_v Ekspert
01. august 2009 - 22:06 #4
Selvom databasen er i simple recocery mode, så trunkerer den vel kun loggen ved checkpoint ?
Avatar billede Syska Mester
03. august 2009 - 15:28 #5
okay ... prøvede med:

"BACKUP LOG database WITH NO_LOG"

lige efter min commit ... og så siger den følgende ...

"One or more of the options (no_log) are not supported for this statement. Review the documentation for supported options."

Så er jeg lost igen ...

Men som Arne_v så skriver i sin sidste post ... er det så en måde at force et check point ind ? sådan jeg kan få frigivet min log før end hele min operation er færdig ?

// ouT
Avatar billede arne_v Ekspert
03. august 2009 - 15:38 #6
De har nok fjernet den mulighed i nyere SQLServer. Hundehoveder.

Du kan force et checkpoint med CHECKPOINT kommandoen.
Avatar billede PFD Nybegynder
09. august 2009 - 00:51 #7
hvad siger

dbcc loginfo når din operation dør ?
Avatar billede arne_v Ekspert
22. august 2009 - 16:56 #8
Kommet videre ?
Avatar billede Syska Mester
11. marts 2010 - 09:14 #9
smid et svar begge ...

Laver nu delete i trunks:

DELETE TOP (@Count) table WHERE cond
Avatar billede arne_v Ekspert
11. marts 2010 - 15:00 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester