Мне нужно переместить целую кучу (более 100) больших (миллионы строк) таблиц из одной базы данных SQL2008 в другую.
Первоначально я просто использовал Мастер импорта / экспорта, но во всех таблицах назначения отсутствовали первичные и внешние ключи, индексы, ограничения, триггеры и т. Д. (Столбцы идентификаторов также были преобразованы в простые INT, но я думаю, что просто пропустил флажок в мастер).
Какой правильный способ сделать это?
Если бы это была всего лишь пара таблиц, я бы вернулся к источнику, написал сценарий определения таблицы (со всеми индексами и т. Д.), А затем запустил части сценария создания индекса в месте назначения. Но с таким количеством таблиц это кажется непрактичным.
Если бы данных было не так много, я мог бы использовать мастер «Создание сценариев ...» для составления сценария источника, включая данные, но сценарий длиной 72 метра просто не кажется хорошей идеей!
Ответы:
Составление сценариев для таблиц, а затем использование SSIS для передачи данных будет наиболее надежным и эффективным способом перемещения данных в новую базу данных.
источник
На самом деле мы сделали это, используя множество сценариев вручную в сочетании с мастером импорта, но сегодня утром я нашел лучший ответ, благодаря статье в блоге Тибора Караси .
Отчасти мы были разочарованы тем, что «Мастер импорта / экспорта DTS» в SQL 2000 делает это почти тривиально простым, выбрав «Копировать объекты и данные»:
Эта третья опция включает в себя возможность включения индексов / триггеров и т. Д.
Этот параметр был удален из мастера импорта SQL 2005/2008 . Почему? Без понятия:
В 2005/2008 году вы, очевидно, должны были вручную создать пакет служб SSIS в BIDS и использовать задачу переноса объектов SQL Server , которая содержит все те же параметры, которые были в мастере 2000:
источник
Я хотел бы написать сценарий для таблицы или использовать инструменты сравнения (например, Red Gate) для генерации таблиц в целевой базе данных. Без индексов или ограничений пока.
Затем я хотел бы рассмотреть возможность восстановления базы данных с другим именем на том же сервере и сделать
.. для каждой таблицы, с SET IDENTITY INSERT ON, если требуется
Затем я бы добавил индексы и ограничения после загрузки данных.
Это зависит от вашего уровня комфорта с SSIS (ответ mrdenny) или от того, предпочитаете ли вы сырой SQL.
источник
Я бы добавил к ответу мистера Денни: вычеркните схему таблиц, затем используйте BCP для перемещения данных. Если вы не знакомы с SSIS, то использовать BCP и пакеты должно быть легко. Для миллионов строк ничто не сравнится с BCP (массовая вставка) :).
источник
Я тот, кто совершенно не знаком с SSIS.
Когда исходные таблицы не имеют идентичных столбцов
Теперь T-SQL для генерации операторов Select * в ...
Это создает строку для каждой таблицы, чтобы скопировать как
В случае, если таблицы содержат столбцы идентификаторов, я создаю сценарий для таблиц, включая свойство идентификатора и первичные ключи.
Я не использую вставку в ... выберите ... используя связанный сервер в этом случае, поскольку это не массовая техника. Я работаю над некоторыми сценариями PowerShell, похожими на [этот вопрос 1 , но я все еще работаю над обработкой ошибок. Действительно большие таблицы могут вызвать ошибки нехватки памяти, так как вся таблица загружается в память, прежде чем она будет отправлена через SQLBulkCopy в базу данных.
Восстановление индексов и т. Д. Аналогично описанному выше. На этот раз я могу пропустить воссоздание первичных ключей.
источник
Вы можете использовать инструменты сравнения, которые сравнивают схемы базы данных и данные и сначала синхронизируют пустую схему базы данных с исходной базой данных, чтобы создать все таблицы.
Затем синхронизируйте данные из исходной базы данных с новой (все таблицы есть, но все они пусты), чтобы вставить записи в таблицы.
Для этого я использую ApexSQL Diff и ApexSQL Data Diff , но есть и другие подобные инструменты.
Хорошая вещь в этом процессе заключается в том, что вам не нужно фактически синхронизировать базы данных с помощью инструмента, поскольку это может быть довольно болезненным для миллионов строк.
Вы можете просто создать сценарий INSERT INTO SQL (не удивляйтесь, если это несколько концертов) и выполнить его.
Поскольку в SQL Server Management Studio невозможно открыть даже такие большие сценарии, я использую sqlcmd или osql
источник
Как уже упоминалось @mrdenny -
Вместо использования служб SSIS используйте BCP для вставки данных.
bcp из данных, используя скрипт ниже. установите SSMS в текстовом режиме и скопируйте вывод, сгенерированный приведенным ниже сценарием, в файл bat.
Запустите файл bat, который сгенерирует файлы .dat в указанной вами папке.
Запустите ниже скрипт на
Запустите вывод, используя SSMS, чтобы вставить данные обратно в таблицы.
Это очень быстрый метод BCP, поскольку он использует собственный режим.
источник