it-swarm.com.de

Wie kann ich eine SQL Server-Datenbank auf demselben Server in SQL Server 2008 Express klonen?

Ich habe ein MS SQL Server 2008 Express-System, das eine Datenbank enthält, die ich (zu Testzwecken) 'kopieren und umbenennen' möchte, mir ist jedoch kein einfacher Weg bekannt, dies zu erreichen.

Ich stelle fest, dass in der R2-Version von SQL Server ein Assistent zum Kopieren von Datenbanken vorhanden ist, kann aber leider kein Upgrade durchführen.

Bei der fraglichen Datenbank handelt es sich um einen Gig. Ich habe versucht, eine Sicherung der Datenbank wiederherzustellen, die ich in eine neue Datenbank kopieren möchte, aber ohne Erfolg.

242
Sergio

Es stellte sich heraus, dass ich versucht hatte, eine falsche Sicherung wiederherzustellen.

Zunächst habe ich eine neue Datenbank erstellt und dann versucht, die Sicherung hier wiederherzustellen. Was ich hätte tun sollen und was am Ende funktionierte, war, den Wiederherstellungsdialog aufzurufen und den Namen der neuen Datenbank in das Zielfeld einzugeben.

Kurz gesagt, das Wiederherstellen von einem Backup hat den Trick gemacht.

Vielen Dank für all die Rückmeldungen und Vorschläge Jungs

29
Sergio
  1. Installieren Sie Microsoft SQL Management Studio, das Sie kostenlos von der Microsoft-Website herunterladen können:

    Version 2008

    Microsoft SQL Management Studio 2008 ist Teil von SQL Server 2008 Express mit erweiterten Diensten

    Version 2012

    Klicken Sie auf Download-Button und überprüfen Sie ENU\x64\SQLManagementStudio_x64_ENU.exe

    Version 2014

    Klicken Sie auf Download-Schaltfläche und überprüfen Sie MgmtStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. Öffnen Sie Microsoft SQL Management Studio .

  3. Sichern Sie die ursprüngliche Datenbank in einer .BAK-Datei (db -> Task -> Backup).
  4. Erstellen Sie eine leere Datenbank mit neuem Namen (Klon). Beachten Sie die folgenden Kommentare, da dies optional ist.
  5. Klicken Sie, um die Datenbank zu klonen und den Wiederherstellungsdialog zu öffnen (siehe Abbildung). restore dialog
  6. Wählen Sie Gerät und fügen Sie die Sicherungsdatei aus Schritt 3 hinzu. add backup file
  7. Ändern Sie das Ziel in die Testdatenbank change destination
  8. Ändern Sie den Speicherort der Datenbankdateien. Er muss sich vom Original unterscheiden. Sie können direkt in das Textfeld eingeben, fügen Sie einfach Postfix hinzu. (HINWEIS: Die Reihenfolge ist wichtig. Aktivieren Sie das Kontrollkästchen und ändern Sie die Dateinamen.) change location
  9. Überprüfen Sie WITH REPLACE und WITH KEEP_REPLICATION with replace
331
Tomas Kubes

Klicken Sie mit der rechten Maustaste auf die zu klonende Datenbank, klicken Sie auf Tasks, klicken Sie auf Copy Database.... Folgen Sie dem Assistenten und Sie sind fertig.

107
DForck42

Sie können versuchen, die Datenbank zu trennen, die Dateien an einer Eingabeaufforderung unter neuen Namen zu kopieren und dann beide DBs anzuhängen.

In SQL:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

An der Eingabeaufforderung (ich habe die Dateipfade für dieses Beispiel vereinfacht):

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

Wieder in SQL:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO
88
Joe Stefanelli

Dies ist das Skript, das ich benutze. Ein bisschen schwierig, aber es funktioniert. Getestet unter SQL Server 2012.

DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);

SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\tmp\' + sourceDb + '.bak' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'

BACKUP DATABASE @sourceDb TO DISK = @backupPath

RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf
16
bluish

