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



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



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



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

2563   13  

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. проверка с заменой и с KEEP_REPLICATION with replace

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

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

В 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 файл, содержащий только структуру исходной БД

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

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

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

вы сделали.

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

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

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

enter image description here

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

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

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

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

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

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

  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

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

Comments

    Ничего не найдено.