Wenn es dumm ist und funktioniert, ist es immer noch dumm.
Das Hullabaloo über GDPR brachte mich zum Nachdenken - wenn Sie in Ihre Backups gehen und Daten ändern / löschen müssten, wie würden Sie das tun? Das Öffnen einer .bak-Datei klingt für mich schwierig. Aber es ist ziemlich einfach, eine TXT-Datei zu öffnen.
Könnte ich stattdessen meine Datenbank in einer Textdatei sichern, um das Löschen des Verlaufs aus den Sicherungen zu vereinfachen?
sql-server
backup
scripting
export
James
quelle
quelle
Antworten:
Dies ist zwar keine gute Wahl für tatsächliche Sicherungen, es gibt jedoch einige Anwendungsfälle für das Speichern von Tabellen in Textdateien. In diesem Zusammenhang besteht ein alternativer Ansatz zum
xp_cmdshell
Aufrufen von BCP.EXE darin, die gespeicherte Prozedur DB_BulkExport SQLCLR zu verwenden, die in SQL # (das ich geschrieben habe) verfügbar ist . Sie können dann File_GZip verwenden , um die Dateien zu komprimieren.Die folgenden Vor- und Nachteile der Verwendung von DB_BulkExport im Vergleich zu BCP.EXE sind :
Vorteile:
xp_cmdshell
BIT
Darstellung: 1/0, T / F oder Wahr / Falsch.SMALLDATETIME
,DATETIME
,DATE
,TIME
,DATETIME2
, undDATETIMEOFFSET
Format.Nachteile:
Bitte beachten Sie, dass DB_BulkExport nur Daten exportiert. Die Struktur der Ergebnismenge wird nicht aufgezeichnet. Dies unterscheidet sich weder von BCP noch von der in der Antwort des Haupt-Community-Wikis bereitgestellten Lösung, da die dortige Lösung Kollatierungen, berechnete Spalten, die meisten Spaltenoptionen usw. ignoriert.
Eine weitere von Kin erwähnte Option für SQL Server ist mssql-scripter . Dies ist ein kostenloses / Open Source-Tool für mehrere Plattformen auf Python-Basis. Ich habe es nicht verwendet, aber es scheint DDL- und / oder DML-Anweisungen zu exportieren, die ausgeführt werden können, um die Daten und / oder das Schema (Tabellen, Einschränkungen usw.) neu zu erstellen. Es scheint, dass die Daten nur als
INSERT
Anweisungen anstatt als begrenzte Felder exportiert werden. Sieht ziemlich interessant aus, aber bitte überprüfen Sie die " Probleme ", um sicherzustellen, dass nichts Ihre Nutzung beeinträchtigt.Auch wenn in dieser Frage (und in der Antwort des Haupt-Community-Wikis) SQL Server erwähnt wird, sind die Probleme im Zusammenhang mit GDPR nicht spezifisch für SQL Server. Ich dachte nur, ich würde erwähnen, dass die Möglichkeit zum Exportieren von Tabellen (und sogar von Schemata usw.) für MySQL in den folgenden zwei Dienstprogrammen verfügbar ist:
Dasselbe kann in PostgreSQL mit den folgenden zwei Dienstprogrammen durchgeführt werden:
Informationen zu Oracle finden Sie in den folgenden Ressourcen, von denen ich glaube, dass sie Sie zumindest sehr nahe bringen, wenn auch nicht vollständig gleichwertig (danke an Michael Kutz , der mich in die richtige Richtung gelenkt hat):
Ich bin nicht sicher, ob ähnliche Dienstprogramme mit DB2 geliefert werden.
quelle
SQL*Plus
12c + hinzugefügtSET MARKUP CSV
. Ähnliches gilt fürSQLcl
. Ich weiß nur nicht, ob es die für jede Tabelle erforderliche Schleife ausführen kann. Laden istSQL*Loader
.Das Folgende ist keine gute Backup-Lösung. Wenn Sie Ihren Job nicht kündigen und Ihrem Chef auf dem Weg zur Tür einen Streich spielen möchten, sollten Sie ihn nicht benutzen. Aber ich habe ein paar Dinge gelernt und hatte Spaß beim Schreiben, hoffentlich auch bei anderen. Wir werden einige ETL-Konzepte verwenden, die unter anderen Umständen tatsächlich nützlich sein könnten. Die vollständigen Skripte finden Sie unten. Folgendes werden wir tun:
Schreiben Sie das Schema in eine eigene Tabelle.
Schreiben Sie jede Tabelle in der Datenbank in eine eigene dynamisch benannte Textdatei.
Erstellen Sie das Schema in einer neuen Datenbank aus der Textdatei
neu. Erstellen Sie eine neue Tabelle und fügen Sie jede Tabelle aus ihrer Textdatei ein
Bevor wir beginnen: Um die gesamte Datenbank zu erstellen, benötigen Sie mehrere hundert GB Speicher. Wenn Sie zu pingelig sind, können Sie die Top 1000 im Skript eingeben, um die Größe der TXT-Dateien zu begrenzen. Dann müssen Sie Ihrem Chef nicht erklären, wie Sie C: \ ausgefüllt haben
Aktivieren Sie xp_cmdshell - hier erklärt:
https://blog.sqlauthority.com/2007/04/26/sql-server-enable-xp_cmdshell-using-sp_configure/
Wir werden prüfen, ob die Tabelle bereits vorhanden ist (wenn wir das Skript bereits ausgeführt haben). Es ist einfacher, den Tisch jedes Mal einfach fallen zu lassen.
Wenn Sie jetzt eine schnelle Auswahl * aus HeaderTable vornehmen, sehen Sie jede Tabelle, jede Spalte, ihren Datentyp und ihre maximale Länge - alles, was wir zum erneuten Erstellen benötigen.
Hier fängt es an, cool zu werden. Wir werden einen Cursor verwenden, um sys.tables zu durchlaufen und jeden in seine eigene .txt zu kopieren.
Wir werden eine Reihe von Variablen verwenden:
@table geht in den Cursor. Es wird die Namen jeder Tabelle enthalten, während wir gehen.
@Database, @filepath, @filename, @filetype werden alle zum Erstellen einer Reihe dynamischer SQL-Anweisungen verwendet.
@sql wird unsere letzten SQL-Befehle enthalten, um sie in sp_executesql zu setzen.
Mit den Trennzeichen und Zeilenabschlusszeichen wird es etwas schwierig. Wenn Sie die Standardeinstellungen von | verwenden und / r, Sie werden es mit der Kommentartabelle wirklich schwer haben. Wir müssen etwas verwenden, von dem wir wissen, dass es nirgendwo in der StackOverflow-Datenbank verwendet wird. Sie könnten newid (), Raketenschiffe und Kulleraugen verwenden oder Sie könnten Ihren Lieblingskinderreim verwenden. Alles, solange es noch nicht auf StackOverflow ist.
Hier ist das Skript:
Beachten Sie, dass ich die Sicherheit aktiviert habe, falls Sie sie gerade eingefügt und F5 gedrückt haben. Nicht, dass das jemals jemand tun würde, oder? exec sp_executesql @sql wird erst ausgeführt, wenn Sie die Kommentatoren entfernen. Ich habe auch eine Top 10000 aufgenommen.
Gehen Sie zu Ihrem Dateipfad, und Sie sollten eine Reihe von Textdateien sehen.
Öffnen Sie eine und ändern Sie einige Daten. Wenn Sie der Meinung sind, dass das manuelle Öffnen für Bauern bestimmt ist, können Sie mit Fart.exe alle Textdateien suchen und ersetzen.
Erstellen Sie eine neue Datenbank.
Wir werden die Neuerstellung der Header-Tabelle hart codieren und sie verwenden, um den Rest neu zu erstellen.
Header wiederherstellen:
Und jetzt werden wir unser Schema in Massen in HeaderTable einfügen:
Und hier wird es wieder cool. Wir werden HeaderTable durchlaufen und jede Tabelle neu erstellen, wobei die Create-Anweisung mit STUFF () verkettet wird. Fragen Sie mich nicht, wie stuff () funktioniert - ein alter Mitarbeiter (Mike Ignatoski) hat mir das vor Jahren gegeben. Zuverlässige Quellen sagen, er habe es ursprünglich von einem Typen namens Solomon bekommen.
Und da haben Sie es - Ihre Datenbank wurde aus Textdateien wiederhergestellt. Sie können die .bak-Datei auf den Müllhaufen der Geschichte legen! Solange Sie keine Funktionen, gespeicherten Prozeduren, Ansichten, Einschränkungen oder Indizes haben.
Hier sind die vollständigen Skripte: Bad Idea Jeans Backup:
Bad Idea Jeans Restore:
quelle