У меня есть очень большая производственная база данных и очень большая база данных среды тестирования в SQL Server 2008R2. Обе базы данных имеют одинаковую структуру таблиц, но разные пользователи / логины / разрешения / роли.
Мне нужно обновлять только несколько таблиц в тестовой базе данных периодически с производства, примерно раз в месяц.
В настоящее время я планирую сделать это
- Используйте утилиту BCP для экспорта необходимых мне таблиц из Production.
- Скопируйте файл экспорта bcp на тестовый сервер
- Отключить индексы и ограничения для всех таблиц, которые я обновляю в тесте
- Усечь тестовые таблицы базы данных
- Загрузите данные обратно в таблицы тестовой базы данных, используя BCP.
- перестроить индексы и повторно включить ограничения в тесте
Все это кажется слишком сложным для такой маленькой задачи. Также кажется, что это вызовет много повторов (в t-log). Есть ли лучший способ сделать это?
Еще один способ, который я задумал сделать, - это восстановить резервную копию из производства в тестовой среде, но у меня есть проблема, что полная резервная копия будет довольно большой, и мне не нужно обновлять все таблицы, только несколько. - а также пользователи и безопасность в производственной базе данных отличаются от тестовых. Это будет перезаписано настройками безопасности в производственной базе данных, если я восстановлю всю базу данных.
источник
Ответы:
Есть 2 метода, которые подойдут вам:
(Примечание: если на таблицы ссылаются по внешнему ключу, вы не сможете их использовать
TRUNCATE
. Вы должны удалить куски . Кроме того, вы можете удалить все индексы + внешние ключи и загрузить данные, а затем воссоздать их).BCP OUT и BULK INSERT INTO база данных назначения .
Включить Trace Flag 610 - минимально регистрируемые вставки в индексированные таблицы.
-
Способ 2: SSIS - Мой предпочтительный метод в этом случае.
Ссылка: Руководство по производительности при загрузке данных и мой ответ для - Вставить в таблицу выберите * из таблицы против массовой вставки
источник
Нет необходимости делать резервные копии и восстанавливать, или вызывать / координировать внешние процессы (например, BCP), или даже связываться с SSIS (очень мощный, очень крутой, но если я могу избежать этого, я, конечно, буду :). Вы можете справиться со всем этим, не выходя из T-SQL, с помощью хранимой процедуры, которую вы можете запланировать с помощью агента SQL, или с помощью сценария, который вы запускаете раз в месяц (хотя его использование в процедуре и планировании не требует длительной работы. бегать). Как? Используя SQLCLR для доступа к
SqlBulkCopy
классу в .NET, так как это, по сути, BCP без суеты вызова BCP. Вы можете написать это самостоятельно: здесь нет супер сложной настройки или чего-то подобногоSqlBulkCopy
класс позаботится обо всем за вас (вы можете установить размер пакета, запускать триггеры и т. д.). Или, если вы не хотите возиться с компиляцией и развертыванием сборки, вы можете использовать готовую хранимую процедуру SQLCLR, такую как DB_BulkCopy, которая является частью библиотеки SQL # SQLCLR (автором которой я являюсь, но она сохранена). процедура в бесплатной версии). Я опишу это более подробно, включая пример использования DB_BulkCopy , в следующем ответе:Импорт данных из одной базы данных в другой скрипт
Если не ясно, где разместить это в вашем текущем плане, вы бы сделали следующее:
EXEC
из DB_BulkCopy или что вы называете это , если вы код это самостоятельно, который просто перемещает данные из точки А в точку Б.Также следует отметить, что
SqlBulkCopy
и DB_BulkCopy :ОБНОВЛЕНИЕ относительно минимально зарегистрированных операций через SqlBulkCopy
Можно получить минимально зарегистрированные операции, но вы должны знать:
[tempdb]
а затем упорядочит вставку в место назначения. Следовательно, возникает некоторая дополнительная нагрузка, как с точки зрения физического ввода-вывода в базу данных tempdb (файлы данных и журналов), так и с помощью операции сортировки (вследствие того,ORDER BY
что требуется для получения минимально зарегистрированных операций)источник