2009-01-14 7 views
16

Ich habe meine Entwicklungsdatenbank, ich möchte ein Duplikat zum Testen ausgliedern. Ich möchte das oft machen.SQL 2005 - schnelle Möglichkeit, eine Datenbank + Daten schnell zu duplizieren

Was ist der schnellste und einfachste Weg, dies oft zu tun? Ich kann den Job erledigen, indem ich Skripte mit Daten erzeuge, aber ich habe das Gefühl, dass es einen besseren Weg geben muss. Sollte ich Datenbank 1 sichern und dann mit ihr herumschrauben, damit ich sie als einen anderen Namen wiederherstellen kann?

Antwort

14

Trennen Sie die Datenbank, kopieren Sie die .MDF-Datei (und .ldf-Datei), und Sie können beide anfügen. Oder nur einen, um einen als Kopie für eine schnelle Kopie später zu behalten.

Der Befehl "Copy database" von Mcirosoft SQL Server Management Studio kann auch so funktionieren.

Sie können dies einfach automatisieren/scripten, indem Sie PowerShell oder nur .Cmd-Dateien mit Aufrufen von osql verwenden.

+1

Nun, das schnell war –

2

Sie können auch die Benutzeroberfläche von SQL Management Studio verwenden, um eine Dateisicherung zu erstellen und sie dann in einer neuen Datenbank auf demselben oder einem anderen Server wiederherzustellen.

+0

einfach im Auge behalten, zu sehen, wo Der Wiederherstellungsvorgang versucht, die MDF- und LDF-Dateien zu speichern (achten Sie darauf, Dateien zu überschreiben, die nicht überschrieben werden sollen) ... –

+0

Wenn ich versuche, eine andere Datenbank wiederherzustellen, erhalte ich einen Fehler: "Die Sicherung Set enthält eine Sicherungskopie einer anderen als der vorhandenen Datenbank bname 'database " – Kip

+1

Dort gibt es eine Checkbox, die es erlaubt, von einem Backup wiederherzustellen, das von einem anderen Server stammt. Ich habe momentan keinen Zugriff auf die Bildschirme und es ist an einer anderen Stelle, je nachdem welche Version du hast .. Aber achten Sie auf die Checkbox-Option –

2

In SQL 2005, würde ich sagen, ist der schnellste Weg zum Kopieren von Datenbanken zu verwenden ist, unter Database -> Aufgaben

Die Quelle und das Ziel kann das gleiche sein, und es kann Sie die Datenbank umbenennen, falls gewünscht.

+0

Welchen SQL Server sprechen Sie? Es gibt keine solche Option. -1'd – Fandango68

+0

Wenn Sie also mit der rechten Maustaste auf eine Datenbank klicken und zu Aufgaben wechseln, wird die Option Datenbank kopieren nicht im unteren Bereich des Kontextmenüs angezeigt. Es ist eine Weile her, seit ich diese Antwort gepostet habe, also bin ich mir nicht sicher, ob ich Express oder Standard verwende. Welche Edition verwendest du? – cmsjr

+0

Das stimmt. Alles, was ich sehe, ist Trennen .., Shink, Sichern, Wiederherstellen, Skripte generieren. Ich verwende SQL Server 2005 Standard (nicht Express). – Fandango68

0

Ich würde Skripte verwenden, da dies die Transparenz dessen, was Sie tun, hilft.
(Vor allem, wenn man es oft tun wollen, da Änderungen jeder leicht unterschiedlich Daten haben werden.)

Allerdings, wenn Sie die Skripte zu erstellen nicht, um den Streit gehen wollen, ist der einfachste Weg, sichern und dann auf einen anderen Namen wiederherstellen.

0

Wenn Sie ein Skript erstellen möchten, können Sie Folgendes verwenden. Dies ist auch am besten, wenn Sie nicht die db offline nehmen können:

USE master 
GO 

-- the original database (use 'SET @DB = NULL' to disable backup) 
DECLARE @DB varchar(200) 
SET @DB = 'PcTopp' 

    -- the backup filename 
DECLARE @BackupFile varchar(2000) 
SET @BackupFile = 'c:\pctopp\sqlserver\backup.dat' 

-- the new database name 
DECLARE @TestDB varchar(200) 
SET @TestDB = 'TestDB' 

-- the new database files without .mdf/.ldf 
DECLARE @RestoreFile varchar(2000) 
SET @RestoreFile = 'c:\pctopp\sqlserver\backup' 


-- **************************************************************** 
--     no change below this line 
-- **************************************************************** 


DECLARE @query varchar(2000) 

DECLARE @DataFile varchar(2000) 
SET @DataFile = @RestoreFile + '.mdf' 

DECLARE @LogFile varchar(2000) 
SET @LogFile = @RestoreFile + '.ldf' 

IF @DB IS NOT NULL 
BEGIN 
    SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''') 
    EXEC (@query) 
END 

-- RESTORE FILELISTONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE HEADERONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE LABELONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE VERIFYONLY FROM DISK = 'C:\temp\backup.dat' 

IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB) 
BEGIN 
    SET @query = 'DROP DATABASE ' + @TestDB 
    EXEC (@query) 
END 

RESTORE HEADERONLY FROM DISK = @BackupFile 
DECLARE @File int 
SET @File = @@ROWCOUNT 

DECLARE @Data varchar(500) 
DECLARE @Log varchar(500) 

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''') 

