Как клонировать базу данных SQL Server на том же сервере в SQL Server 2008 Express?
У меня есть система MS SQL Server 2008 Express, которая содержит базу данных, которую я хотел бы "скопировать и переименовать" (для целей тестирования), но я не знаю простого способа достичь этого.
Я замечаю, что в версии R2 SQL Server есть мастер копирования базы данных, но, к сожалению, я не могу обновить.
база данных, о которой идет речь, находится вокруг концерта. Я попытался восстановить резервную копию базы данных, которую хочу скопировать в новую базу данных, но безуспешно.
13 ответов
-
установите 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
откройте Microsoft SQL Management Studio
- резервное копирование исходной базы данных в файл (db -> Task -> Backup).
- создать пустую базу данных с новым именем (клон).
- Нажмите, чтобы клонировать базу данных и открыть диалог восстановления (см. изображение)
- выберите устройство и добавьте файл bakcup с шага 1.
- изменить назначение на тестовую базу данных
- изменить расположение файлов базы данных, оно должно отличаться от исходного. Вы можете ввести непосредственно в текстовое поле, просто добавьте постфикс. (Примечание: порядок важен. Установите флажок, затем измените имена.)
- проверьте с помощью REPLACE и KEEP_REPLICATION
щелкните правой кнопкой мыши базу данных для клонирования, нажмите кнопку 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 основных шага:
-
во-первых, создать
.sql
файл, содержащий только структуру исходного DB- щелкните правой кнопкой мыши на БД, а потом задачи затем Сформировать Сценарии
- следуйте за мастером и сохраните локально
-
во-вторых, замените исходную БД на целевую в
- щелкните правой кнопкой мыши на файл назначения, выберите Новый Запрос и Ctrl-H или (редактировать - найти и заменить - быстрая замена)
-
наконец, заполнить данными
- Правой Кнопкой Мыши на целевой БД, затем выберите задачи и Импорт Данных
- источник данных выпадающее значение "поставщик данных .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" на экране "параметры": в моей версии он установлен по умолчанию и предотвращает завершение операции восстановления. После снятия флажка операция восстановления прошла без проблем.
если база данных не очень велика, вы можете посмотреть команды "база данных сценариев" в 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
скрипт, основанный на ответе Джо (отсоединить, скопировать файлы, прикрепить оба).
- запустите Managment Studio как учетную запись администратора.
это не обязательно, но, возможно, ошибка отказа в доступе при выполнении.
- настройка sql server для выполнения xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
- запустите скрипт, но введите свои имена БД в
@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
вы можете просто создать новую базу данных, а затем перейти к задачам, импортировать данные и импортировать все данные из базы данных, которую вы хотите дублировать в базу данных, которую вы только что создали.