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


272

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

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

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


2
Восстановление резервной копии должно работать. Можете ли вы предоставить более подробную информацию о том, как это не удалось?
Эд Харпер

7
Я понял, что сделал ошибку при восстановлении из резервной копии. Сначала я создал новую пустую БД и попытался восстановить резервную копию оттуда. То, что я должен был сделать, это вызвать диалоговое окно восстановления и ввести имя новой базы данных, а не создавать его сначала. Делая это хорошо клонировали базу данных!
Серхио

Ответы:


372
  1. Установите Microsoft SQL Management Studio, которую можно бесплатно загрузить с веб-сайта Microsoft:

    Версия 2008

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

    Версия 2012

    Нажмите кнопку загрузки и проверьтеENU\x64\SQLManagementStudio_x64_ENU.exe

    Версия 2014

    Нажмите кнопку загрузки и проверьте MgmtStudio64BIT\SQLManagementStudio_x64_ENU.exe

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

  3. Резервное копирование исходной базы данных в файл .BAK (db -> Task -> Backup).
  4. Создать пустую базу данных с новым именем (клон). Обратите внимание на комментарии ниже, так как это необязательно.
  5. Нажмите, чтобы клонировать базу данных и открыть диалоговое окно восстановления (см. Изображение) восстановить диалог
  6. Выберите устройство и добавьте файл резервной копии с шага 3. добавить файл резервной копии
  7. Изменить место назначения для проверки базы данных изменить пункт назначения
  8. Измените расположение файлов базы данных, оно должно отличаться от исходного. Вы можете ввести прямо в текстовое поле, просто добавьте постфикс. (ПРИМЕЧАНИЕ. Порядок важен. Установите флажок и измените имена файлов.) изменить местоположение
  9. Проверьте с REPLACE и WITH KEEP_REPLICATION с заменой

84
1. Не создавайте пустую базу данных и не восстанавливайте на ней файл .bak. 2. Используйте параметр «Восстановить базу данных», нажав правую кнопку мыши на ветке «Базы данных» в SQL Server Management Studio и укажите имя базы данных, указав источник для восстановления. ссылка: stackoverflow.com/questions/10204480/…
taynguyen

1
Microsoft SQL Management Studio - это бесплатно
Томас Кубес

4
Не работает - «Не удалось получить эксклюзивный доступ, так как база данных используется».
Эмануэле Чириачи

5
Мне также пришлось снять флажок «Резервное копирование журналов перед восстановлением». Это было проверено по умолчанию и привело к ошибке «Не удалось получить эксклюзивный доступ, так как база данных используется».
репа

3
Моя оригинальная база данных застряла на "Восстановление"
Divi Perdomo

114

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


Я думаю, что это доступно только в выпуске R2 SQL Server к сожалению :-(
Sergio

7
вот как это работает в экспрессе: stackoverflow.com/questions/4269450/…
Th 00 mÄs

2
Это не работает, если у вас есть зашифрованные объекты в вашей базе данных.
cjbarth

1
Я бы сказал, что главное на самом деле, где это сделать? То, что вы описали, довольно интуитивно понятно. Я пытался сделать это в некоторых инструментах (0xDBE, Visual Studio SQL Server Object Explorer) раньше, но там не нашел такой возможности.
Давид Ференци Рогожан

3
Невозможно! Задачи -> Нет пункта меню для копирования базы данных
raiserle

95

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

В 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

1
идеальный! это единственное решение, которое сработало для меня! большое спасибо!
Thiagoh

9
select * from OriginalDB.sys.sysfilesнайти расположение файлов БД.
JohnLBevan

Да, мне тоже нравится это решение, так как оно не требует специальных инструментов. Но я не смог создать NewDB, говорится Permission deniedв .mdfфайле. Мне это сейчас не нужно, мне просто нужна была резервная копия исходной БД, поэтому я могу позже перезаписать исходную БД, мне просто любопытно, почему я получаю такую ​​ошибку.
Дэвид Ференци Рогожан

2
Вам не нужно отсоединять исходную базу данных, если вы можете остановить службу sql, скопировать файлы mdf и ldf, переименовать их для новой базы данных, снова запустить службу sql и просто выполнить последнюю команду создания базы данных под master: USE master ; GO СОЗДАТЬ БАЗУ ДАННЫХ NewDB ON (FILENAME = 'C: \ NewDB.mdf'), (FILENAME = 'C: \ NewDB.ldf') FOR ATTACH; GO
danpop

1
+1 за самый быстрый способ. В дополнение к @JohnLBevan отличным комментарий, вы можете также использоватьexec sp_helpdb @dbname='TEMPDB';
джинсовой

30

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

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

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

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


Когда я делаю это, диалоговое окно сообщает мне, что файлы находятся в том же месте, что и база данных, из которой я изначально создавал резервные копии. Поэтому у меня нет мужества, чтобы восстановить, боясь, что файлы будут перезаписаны.
Нильс Бринч

2
Нилс, файлы по умолчанию в снимке, который вы сделали. Вы можете изменить их имена, чтобы создать новые файлы для вновь названной базы данных.
Колин Дабриц

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

Вы уже помогли мне три раза с этим ответом. Я постоянно забываю о том, чтобы набирать его, а не создавать. + пиво
Петр Кула

Это и переименование файлов .mdf и .log в окне «Файлы» сработало для меня.
Wollan

17

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

2
В моей среде имена файлов не совпадали с именем db (пришедшим из другого восстановления), поэтому мне потребовалась SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1)отдельная переменная для @sourceDb_data с аналогичным запросом (подстановка в files.type=0). НТН!
Дэн Кэсли

11

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

Вместо этого мне пришлось снять флажок «Резервное копирование журналов перед восстановлением» на экране «Параметры»: в моей версии он установлен по умолчанию и не позволяет завершить операцию восстановления. После снятия флажка операция восстановления прошла без проблем.

введите описание изображения здесь


2
Этот ответ спас мой день.
Дилхан Джаятилаке

2
Спас и мой день тоже :)
ashilon

1
Если этого не делать с SQL Server 2017, исходная база данных оставалась в «Восстановление ...». Ваше решение сработало - спасибо!
mu88

9

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

  1. Сначала создайте .sqlфайл, содержащий только структуру исходной БД

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

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

    • Щелкните правой кнопкой мыши на целевой базе данных, затем выберите Задачи и Импорт данных.
    • В раскрывающемся списке «Источник данных» выберите « Поставщик данных .NET Framework для сервера SQL » + задайте текстовое поле строки подключения в разделе «ДАННЫЕ»:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • сделать то же самое с пунктом назначения
    • отметьте таблицу, которую вы хотите перенести, или установите флажок «source: ...», чтобы проверить их все

Вы сделали.


Кстати, я полагаю, что при импорте данных можно создавать таблицы, если их нет в таблицах назначения. Простое решение +1
Хуррам Исак

6

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


4

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

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


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

2
Правильно; тогда это не лучший способ. Вместо этого вы можете использовать базу данных сценариев, чтобы просто создать структуру в новой базе данных, а затем импортировать / экспортировать, чтобы переместить данные. Просто убедитесь, что вы сначала делаете базу данных скриптов; Импорт / экспорт создаст таблицы, если они не существуют, и вам может не понравиться то, как они это делают.
Эндрю Барбер

4

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

3

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

  1. Запустите Managment Studio от имени администратора.

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

  1. Настройте сервер sql для выполнения 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

3

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


2

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.