Neuerstellung einer gesamten Microsoft SQL Server-Datenbank


7

Gibt es eine vorgeschlagene Möglichkeit, eine gesamte SQL Server-Datenbank aus einer anderen Datenbank in SQL Server 2012 SP2 neu zu erstellen?

Lassen Sie mich erklären ... Wir haben eine Datenbank, für die wir versuchen, eine teilweise Eindämmung zu aktivieren, und fügen sie dann unserem AlwaysOn-Cluster hinzu. Beim Versuch, das Containment auf partiell zu setzen, werden nur Deadlock-Fehler angezeigt. Die Datenbank wurde von SQL Server 2008 über 2008R2 bis 2012 (kein SP, SP1, SP2) geändert und hatte für eine Weile TDE.

Der Microsoft-Support hat sich schon seit einigen Tagen damit befasst, aber es sieht nicht sehr vielversprechend aus, und ich denke, wir neigen jetzt zu einer Form von Korruption. Unsere Anwendung und alles andere scheint immer noch in der Lage zu sein, problemlos darauf zuzugreifen. Es wird nur gesetzt, dass dieses eine kleine Flag nicht funktioniert. Sehr seltsames Problem.

Die einzige Referenz, die ich online gefunden habe und die genau das gleiche Problem zeigt, stammt aus einem Beitrag des Technet-Forums auf Portugiesisch ( übersetzter Link ), der jedoch nie behoben wurde.

Zu diesem Zeitpunkt kann ich nicht länger warten und möchte diese Daten nur in einer neuen Datenbank neu erstellen. Ich nehme an, ich könnte das Ganze ausschreiben, aber diese Datenbank hat bereits etwa 20 GB, das wäre also ein böses Skript.

Hat jemand einen Vorschlag, wie eine neue Datenbank basierend auf einer anderen Datenbank neu erstellt werden kann - ohne die standardmäßige Sicherung / Wiederherstellung? Ist das Schreiben von Skripten der richtige Weg?


Wahrscheinlich eine dumme Frage, aber haben Sie die Datenbank vor der Änderung auf den Einzelbenutzermodus eingestellt?
Max Vernon

Eine andere dumme Frage: Sind alle Überreste von TDE verschwunden? Alle?
Sean Gallardy - Pensionierter Benutzer

1
@ MaxVernon Ich hätte das erwähnen sollen - ja, das habe ich und das macht leider keinen Unterschied. Dies ist ein sehr seltsames Problem. Nach dem, was ich gesehen habe, klingt diese Einstellung wirklich nicht mehr als ein einfaches Flag in der Datenbank (bitte korrigieren Sie mich, wenn ich falsch liege), und die Tatsache, dass wir diesen Fehler erhalten, hat MS nicht gesehen bevor es sich anhört.
Adam Plocher

@ SeanGallardy Ich bin mir wirklich nicht sicher. Ich war derjenige, der TDE entfernt hat, aber es war vor so vielen Jahren und ich habe ehrlich gesagt keine Erfahrung damit. Es ist möglich, dass ich nicht alles entfernt habe ... Ich wünschte, ich könnte mich daran erinnern, was ich getan habe ... Die DB funktioniert in PROD seit Jahren einwandfrei. Dies ist das erste seltsame Problem, das wir gesehen haben.
Adam Plocher

@AdamPlocher Ich habe die Schritte HIER mit Skripten für BCP OUT und BCP IN beschrieben. Das wird viel schneller gehen. Überprüfen Sie, ob es in Ihrer Situation hilft.
Kin Shah

Antworten:


8

Verwenden Sie SSMS, um Skripts für die gesamte Datenbank-DDL zu generieren.

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie das Skript, um eine neue, leere Datenbank zu erstellen.

Verwenden Sie BCPdiese Option, um die Daten aus allen Tabellen zu exportieren. Verwenden Sie BCPdiese Option, um diese Daten in die neue Datenbank zu importieren.

BACKUP , dass Sie die Original - Datenbank , bevorDROPinges (wenn Sie inTatAbsichtes überhaupt fallen zu lassen). Stellen Sie sicher, dass Sie das Backup wiederherstellen.


1
Vielen Dank, Max. Ich werde es heute Abend außerhalb der Öffnungszeiten versuchen. Ich denke, das wird funktionieren, aber ich werde Sie in ein paar Stunden sicher informieren :)
Adam Plocher

Stellen Sie sicher, dass Sie alle Objekte auf Serverebene wie Anmeldungen skripten, die Sie benötigen, wenn Sie die neue Datenbank auf einen neuen Server verschieben.
Max Vernon

1
Ich würde die Tabellenstruktur skripten, die Daten importieren und dann die Datenbankstruktur synchronisieren - Fremdschlüssel, Indizes, Prozesse und so weiter.
jmoreno

