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


271

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

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

Розглянута база даних навколо концерту. Я намагався відновити резервну копію бази даних, яку хочу скопіювати в нову базу даних, але не пощастило.


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 -> Завдання -> Резервне копіювання).
  4. Створіть порожню базу даних з новим іменем (клон). Зауважте коментарі нижче, оскільки це необов’язково.
  5. Клацніть, щоб клонувати базу даних та відкрити діалогове вікно відновлення (див. Зображення) діалогове вікно відновлення
  6. Виберіть Пристрій і додайте файл резервного копіювання з кроку 3. Додати файл резервної копії
  7. Змініть місце призначення для перевірки бази даних змінити призначення
  8. Змініть розташування файлів бази даних, воно повинно відрізнятися від оригіналу. Ви можете ввести безпосередньо в текстове поле, просто додайте постфікс. (ПРИМІТКА. Важливе замовлення. Установіть прапорець, а потім змініть імена файлів.) змінити місцезнаходження
  9. Перевірте ЗАМОВЛЕННЯ та З KEEP_REPLICATION з заміною

84
1. Не створюйте порожню базу даних і не відновлюйте в ній .bak файл. 2. Використовуйте опцію "Відновити базу даних", натиснувши правою кнопкою миші гілку "Бази даних" Студії управління SQL Server і введіть ім'я бази даних, надаючи джерело для відновлення. посилання: stackoverflow.com/questions/10204480 / ...
taynguyen

1
Microsoft SQL Management Studio - це безкоштовно
Tomas Kubes

4
Не працює - "Не вдалося отримати ексклюзивний доступ, оскільки база даних використовується".
Емануеле Сіріачі

5
Я також повинен був зняти прапорець "Візьміть резервну копію хвостового журналу перед відновленням". Це було встановлено за замовчуванням, що призвело до помилки "Ексклюзивний доступ не вдалось отримати, оскільки база даних використовується".
Репка

2
Моя оригінальна база даних застрягла на "Відновлення"
Divi perdomo

113

Клацніть правою кнопкою миші базу даних, щоб її клонувати, натисніть Tasks, клацніть Copy Database.... Дотримуйтесь майстра, і ви закінчите.


Я думаю, що це доступно лише у версії R2 SQL Server на жаль :-(
Серхіо

7
ось як це працює в експрес: stackoverflow.com/questions/4269450 / ...
ЧТ 00 мА •

2
Це не працює, якщо у вашій базі даних є зашифровані об’єкти.
cjbarth

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

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

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 ; ПОВЕРНУТИСЯ СТВОРИТИ ДАННУВАННЯ NewDB ON (FILENAME = 'C: \ NewDB.mdf'), (FILENAME = 'C: \ NewDB.ldf') ДЛЯ ATTACH; GO
danpop

1
+1 для найшвидшого шляху. Крім відмінного коментаря @JohnLBevan, ви можете також скористатисяexec sp_helpdb @dbname='TEMPDB';
jean

30

Виявляється, я намагався відновити з резервної копії неправильно.

Спочатку я створив нову базу даних, а потім спробував відновити резервну копію тут. Що я повинен був зробити, і що в кінцевому підсумку спрацював, це створити діалог відновлення та ввести ім’я нової бази даних у полі призначення.

Отже, коротше кажучи, відновлення з резервного копіювання зробило свою справу.

Дякую за всі відгуки та пропозиції хлопці


Коли я це роблю, у діалоговому вікні вказується, що файли знаходяться в тому самому місці, що і база даних, з якої я спочатку створив резервну копію. Тож у мене немає кишок відновити, боячись, що файли будуть перезаписані.
Нільс Брінч

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

PS: Цей метод вимагає служби SQL Agent, переконайтеся, що він запущений перед запуском операції копіювання db.
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). HTH!
Ден Кейслі

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 data provider for SQL server " + встановити текстове поле рядка підключення в DATA ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • зробіть те саме з пунктом призначення
    • позначте таблицю, яку ви хочете перенести, або встановіть прапорець "джерело: ...", щоб перевірити їх усі

Ви закінчили.


До речі, я думаю, що Імпорт даних може створювати таблиці, якщо їх немає в таблицях призначення. Просте рішення +1
Хуррам Ішак

6

У SQL Server 2008 R2 створюйте резервну копію бази даних як файл у папку. Потім обрали опцію відновлення, яка з’являється у папці «База даних». У майстрі введіть нове ім'я, яке потрібно в цільовій базі даних. І виберіть відновити файл frrom та скористайтеся файлом, який ви тільки що створили. Я це зробив, і це було дуже швидко (мій БД був маленьким, але все-таки) Пабло.


4

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

Ви можете вибрати, що все для сценарію; ви хочете, звичайно, об'єкти та дані. Потім ви збережете весь сценарій в одному файлі. Потім ви можете використовувати цей файл для відновлення бази даних; просто переконайтеся, що USEкоманда вгорі встановлена ​​у відповідній базі даних.


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

2
Правильно; то це не найкращий спосіб. Натомість ви можете використовувати базу даних сценаріїв, щоб просто створити структуру в новій базі даних, а потім імпортувати / експортувати для переміщення даних. Просто переконайтеся, що ви робите спершу Базу даних сценаріїв; Імпорт / експорт створить таблиці, якщо їх не існує, і вам може не сподобатися, як це відбувається.
Ендрю Барбер

4

Рішення, засноване на цьому коментарі: https://stackoverflow.com/a/22409447/2399045 . Просто встановіть параметри: ім'я БД, папка temp, папка файлів db. І після запуску у вас з'явиться копія БД з ім'ям у форматі "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. Запустіть Управління 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. Запустіть скрипт, але введіть імена db в @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.