Unter Verwendung von MS SQL Server 2012 müssen Sie drei grundlegende Schritte ausführen:

  1. Generieren Sie zunächst eine .sql -Datei, die nur die Struktur der Quell-DB enthält

    • rechtsklick auf die Quelldatenbank und dann Tasks dann Generate Scripts
    • folgen Sie dem Assistenten und speichern Sie die Datei .sql lokal
  2. Zweitens ersetzen Sie die Quell-DB durch die Ziel-DB in der Datei .sql

    • Klicken Sie mit der rechten Maustaste auf die Zieldatei, wählen Sie Neue Abfrage und Ctrl-H oder (Bearbeiten - Suchen und Ersetzen - Schnelles Ersetzen)
  3. Zum Schluss füllen Sie mit Daten

    • Klicken Sie mit der rechten Maustaste auf die Ziel-DB, und wählen Sie Tasks und Import Data aus
    • Datenquellen-Dropdown-Liste auf ".net Framework-Datenprovider für SQL Server" gesetzt + das Textfeld für die Verbindungszeichenfolge unter "DATA ex: Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15" setzen
    • machen Sie dasselbe mit dem Ziel
    • aktivieren Sie die Tabelle, die Sie übertragen möchten, oder aktivieren Sie das Kontrollkästchen neben "Quelle: ...", um alle zu überprüfen

Du bist fertig.

9
Mehdi Benkirane

Keine der hier genannten Lösungen hat für mich funktioniert - ich verwende SQL Server Management Studio 2014.

Stattdessen musste ich im Bildschirm "Optionen" das Kontrollkästchen "Protokollsicherung vor Wiederherstellung durchführen" deaktivieren: In meiner Version ist es standardmäßig aktiviert und verhindert, dass der Wiederherstellungsvorgang abgeschlossen wird. Nach dem Deaktivieren des Kontrollkästchens wurde der Wiederherstellungsvorgang ohne Probleme fortgesetzt.

enter image description here

8

Sichern Sie in SQL Server 2008 R2 die Datenbank als Datei in einem Ordner. Wählen Sie dann die Wiederherstellungsoption, die im Ordner "Database" angezeigt wird. Geben Sie im Assistenten den neuen Namen ein, den Sie in der Zieldatenbank haben möchten. Wählen Sie "Aus Datei wiederherstellen" und verwenden Sie die soeben erstellte Datei. Ich habe es nur getan und es war sehr schnell (meine DB war klein, aber immer noch) Pablo.

6
pabloelustondo

Die Lösung, basierend auf diesem Kommentar: https://stackoverflow.com/a/22409447/2399045 . Legen Sie einfach die Einstellungen fest: DB-Name, temporärer Ordner, Ordner für Datenbankdateien. Und nach dem Ausführen haben Sie die Kopie der Datenbank mit dem Namen im Format "sourceDBName_yyyy-mm-dd".

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'

--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'

SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)

SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)

BACKUP DATABASE @sourceDbName TO DISK = @backupPath

RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf
4

Wenn die Datenbank nicht sehr groß ist, sehen Sie sich möglicherweise die Befehle "Skriptdatenbank" in SQL Server Management Studio Express an, die sich in einem Kontextmenü neben dem Datenbankelement selbst im Explorer befinden.

Sie können auswählen, was alle per Skript erstellt werden sollen. Sie wollen natürlich die Objekte und die Daten. Anschließend speichern Sie das gesamte Skript in einer einzelnen Datei. Anschließend können Sie diese Datei verwenden, um die Datenbank neu zu erstellen. Stellen Sie einfach sicher, dass der Befehl USE oben auf die richtige Datenbank eingestellt ist.

4
Andrew Barber

Sie können einfach eine neue Datenbank erstellen und dann zu Aufgaben gehen, Daten importieren und alle Daten aus der Datenbank, die Sie duplizieren möchten, in die soeben erstellte Datenbank importieren.

3
TheFab92

Eine andere Möglichkeit, die den Trick mithilfe von Import/Export-Assistent ausführt, besteht darin, zuerst eine leere Datenbank zu erstellen, dann die Quelle auszuwählen, die Ihr Server mit der Quellendatenbank ist, und dann im Ziel denselben Server mit der auszuwählen Zieldatenbank (mit der leeren Datenbank, die Sie zuerst erstellt haben), und klicken Sie dann auf Fertig stellen

Es werden alle Tabellen erstellt und alle Daten in die neue Datenbank übertragen.

2
Mohanad Kaleia

Skript basierend auf Joe-Antwort (Dateien trennen, kopieren, beides anhängen).

  1. Führen Sie Managment Studio als Administratorkonto aus.

Es ist nicht notwendig, aber möglicherweise Zugriff verweigert Fehler bei der Ausführung.

  1. Konfigurieren Sie den SQL Server für die Ausführung von xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. Führen Sie das Skript aus, aber geben Sie zuvor Ihre DB-Namen in die Variablen @dbName Und @copyDBName Ein.
USE master;
GO 

DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'

-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')

-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')

EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')

-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')

-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '

DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext

    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);

    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'

    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs

-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'

-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)

-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)

DROP TABLE ##DBFileNames
2
Evgeny Ivanov