2009-01-14 3 views
16

У меня есть моя база данных разработки, я хочу выделить дубликат для тестирования. Я хочу делать это часто.SQL 2005 - быстрый способ быстро дублировать базу данных + данные

Какой самый быстрый и простой способ сделать это часто? Я могу выполнить эту работу, создав сценарии с включенными данными, но я чувствую, что должен быть лучший способ. Должен ли я создать резервную копию базы данных 1, а затем обернуть ее, чтобы я мог восстановить ее как другое имя?

ответ

14

Отсоедините базу данных, скопируйте файл .MDF (и файл .ldf), и вы можете прикрепить оба. Или только один, чтобы сохранить его как копию для быстрой копии позже.

Команда «Копировать базу данных» из Mcirosoft SQL Server Management Studio также может работать следующим образом.

Вы можете легко автоматизировать/сценарий, используя PowerShell или просто файлы .Cmd с вызовами osql.

+1

Ну это было быстро –

2

И вы также можете использовать интерфейс SQL Management Studio для создания резервной копии файла, а затем восстановить его в новую базу данных на том же или любом другом сервере.

+0

Просто имейте в виду, чтобы посмотреть, где операция восстановления пытается поместить файлы mdf и ldf (следите за тем, чтобы они перезаписывали файлы, которые вы не хотите перезаписывать) ... –

+0

Когда я пытаюсь восстановить другую базу данных, я получаю сообщение об ошибке: «Резервное копирование set содержит резервную копию базы данных, отличной от существующей 'd bname «database» – Kip

+1

Там есть флажок, который позволяет вам восстанавливать резервную копию, взятую с другого сервера. У меня нет доступа к экранам прямо сейчас, и он находится в другом месте, в зависимости от того, какая версия у вас есть. . но посмотрите на этот флажок. –

2

В SQL Server 2005, я бы сказал, что самый быстрый способ заключается в использовании копирование базы данных, в соответствии с базой данных -> Задачи

источника и назначения могут быть одинаковыми, и это позволяет переименовать базу данных, если это необходимо.

+0

О каком SQL Server вы говорите? Такого варианта нет. -1'd – Fandango68

+0

Итак, когда вы щелкаете правой кнопкой мыши базу данных и переходите к задачам, вы не видите Копировать базу данных в нижней части контекстного меню? Прошло некоторое время с тех пор, как я опубликовал этот ответ, поэтому я не уверен, использовал ли я Экспресс или Стандарт. Какое издание вы используете? – cmsjr

+0

Правильно. Все, что я вижу, это Detach .., Shink, Back Up, Restore, Generate Scripts. Я использую SQL Server 2005 Standard (не Express). – Fandango68

0

Я бы использовал сценарии, поскольку это помогает прозрачности того, что вы делаете.
(Особенно, если вы хотите делать это часто, так как изменения, каждый из них будет иметь немного разные данные.)

Однако, если вы не хотите идти к хлопот создания сценариев, самым простым способом является резервное копирование, а затем восстановить другое имя.

0

Если вы хотите выполнить его сценарий, вы можете использовать следующее. Это также лучше, если вы не можете взять дб автономно:

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 

, скопированные из: http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx

0

еще один вариант, чтобы бросить в,

Вот запись в блоге, что говорит об использовании базы данных Publishing Wizard и как он используется для экспорта всех элементов базы данных, включая данные, в файл SQL. Может быть полезно и кажется довольно простым.

http://blog.sqlauthority.com/2007/11/16/sql-server-2005-generate-script-with-data-from-database-database-publishing-wizard/

0

пост выше SQL 2005 - quick way to quickly duplicate a database + data работ ...

но если уры с помощью SQL Server 2008 R2, например, у может потребоваться некоторые моды на часть «создать таблицу #restoretemp», потому что возвращение от "restore filelistonly ..." изменилось с ...

в основном добавить это после того, как «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) 

и и в конечном итоге с рабочего сценария ниже ...

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 
Смежные вопросы