2012-04-05 16 views
0

Ich habe eine Produktionsdatenbank und eine Archivdatenbank in einer zweiten SQL Server-Instanz.Archivierung Produktion DB Einfügen/Aktualisieren mit SQL Server 2008

Wenn ich Daten in die Produktionsdatenbank einfüge oder aktualisiere (NICHT LÖSCHE), muss ich dieselben Daten in die Archivdatenbank einfügen oder aktualisieren.

Was ist der gute Weg dafür?

Dank

+0

Schreiben Sie einen Trigger für Archiv db ON After INSERT in Prod db – Teja

+0

@Vutukuri Was ist, wenn es viele Transaktionen in seiner Datenbank gibt? Wäre es die richtige Lösung? – rvphx

Antwort

1

Wenn sie in der gleichen db Instanz sind, wäre trivial ein Auslöser vorausgesetzt, es ist nicht viel von Tabellen.

Wenn die Größe dieser Datei zunimmt, sollten Sie sich die SQL Server-Replikation ansehen. Microsoft hat viel Zeit und Geld investiert, um es richtig zu machen.

+0

Ich möchte nicht, dass die gelöschten Daten aus der Datenbankproduktion aus der Archivdatenbank gelöscht werden, kann ich mit der Replikation tun? – Maxime

+0

Korrekt. Sie können 1-Weg-Replikation einrichten, Produktion -> Archivieren. Änderungen an Archivdaten wirken sich nicht auf die Produktion aus. –

+0

Wenn ich einen Eintrag in der Produktions-DB lösche, muss ich diesen Eintrag im Archiv behalten. Die Daten aller Tabellen in der Produktionsdatenbank werden zu Beginn jeden Tages gelöscht ... – Maxime

0

Wenn Sie die Verwendung von Auslösern in Erwägung ziehen, sollten Sie die Lastgrößen für Ihre Produktionsdatenbank berücksichtigen. Wenn es sich um eine sehr intensive Datenbank handelt, sollten Sie eine Hochverfügbarkeitslösung wie Replikation, Spiegelung oder Protokollversand in Betracht ziehen. Je nach Ihren Bedürfnissen kann Ihnen eine der beiden Lösungen helfen. Außerdem sollten Sie Ihre "kalten" Wiederherstellungslösungen berücksichtigen, die entsprechend Ihrer Implementierung geändert werden müssten.

0

Die Replikation repliziert auch Ihre Löschungen. Wenn Sie die Löschvorgänge aus Ihrer Archivdatenbank jedoch nicht löschen, kann dies bei eindeutigen Indizes zu Problemen führen, wenn ein Wert in der Produktionsdatenbank gültig, aber in der Archivdatenbank nicht gültig ist, da die Werte dort bereits vorhanden sind. Wenn Ihr Design bedeutet, dass dies kein Problem ist, dann ein einfacher Trigger in der Produktion Tabelle wird dies für Sie tut:

CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS 
BEGIN 
    SET ROW_COUNT OFF 
    -- First inserts 
    SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used 
    INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...) 
    SELECT MyTableKey, Col1, Col2, Col3, ... 
    FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey 
    WHERE d.MyTableKey IS NULL 
    SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used 

    -- then updates 
    UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ... 
    FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey 
     INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey 
END 

Dies setzt voraus, dass die Archivdatenbank auf dem gleichen Server wie Ihre Produktion Datenbank befindet. Wenn dies nicht der Fall ist, müssen Sie einen Verbindungsservereintrag erstellen und dann ArchiveDB..MyTable durch ArchiveServer.ArchiveDB..MyTable ersetzen, wobei ArchiveServer der Name des Verbindungsservers ist.

Wenn Ihre Produktionsdatenbank bereits stark ausgelastet ist, sollten Sie jedoch bedenken, dass dadurch die Datenmenge verdoppelt wird. Um dies zu umgehen, können Sie in jeder Ihrer Tabellen ein Update-Flag-Feld hinzufügen und eine geplante Aufgabe zu einem Zeitpunkt ausführen, zu dem die Datenbankbelastung minimal ist, beispielsweise um 1 Uhr morgens. Ihr Auslöser würde dann das Feld auf I für eine Einfügung oder U für ein Update in der Produktionsdatenbank setzen, und die geplante Aufgabe würde dann aktualisieren oder in die Archivdatenbank einfügen, abhängig vom Wert dieses Feldes, und dann das Feld zurücksetzen zu NULL sobald es fertig ist.