Клонировать существующую базу данных в новую базу данных

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

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

База данных A запущена и работает на веб-сайте A. База данных B настроена и имеет своего собственного пользователя. Мне просто нужно получить таблицы и данные в целости от А до В. Я могу изменить их соединение web.config, чтобы использовать учетные данные для входа в базу данных В, и это должно работать.

Я попытался выполнить резервное копирование базы данных A и восстановить ее в базе данных B с помощью Management Studio Express, но она сообщает мне:

System.Data.SqlClient.SqlError: Набор резервных копий содержит резервную копию базы данных, отличной от существующей базы данных "database-B".
(Microsoft.SqlServer.Smo)

Я также попытался щелкнуть правой кнопкой мыши базу данных A в Management Studio Express и перейти к Tasks > Generate scripts, Но когда я делаю это и запускаю сценарии SQL в базе данных B I, появляется масса ошибок, связанных с внешними ключами и т. Д. При импорте содержимого. Кажется, что он делает правильные вещи, но не может обрабатывать различные ключи / отношения.

Так кто-нибудь знает простой и надежный способ получения 100% точных и неповрежденных моих данных из базы данных А в базу данных Б?

Я думаю, что использовал Мастер публикации баз данных SQL Server, чтобы сделать что-то подобное около 5 лет назад, но этот продукт, похоже, больше не работает - я попытался установить его, и он хотел, чтобы я регрессировал свою версию SQL Server до 2005 года, поэтому я ' Я не пойду туда!

2 ответа

Решение

Не используйте пользовательский интерфейс для этого. Если вы не знакомы с различными аспектами BACKUP/RESTORE, пользовательский интерфейс просто приведет вас по неверному пути для множества вариантов. Простейшая команда резервного копирования будет:

BACKUP DATABASE dbname TO DISK = 'C:\some folder\dbname.bak' WITH INIT;

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

EXEC dbname.dbo.sp_helpfile;

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

RESTORE DATABASE newname FROM DISK = 'C\some folder\dbname.bak'
  WITH MOVE 'dbname' TO 'C:\path_from_sp_helpfile_output\newname_data.mdf',
  MOVE 'dbname_log' TO 'C:\path_from_sp_helpfile_output\newname_log.ldf';

Вам придется заменить dbname а также newname с вашими фактическими именами базы данных, а также some folder а также C:\path_from_sp_helpfile_output\ с вашими фактическими путями. Я не могу получить более конкретный ответ, если не знаю, что это такое.


** РЕДАКТИРОВАТЬ **

Вот полное воспроизведение, которое прекрасно работает для меня:

CREATE DATABASE [DB-A];
GO

EXEC [DB-A].dbo.sp_helpfile;

Частичные результаты:

name     fileid filename
-------- ------ ---------------------------------
DB-A     1      C:\Program Files\...\DB-A.mdf
DB-A_log 2      C:\Program Files\...\DB-A_log.ldf

Теперь я запускаю резервную копию:

BACKUP DATABASE [DB-A] TO DISK = 'C:\dev\DB-A.bak' WITH INIT;

Конечно, если цель клона (в этом случае DB-B) уже существует, вы захотите удалить его:

USE [master];
GO
IF DB_ID('DB-B') IS NOT NULL
BEGIN
  ALTER DATABASE [DB-B] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
  DROP DATABASE [DB-B];
END
GO

Теперь это восстановление будет успешно выполнено:

RESTORE DATABASE [DB-B] FROM DISK = 'C:\dev\DB-A.bak'
  WITH MOVE 'DB-A'     TO 'C:\Program Files\...\DB-B.mdf',
       MOVE 'DB-A_log' TO 'C:\Program Files\...\DB-B_log.ldf';

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

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

Я считаю, что проблема Дэна заключалась в том, что он сначала создал новую базу данных, а затем попытался восстановить в нее другую базу данных. Я тоже попробовал и получил ту же ошибку. Хитрость заключается в том, чтобы сначала не создавать базу данных, а назвать ее во время процесса "Восстановление базы данных".

Следующая статья несколько полезна для руководства процессом: http://msdn.microsoft.com/en-us/library/ms186390(v=sql.105).aspx

Другие вопросы по тегам