Как клонировать базу данных SQL Server на том же сервере в SQL Server 2008 Express?

У меня есть система MS SQL Server 2008 Express, которая содержит базу данных, которую я хотел бы "скопировать и переименовать" (для целей тестирования), но я не знаю простого способа достичь этого.

Я замечаю, что в версии R2 SQL Server есть мастер копирования базы данных, но, к сожалению, я не могу обновить.

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

13 ответов


  1. установите Microsoft SQL Management Studio, вы можете скачать его бесплатно с веб-сайта Microsoft:

    версия 2008

    Microsoft SQL Management Studio 2008 является частью SQL Server 2008 Express с расширенными службами

    версия 2012

    клик скачать и проверьте ENU\x64\SQLManagementStudio_x64_ENU.exe

    версия

    клик скачать и проверьте MgmtStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. откройте Microsoft SQL Management Studio

  3. резервное копирование исходной базы данных в файл (db -> Task -> Backup).
  4. создать пустую базу данных с новым именем (клон).
  5. Нажмите, чтобы клонировать базу данных и открыть диалог восстановления (см. изображение) restore dialog
  6. выберите устройство и добавьте файл bakcup с шага 1. add backup file
  7. изменить назначение на тестовую базу данных change destination
  8. изменить расположение файлов базы данных, оно должно отличаться от исходного. Вы можете ввести непосредственно в текстовое поле, просто добавьте постфикс. (Примечание: порядок важен. Установите флажок, затем измените имена.) change location
  9. проверьте с помощью REPLACE и KEEP_REPLICATION with replace

щелкните правой кнопкой мыши базу данных для клонирования, нажмите кнопку Tasks, нажмите кнопку Copy Database.... Следуйте за мастером, и вы закончите.


вы можете попытаться отсоединить базу данных, скопировать файлы в новые имена в командной строке, а затем присоединить оба DBs.

В SQL:

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

в командной строке (я упростил пути к файлам для этого примера):

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

В 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

оказывается, я пытался восстановить из резервной копии неправильно.

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

короче говоря, восстановление из резервной копии сделало трюк.

Спасибо за все отзывы и предложения ребята


это скрипт, который я использую. Немного сложно, но это работает. Протестировано на 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

используя MS SQL Server 2012, необходимо выполнить 3 основных шага:

  1. во-первых, создать .sql файл, содержащий только структуру исходного DB

    • щелкните правой кнопкой мыши на БД, а потом задачи затем Сформировать Сценарии
    • следуйте за мастером и сохраните локально
  2. во-вторых, замените исходную БД на целевую в

    • щелкните правой кнопкой мыши на файл назначения, выберите Новый Запрос и Ctrl-H или (редактировать - найти и заменить - быстрая замена)
  3. наконец, заполнить данными

    • Правой Кнопкой Мыши на целевой БД, затем выберите задачи и Импорт Данных
    • источник данных выпадающее значение "поставщик данных .net framework для SQL server " + установите текстовое поле строки соединения под данными ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • сделать то же самое с пунктом
    • проверьте таблицу, которую вы хотите перенести, или установите флажок " источник: ...- проверить их всех!--16-->

вы сделали.


в SQL Server 2008 R2 резервное копирование базы данных в виде файла в папку. Затем выберите опцию восстановления, которая появляется в папке "база данных". В Мастере введите новое имя, которое требуется в целевой базе данных. И выберите восстановить файл frrom и использовать файл, который вы только что создали. Я jsut сделал это, и это было очень быстро (мой DB был маленьким, но все же) Пабло.


ни одно из решений, упомянутых здесь, не работало для меня - я использую SQL Server Management Studio 2014.

вместо этого мне пришлось снять флажок "take tail-log backup before restore" на экране "параметры": в моей версии он установлен по умолчанию и предотвращает завершение операции восстановления. После снятия флажка операция восстановления прошла без проблем.

enter image description here


если база данных не очень велика, вы можете посмотреть команды "база данных сценариев" в SQL Server Management Studio Express, которые находятся в контекстном меню самого элемента базы данных в проводнике.

вы можете выбрать, что все для сценария; вы хотите объекты и данные, конечно. Затем вы сохраните весь сценарий в один файл. Затем вы можете использовать этот файл для повторного создания базы данных; просто убедитесь, что вверху "правильные" база данных.


другой способ, который делает трюк с помощью мастер импорта/экспорта, выберите источник-это ваш сервер с исходной базой данных, а затем в пункте назначения выберите тот же сервер с целевой базой данных (сначала вам нужно создать пустую базу данных), затем нажмите finish

он создаст все таблицы и перенесет все данные в новую базу данных,


решение, основанное на этом комментарии:https://stackoverflow.com/a/22409447/2399045 . Просто установите настройки: имя БД, папка temp, папка db files. А после запуска у вас будет копия БД с именем в формате "sourcedbname_yyyyy-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

скрипт, основанный на ответе Джо (отсоединить, скопировать файлы, прикрепить оба).

  1. запустите Managment Studio как учетную запись администратора.

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

  1. настройка sql server для выполнения xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. запустите скрипт, но введите свои имена БД в @dbName и @copyDBName переменные перед.
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

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