Подтвердить что ты не робот

SQL 2005 - быстрый способ быстрого дублирования базы данных + данных

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

В SQL 2005 я бы сказал, что самым быстрым способом является использование Copy Database, в разделе Database → Tasks

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Еще одна опция для входа,

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

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

Ответ 8

пост выше SQL 2005 - быстрый способ быстрого дублирования базы данных + данных работает...

но если вы используете, например, sql server 2008 r2, вам может понадобиться небольшой мод в разделе "create table #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)

и u закончится с рабочим script ниже...

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