1
Hallo Max, entschuldige, dass du nicht auf dich zurückgekommen bist. Ich habe mit mehreren ungültigen Objekten gekämpft (Prozesse mit Verweisen auf ungültige Felder usw.) und hatte einige Probleme, bcp.exe dazu zu bringen, das zu tun, was ich wollte. Ich bin kurz davor, etwas zu haben, das hoffentlich funktioniert ... Ich möchte nur bestätigen, dass es funktioniert, werde es aber als Antwort markieren, sobald ich es tue (hoffentlich heute)
Adam Plocher

1
Nochmals vielen Dank Max. Ich bin noch nicht zu 100% fertig - und es hat ein wenig gedauert, aber Sie haben meine Hauptfrage beantwortet: Soll ich das Schema skripten und dann die Daten importieren? Am Ende habe ich den SQL-Import-Assistenten für die meisten datenbezogenen Elemente verwendet, aber das lag hauptsächlich an meinem Unverständnis mit bcp.exe. Es waren so viele Daten, zu viele Versuche und Fehler haben einfach zu lange gedauert, aber ich weiß, dass es funktioniert hätte, wenn ich daran festgehalten hätte, also ist es definitiv eine gültige Antwort für zukünftige Leute, die dies finden. Ich habe ein Skript erstellt, Einschränkungen gelöscht, mit dem Import-Assistenten importiert und Einschränkungen mit einem SQL Compare-Diff neu erstellt. Danke!
Adam Plocher

5

Um die Skriptaufgabe erheblich zu vereinfachen, können Sie auch Tools von Drittanbietern verwenden. MSVisualStudio verfügt sowohl über ein Schema- als auch über ein Datenvergleichstoolset. Ich persönlich bevorzuge das SQLCompare-Tool von RedGate.

Ich verwende diese Art von Tools auch ständig, um DEV-> QA-> PROD-Bereitstellungen zu vereinfachen. Sobald das Schema eingerichtet ist, führen Sie einen einfachen "Datenimport-Assistenten" aus, um die Daten nach Bedarf zu kopieren.

Die positive Seite der Verwendung dieser Tools besteht darin, dass sie intelligenter sind, wenn Sie die Skripte erstellen, Elemente in die richtige Erstellungsreihenfolge bringen, Sie vor möglichen Fehlern warnen, nur Elemente erstellen, die Sie erstellen / aktualisieren müssen, und Serverelemente einschließen, die Sie möglicherweise vergessen, wann Verwenden Sie nur das DBscripting-Tool, z. B. Anmeldungen oder Verbindungsserver oder Sicherheit.


Danke Philippe. Am Ende habe ich Kombinationen aus SQL Compare / Data Compare verwendet (das sind zwei für mich unverzichtbare Tools), aber das Data Compare-Tool ist für große Datenmengen wirklich nicht praktisch. Der schnellste Prozess, den ich gefunden habe, bestand darin, Einschränkungen zu löschen und den Datenimport-Assistenten mit aktiviertem IDENTITY INSERT (in den Wiz-Optionen) zu verwenden. Verwendet SQL Compare, um Einschränkungen nachher neu zu generieren. Es war eine Million Mal schneller und füllte mein C: -Laufwerk nicht aus (wo sich% TEMP% befindet). Unsere C: -Partition ist nicht so massiv wie unsere Daten- / Protokollpartitionen.
Adam Plocher

1

Es gibt eine andere Möglichkeit, eine gesamte MS SQL-Datenbank neu zu erstellen.

Schritt 1: Verwenden Sie ein Skript, um Daten aller Tabellen von der alten in die neue Datenbank zu kopieren.

Declare @OldDBName Varchar(200)
Declare @NewDBName Varchar(200)

Select @OldDBName='OldDB',@NewDBName='NewDB'

    Select 'Select * into '+@NewDBName+'.'+sc.name+'.'+tbl.Name+ ' From '+@OldDBName+'.'+sc.name+'.'+tbl.Name
    from sys.tables tbl inner join sys.schemas sc on sc.schema_id=tbl.schema_id
     where type='U'

Schritt 2: Wenden Sie alle Arten von Einschränkungen auf Tabellen der neuen Datenbank an.
1. Primärschlüssel
2. Fremdschlüssel
3. Standardbeschränkungen
4. Berechnete Spalten
5. Identitäten
6. Indizes

Hinweis: Sie finden diese Skripts zur Einschränkungssynchronisierung auf Connectsql.com ( http://www.connectsql.com/2013/11/sql-server-database-sychronization_29.html?utm_source=BP_recent ).

Schritt 3: Generieren Sie ein Skript für Objekte über SSMS und führen Sie es in der neuen Datenbank aus.
1. Generieren Sie ein Funktionsskript über SSMSS und führen Sie es in der neuen Datenbank aus.
2. Generieren Sie das Views-Skript über SSMSS und führen Sie es in der neuen Datenbank aus.
3. Generieren Sie ein Skript für gespeicherte Prozeduren über SSMSS und führen Sie es in der neuen Datenbank aus.
4. Generieren Sie ein Triggerskript über SSMSS und führen Sie es in der neuen Datenbank aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.