Ich habe eine sehr große Produktionsdatenbank und eine sehr große Testumgebungsdatenbank in SQL Server 2008R2. Beide Datenbanken haben eine ähnliche Tabellenstruktur, jedoch unterschiedliche Benutzer / Anmeldungen / Berechtigungen / Rollen.
Ich muss nur ein paar Tabellen in der Testdatenbank regelmäßig aus der Produktion aktualisieren, etwa einmal im Monat.
Die derzeitige Art, wie ich das vorhabe, ist
- Verwenden Sie das Dienstprogramm BCP, um einen Export der benötigten Tabellen aus der Produktion durchzuführen.
- Kopieren Sie die BCP-Exportdatei auf den Testserver
- Deaktivieren Sie die Indizes und Einschränkungen für alle Tabellen, die ich in Test aktualisiere
- Kürzen Sie die Testdatenbanktabellen
- Laden Sie die Daten mithilfe von BCP zurück in die Testdatenbanktabellen.
- Erstellen Sie die Indizes neu und aktivieren Sie die Einschränkungen in Test erneut
Dies alles scheint ein wenig zu kompliziert für eine so kleine Aufgabe. Es sieht auch so aus, als würde es eine Menge Redo erzeugen (im T-Log). Gibt es eine bessere Möglichkeit, dies zu tun?
Eine andere Möglichkeit, die ich mir vorgestellt habe, besteht darin, ein Backup aus der Produktion in der Testumgebung wiederherzustellen. Mein Problem ist jedoch, dass ein vollständiges Backup sehr umfangreich ist und nicht alle Tabellen aktualisiert werden müssen, sondern nur einige wenige. -und auch die Benutzer und Sicherheit in der Produktionsdatenbank unterscheidet sich vom Test. Das würde durch die Sicherheitseinstellungen in der Produktionsdatenbank überschrieben, wenn ich die gesamte Datenbank wiederherstelle.
quelle
Antworten:
Es gibt 2 Methoden, die Ihren Anforderungen entsprechen:
(Hinweis: Wenn die Tabellen mit Fremdschlüsseln referenziert werden, können Sie sie nicht verwenden
TRUNCATE
. Sie müssen in Blöcken löschen . Alternativ können Sie alle Indizes + Fremdschlüssel löschen und Daten laden und anschließend neu erstellen.)BCP OUT und BULK INSERT INTO Zieldatenbank .
Enable Trace Flag 610 - Minimal protokollierte Einfügungen in indizierte Tabellen.
-
Methode 2: SSIS - Meine bevorzugte Methode in diesem Fall.
Referenz: Das Handbuch zum Laden von Daten und meine Antwort für - In Tabelle einfügen Wählen Sie * aus Tabelle vs. Bulk-Insert
quelle
Es ist nicht erforderlich, Sicherungen und Wiederherstellungen durchzuführen oder externe Prozesse (z. B. BCP) aufzurufen / zu koordinieren oder gar mit SSIS zu arbeiten (sehr leistungsfähig, sehr cool, aber wenn ich es vermeiden kann, werde ich es auf jeden Fall tun :). All dies können Sie bequem mit T-SQL erledigen, in einer gespeicherten Prozedur, die Sie über SQL Agent planen können, oder in einem Skript, das Sie einmal im Monat ausführen (obwohl das Einfügen in eine Prozedur und das Planen auf lange Sicht weniger arbeitsintensiv ist Lauf). Wie? Durch die Verwendung von SQLCLR für den Zugriff auf die
SqlBulkCopy
Klasse in .NET, da es sich im Wesentlichen um BCP handelt, ohne den Aufwand beim Aufrufen von BCP. Sie können dies selbst codieren: Es gibt kein super kompliziertes Setup oder ähnliches wie dasSqlBulkCopy
class erledigt fast alles für Sie (Sie können die Stapelgröße festlegen, ob Trigger ausgelöst werden sollen oder nicht usw.). Oder, wenn Sie mit dem Kompilieren und Bereitstellen einer Assembly nicht zu verwirren wollen, können Sie eine vorgefertigte verwenden SQLCLR gespeicherte Prozedur wie DB_BulkCopy , die Teil der ist SQL # SQLCLR Bibliothek (die ich bin der Autor, aber diese gespeicherte Verfahren ist in der Free-Version). Ich beschreibe dies ausführlicher, einschließlich eines Beispiels für die Verwendung von DB_BulkCopy , in der folgenden Antwort:Importieren Sie Daten aus einer Datenbank in ein anderes Skript
Wenn nicht klar ist, wo dies in Ihrem aktuellen Plan platziert werden soll, würden Sie Folgendes tun:
EXEC
von DB_BulkCopy oder was auch immer Sie es nennen , wenn Sie es selbst Code, der nur die Daten von Punkt A zu Punkt B bewegtEs sollte auch darauf hingewiesen werden, dass
SqlBulkCopy
und DB_BulkCopy :UPDATE in Bezug auf minimal protokollierte Vorgänge über SqlBulkCopy
Es ist möglich, minimal protokollierte Vorgänge abzurufen, aber Sie sollten wissen:
[tempdb]
und anschließend die geordnete Einfügung in das Ziel ausgeführt. Daher entsteht eine zusätzliche Last, sowohl hinsichtlich der physischen E / A für Tempdb (Daten- und Protokolldateien) als auch der Sortieroperation (aufgrund der,ORDER BY
die erforderlich ist, um die minimal protokollierten Operationen zu erhalten).quelle