CREATE TABLE #restoretemp 
(
LogicalName varchar(500), 
PhysicalName varchar(500), 
type varchar(10), 
FilegroupName varchar(200), 
size int, 
maxsize bigint 
) 
INSERT #restoretemp EXEC (@query) 

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D' 
SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L' 

PRINT @Data 
PRINT @Log 

TRUNCATE TABLE #restoretemp 
DROP TABLE #restoretemp 

IF @File > 0 
BEGIN 
    SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') + 
     ' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' + 
     QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = ' + CONVERT(varchar, @File) 
    EXEC (@query) 
END 
GO 

Kopiert von: http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx

0

der Beitrag oben SQL 2005 - quick way to quickly duplicate a database + data Werken ...

aber wenn ur SQL Server 2008 R2 zum Beispiel verwendet wird, kann u eine leichte mod auf dem "create table #restoretemp" Teil, weil die Rückkehr benötigt von "restore filelistonly ..." hat sich seit ... geändert

im Grunde fügen Sie diese nach „maxsize bigint“

maxsize bigint, 
fileid bigint, 
createlsn numeric(26), 
droplsn numeric(26), 
uniqueid uniqueidentifier, 
readonlylsn numeric(26), 
readwritelsn numeric(26), 
BackupSizeInBytes bigint, 
SourceBlockSize int, 
FileGroupId int, 
LogGroupGUID uniqueidentifier, 
DifferentialBaseLSN numeric(26), 
DifferentialBaseGUID uniqueidentifier, 
IsReadOnly bit, 
IsPresent bit, 
TDEThumbprint varbinary(40) 

und u wird mit dem Arbeits Skript unten am Ende ...

USE master 
GO 

-- the original database (use 'SET @DB = NULL' to disable backup) 
DECLARE @DB varchar(200) 
SET @DB = 'source_db_name' 

-- the backup filename 
DECLARE @BackupFile varchar(2000) 
SET @BackupFile = 'D:\somewhere\DB\backup.dat' 

-- the new database name 
DECLARE @TestDB varchar(200) 
SET @TestDB = 'boon_db' 

-- the new database files without .mdf/.ldf 
DECLARE @RestoreFile varchar(2000) 
SET @RestoreFile = 'D:\somewhere\DB' 


-- **************************************************************** 
--     no change below this line 
-- **************************************************************** 


DECLARE @query varchar(2000) 

DECLARE @DataFile varchar(2000) 
SET @DataFile = @RestoreFile + '.mdf' 

DECLARE @LogFile varchar(2000) 
SET @LogFile = @RestoreFile + '.ldf' 

IF @DB IS NOT NULL 
BEGIN 
    SET @query = 'BACKUP DATABASE ' + @DB + ' TO DISK = ' + QUOTENAME(@BackupFile, '''') 
    EXEC (@query) 
END 

-- RESTORE FILELISTONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE HEADERONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE LABELONLY FROM DISK = 'C:\temp\backup.dat' 
-- RESTORE VERIFYONLY FROM DISK = 'C:\temp\backup.dat' 

IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB) 
BEGIN 
    SET @query = 'DROP DATABASE ' + @TestDB 
    EXEC (@query) 
END 

RESTORE HEADERONLY FROM DISK = @BackupFile 
DECLARE @File int 
SET @File = @@ROWCOUNT 

DECLARE @Data varchar(500) 
DECLARE @Log varchar(500) 

SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''') 

CREATE TABLE #restoretemp 
(
LogicalName varchar(500), 
PhysicalName varchar(500), 
type varchar(10), 
FilegroupName varchar(200), 
size int, 
maxsize bigint, 
fileid bigint, 
createlsn numeric(26), 
droplsn numeric(26), 
uniqueid uniqueidentifier, 
readonlylsn numeric(26), 
readwritelsn numeric(26), 
BackupSizeInBytes bigint, 
SourceBlockSize int, 
FileGroupId int, 
LogGroupGUID uniqueidentifier, 
DifferentialBaseLSN numeric(26), 
DifferentialBaseGUID uniqueidentifier, 
IsReadOnly bit, 
IsPresent bit, 
TDEThumbprint varbinary(40) 
) 
INSERT #restoretemp EXEC (@query) 

SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D' 
SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L' 

PRINT @Data 
PRINT @Log 

TRUNCATE TABLE #restoretemp 
DROP TABLE #restoretemp 

IF @File > 0 
BEGIN 
    SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM DISK = ' + QUOTENAME(@BackupFile, '''') + 
     ' WITH MOVE ' + QUOTENAME(@Data, '''') + ' TO ' + QUOTENAME(@DataFile, '''') + ', MOVE ' + 
     QUOTENAME(@Log, '''') + ' TO ' + QUOTENAME(@LogFile, '''') + ', FILE = ' + CONVERT(varchar, @File) 
    EXEC (@query) 
END 
GO 
Verwandte Themen