Клонировать существующую базу данных в новую базу данных
Я изо всех сил пытаюсь найти подходящее решение для этого. У меня довольно большая база данных 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