T-SQL-Skript zum Kopieren einer Datenbank

7

Ich möchte eine T-SQL-Skript-basierte Möglichkeit finden, meine "PROD" -Datenbank (die schreibgeschützt ist und aus mehreren Dateigruppen besteht) in eine lesbare / beschreibbare "EDIT" -Datenbank zu kopieren, in der ich Daten verwenden und bearbeiten kann .

Ich kenne den Assistenten zum Kopieren von Datenbanken und verwende ihn derzeit. Ich würde dies jedoch lieber automatisieren, damit ein einzelnes Skript die PROD-Datenbank aus einer Sicherung wiederherstellen und auch in die EDIT-Datenbank kopieren kann.

Es scheint, dass es in T-SQL keinen Befehl "COPY DATABASE" gibt, und ich kann auch keinen anderen Weg finden, um dies zu erreichen - abgesehen davon, dass die Sicherung zweimal wiederhergestellt wird. "Ja wirklich?" Gibt es keinen besseren Weg, dies zu tun?

Was ich tun möchte, ist Folgendes:

  1. Starten Sie die Wiederherstellung von der Festplatte in "MyPROD_Database".
  2. Nachdem ich fertig bin, möchte ich die Datenbank, die ich gerade wiederhergestellt habe, in "MyEDIT_Database" kopieren.
  3. Als letzten Schritt möchte ich die Dateigruppen meiner PROD-Datenbank auf schreibgeschützt setzen

Am besten alles in einem T-SQL-Skript, das ich von SSMS und / oder sqlcmd ausführen kann.

Das System ist SQL Server 2005 (von wo die Sicherung stammt) und SQL Server 2008 (von wo ich wiederherstelle).

Der Handschuh ist da draußen - wer wird ihn abholen? :-)

Marc

marc_s
quelle

Antworten:

3

SSIS verfügt über eine Kopierdatenbankfunktion, sodass Sie Ihr T-SQL über SSIS ausführen müssen. Anschließend können Sie eine Kopierdatenbank als Schritt in diesem Prozess verwenden.

Yishai
quelle
+1 - interessante Infos! Ich weiß natürlich nicht genug, was SSIS bietet - Zeit, SSIS aufzufrischen!
marc_s
Amazon erlaubt SSIS nicht in ihrem RDS SQL Server FWIW :(
micahhoover
7

Der SQL Server-Veröffentlichungsassistent kann mit Befehlszeilenargumenten automatisiert werden.

Von der Hilfeseite

Der folgende Befehl schreibt die FooDB-Datenbank von der Standardinstanz auf einem Computer namens MYSERVER mithilfe der SQL Server-Authentifizierung mit dem Benutzernamen "Alice" und dem Kennwort "7h92-v6k3" in die Datei C: \ FooDB.sql:

sqlpubwiz script -d FooDB -S MYSERVER -U Alice -P 7h92-v6k3 C:\FooDB.sql

Sobald Sie dieses Skript haben, können Sie es mit SQLCMD auf Ihrer anderen Datenbankinstanz ausführen .

sqlcmd -S MYSERVER -U Alice -P 7h92-v6k3 -i C:\FooDB.sql -o 
Bob
quelle
Ich hoffe das sind gefälschte Passwörter ;-)
splattne
1
Sie stammen von der Beispielseite des SQL Server-Veröffentlichungsassistenten, also denke ich, aber wer weiß das schon?
Bob
Kann ich den SQL Server Publishing-Assistenten mitten in einem T-SQL-Skript aufrufen? Ich muss (a) die PROD-Datenbank wiederherstellen, dann (b) sie in EDIT kopieren und dann (c) den PROD auf schreibgeschützt setzen, wenn möglich in einem Skript
marc_s
Sie sollten eine Batchdatei erstellen, um alle Ihre SQL-Skripte auszuführen.
Bob
@ Bob - ja, das könnte eine Möglichkeit sein - danke für den Tipp.
marc_s
2

Wenn der Login, auf dem das Skript ausgeführt wird, über Systemadministratorrechte verfügt, können Sie Folgendes tun:

  • Stellen Sie die PROD-Datenbank wieder her
  • Trennen Sie die PROD-Datenbank
  • Kopieren Sie die Dateien der PROD-Datenbank mit xp_cmdshell
  • Hängen Sie die PROD-Datenbank mit den Originaldateien an
  • Hängen Sie die EDIT-Datenbank mit den kopierten Dateien an

Wenn Sie entweder SQLCMD oder den SQLCMD-Modus von Management Studio verwenden können, um das Skript auszuführen, können Sie auch SQLCMDs nutzen !! Syntax zum Ausführen eines Betriebssystembefehls zum Kopieren der Dateien.

In jedem Fall müssen Sie (und auch der Kopierdatenbank-Assistent) die PROD-Datenbank offline schalten, um die Kopie zu erstellen. Wenn dies keine Option ist, können mehrere Wiederherstellungen Ihre einzige Wahl sein.

Ed Leighton-Dick
quelle
+1 interessanter Gedanke - ich muss das überprüfen.
marc_s
Würde diese Lösung funktionieren?
Germstorm
1

Kann dies helfen: http://www.codeproject.com/KB/database/ScriptDatabase.aspx

Schreiben Sie Ihre gesamte Datenbank einschließlich der SQL Insert-Anweisungen zum Importieren von Daten in die Datenbank aus.

Andrija
quelle
Ich bezweifle, dass dies wirklich machbar und schneller sein wird, als zweimal 5,5 GB Daten wiederherzustellen ......
marc_s
1

Dies könnte nützlich sein:

SQL Multiscript

Der Kegel der Stille
quelle
1

Viel schneller und einfacher eine Sicherung / Wiederherstellung durchzuführen:

SqlCmd -E -S localhost -Q "BACKUP DATABASE mydb TO DISK='c:\temp\mydb.bak'"
REM Make Sure connections are closed
SqlCmd -E -S localhost -Q "ALTER DATABASE PIDataCopy SET SINGLE_USER WITH ROLLBACK AFTER 60"
SqlCmd -E -S localhost -Q "RESTORE DATABASE PIDataCopy FROM DISK='c:\temp\mydb.bak WITH MOVE  'mydb_Data' TO 'C:\SQLData\PIDataCopy_Data', MOVE 'mydb_Log' TO 'C:\SQLData\PIDataCopy_Log', RECOVERY,REPLACE"
SqlCmd -E -S localhost -Q "ALTER DATABASE PIDataCopy SET MULTI_USER"
Bruce
quelle