MSSQL transakční log   otázka

SQL

Dobrý den,

lez nějak (buď na úrovni celé databáze nebo pouze konkrténího dotazu) zrušit tvorbu transakčního logu?

Pokud transakčnímu logu nakáže max velikost, tak dotaz skončí chybou, protože log "chce" být větší než max velikost.

Pokud dám autoshrink, tak ten proběhne až poté, což je pozdě protože transakční log je větší než místo na disku.

Díky za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pravidelně zálohujte databázi, tím se transakční log vyprázdní. Případně ho jednou za čas můžete vysypat příkazem

BACKUP LOG název_databáze WITH TRUNCATE_ONLY
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

Díky za odpověď. Vysypat či zmenšit ho umím. Plním jednu tabulku pomocí update a jednotlivé sloupce jsou SQL serverem vypočítávány. Jde mi o to udělat pouze jednou, bude to trvalá a neměnná databáze jako zdroj dat. Bohužel ale ten příkaz update sežere min 56GB, což současná zbývající velikost toho disku, a skončí chybou. Výsledná tabulkua podle mě nebude mít ani pár giga. Jde tedy o to,aby se pro tento případ ten log nevytvářel, pokud by se něco po..., tak tabulku jednoduše odstraním a udělám znovu.

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nedělejte to na jeden update, ale postupně, třeba po 10000 záznamech.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za rychlou odpověď.

To mě taky napadlo, nicméně tam není žádný číselný identifikátor, podle kterého bych dokázal říct, které řádky se mají updatovat, máte nějaký tip jak na to?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vy v té tabulce nemáte primární klíč?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

mám, ale ne číselný....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A to vadí?

Tak si do temp tabulky vyberte řekněme každý 50000 primární klíč a ještě ten nejnižší, který se tam vyskytuje:

CREATE TABLE #t (id UNIQUEIDENTIFIER PRIMARY KEY)
INSERT INTO #t 
  SELECT id FROM (
    SELECT id, ROW_NUMBER() OVER (ORDER BY id) as rn FROM tabulka
  ) t WHERE rn MOD 50000 = 0
INSERT INTO #t 
  SELECT MIN(id) FROM tabulka

A pak ve while cyklu dělejte ten update:

DECLARE @lastId UNIQUEIDENTIFIER
WHILE ((SELECT COUNT(*) FROM #t) > 0) BEGIN

  SELECT @lastId = MAX(id) FROM #t

  UPDATE tabulka SET ...
    WHERE id >= @lastId
  -- tady vysypat transakční log

  DELETE FROM #t WHERE id = @lastId
END

Píšu to z hlavy, takže tam budou chyby, asi by to šlo i bez té temp tabulky, ale musel byste hlídat, jestli jste zupdatoval všechno.

Nebude to celé ale transakční, pokud vám někdo přidá záznam do intervalu, který jste již updatoval, máte smůlu. Ale celé to dát do transakce nejde - to bychom měli ten samý problém jako na začátku - malý transakční log.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Přiznám se, že tomu moc nerozumím, ale doučím se a zkusím to. Ono mi ani nic jiného nezbývá :)

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback