Transaktionsprotokoll läuft voll

26. November 2010 17:27

Hallo

Ich sollte eine FBK-Sicherung in eine SQL-Server DB einlesen (wie schon öfters).
Nun habe ich aber das Problem, dass das Transaktionsprotokoll ins unendliche wächst.
Ich habe versucht im einfachen Wiederherstellungsmodus (SIMPLE), aber auch im Vollständigen (FULL).
Ebenso habe ich während dem Restore dauernd eine Transaktionsprtokollsicherung gemacht.
Nützt nichts!! Das Ding läuft voll.

Wir verwenden SQL Server 2008 R2 Standard Editition 64-bit und NAV 5 SP1 Build 31781.

Hilfe :-)

Re: Transaktionsprotokoll läuft voll

26. November 2010 23:13

Hallo,

wenn ich das richtig weiß, (Jörg möge mich korrigieren :wink: ) wird die FBK-Sicherung als eine Transaktion eingespielt. D.h. wenn du deine FBK-Sicherung nicht in unterschiedliche Häppchen (Mandanten) beim Einspielen aufteilen kannst, wirst du wohl oder übel das Log vergrößern müssen, bis alle SQL- DB- Änderungen durch die FBK in das LOG passen :-( . Da nützt es dir auch nichts mit 'Simple' zu arbeiten, das markiert das Log auch erst als gelöscht, wenn eine Transaktion bestätigt wurde. Die LOG-Datei wird aber im Normalfall durch ein Commit aber nicht kleiner (wenn man es nicht unsinniger Weise eingeschaltet wurde).

Nach deiner Frage zu urteilen hast du das Problem, dass das SQL-Log nicht mehr auf die zur Verfügung stehende Platte passt. Hier hilft dir wahrscheinlich nur, die Datenbank am endgültigen Ort zu erstellen, und das Log auf einer USB-Platte zu erstellen. Am Ende des Einspielens bemühst du das SQL-Server- Management- Studio trennst die Datenbank und danach die USB-Platte vom System. Im Anschluss fügst du die Datenbank wieder an und erstellst dabei das Log am endgültigen Platz neu. Und hoffst das es für zukünftige Transaktionen platz genug hat :-?

Gruß, Fiddi

Re: Transaktionsprotokoll läuft voll

26. November 2010 23:33

Hallo Fiddi

Ich fürchte Du hast Recht. Obwohl das aber wirklich ein Schrott ist. Das Restore des FBK mache ich bereits auf der produktiven Maschine.
Der freie Platz auf der Festplatte für das Log beträgt leider nur 30 GB. Im normalen Betrieb völlig ausreichend, aber nicht für das restore des FBK.
Was ich nun gemacht habe:
Zweites Transaktionslog auf einer weiteren Festplatte mit mehr freier Kapazität "angehängt".
Restore gemacht. Transaktionlog abgeschnitten, und dieses zweite Transaktionslog wieder gelöscht.

Fertig :-)

Danke für Deine Bestätigung und Gruss

Re: Transaktionsprotokoll läuft voll

27. November 2010 14:37

Man könnte auch folgendes versuchen:

In der nativen DB:
1. Alle Tabellen in FOB exportieren
2. Per Codeunit über die Tabelle "Key" rutschen und bei allen Schlüsseln "MaintainSIFT" auf FALSE setzen
bei allen nicht-PK SChlüsseln (ID > 1) und nicht-"Clustered" Schlüsseln auch "MaintainSQLIndex" auf FALSE
Code:
OBJECT Codeunit 90208 Disable Keys & SIFT
{
  OBJECT-PROPERTIES
  {
    Date=27.11.10;
    Time=13:35:46;
    Modified=Yes;
    Version List=SSI/TEMP;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            IF NOT CONFIRM('CAUTION: This will disable ALL Indexes and SIFTs!\\' +
                           'Backup the database and export all Tables into a FOB before running this!\\' +
                           'Continue?', FALSE)
            THEN
              EXIT;

            IF NOT CONFIRM('Really?', FALSE) THEN
              EXIT;

            Key.SETRANGE(TableNo, 1, 1999999999);
            Key.SETRANGE("No.", 1, 255);
            Key.SETRANGE(Enabled, TRUE);
            IF Key.FINDSET THEN BEGIN
              c := Key.COUNT;
              Window.OPEN('Table #1######## #2##################\' +
                          'Key   #3########\' +
                          '@4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');
              REPEAT
                i := i + 1;
                Window.UPDATE(1, Key.TableNo);
                Window.UPDATE(2, Key.TableName);
                Window.UPDATE(3, Key."No.");
                Window.UPDATE(4, ROUND(10000 / c * i, 1));

                IF Key.MaintainSQLIndex AND (NOT IsClustered(Key.TableNo, Key."No.")) THEN
                  Key.VALIDATE(MaintainSQLIndex, FALSE);
                IF Key.MaintainSIFTIndex THEN
                  Key.VALIDATE(MaintainSIFTIndex, FALSE);
                Key.MODIFY;

                IF (i MOD 100) = 0 THEN
                  COMMIT;

              UNTIL Key.NEXT = 0;
              Window.CLOSE;
            END;
          END;

  }
  CODE
  {
    VAR
      Key@1000000000 : Record 2000000063;
      c@1000000003 : Integer;
      i@1000000001 : Integer;
      Window@1000000002 : Dialog;

    PROCEDURE IsClustered@1000000006(TableNo@1000000000 : Integer;KeyNo@1000000001 : Integer) : Boolean;
    VAR
      Key2@1000000002 : Record 2000000063;
    BEGIN
      Key2.SETRANGE(TableNo, TableNo);
      Key2.SETRANGE(Clustered, TRUE);
      IF Key2.FINDFIRST THEN
        EXIT(KeyNo = Key2."No.")
      ELSE
        EXIT(KeyNo = 1);
    END;

    BEGIN
    END.
  }
}

3. FBK Sicherung erstellen

In der SQL DB:
1. DB neu anlegen; Dateien ausreichend groß dimensionieren, auch das Log!
2. Auto Create/Update Statistics = FALSE
3. Recovery Moldel SIMPLE
4. Enable for Dynamics NAV Server = FALSE
5. FBK importieren - die Daten werden nun in einer einzigen Transaktion importiert; allerdings werden jetzt keine Indexe und SIFT/VSIFT aufgebaut;
=>> das reduziert die Last und Transaktionsgröße
Nach diesem Import erfolgt ein COMMIT, das Log wird geleert
6. FOB mit den originalen Tabellen definitionen importieren; große Tabellen dabei einzeln
=>> jetzt erst werden die Indexe/SIFT/VSIFT aufgebaut
Nach jedem Import erfolgt ein COMMIT, das Log wird geleert. Somit kannst Du anhand der "FOB-Import-Pächchen" die Last regulieren.

Wenn man mehrere große Mandanten hat, dann sollte man pro Mandant eine FBK Sicherung erstellen und die dann einzeln importieren; danach wieder der Import der Original-Tabellen.

Hoffe das klappt!

Jörg

Re: Transaktionsprotokoll läuft voll

29. November 2010 09:44

Hallo Jörg

Danke für Deinen Tipp mit den Keys (der ist gut).

Gruss