Копировать содержимое SQL Server 2016 db - PullRequest
2 голосов
/ 13 июля 2020

Я хотел бы скопировать все содержимое базы данных: схему и данные между двумя SQL серверами через скрипт, предпочтительно встроенный в изображение linux docker. Копия будет использоваться в тестовой среде для целей тестирования.

У меня несколько ограничений:

  1. Я могу получить доступ к БД, выбранным по протоколу sqlcmd.
  2. У меня нет доступа к файлам на серверах
  3. Я хотел бы выполнить скрипт из linux

Какие решения я отказался:

  • Резервное копирование (bak) файлов, поскольку у меня нет доступа к файлам.
  • Bacpa c - согласно docs У меня нет необходимых разрешений.

То, что я думаю, может работать, но кажется излишне спроектированным:

  • Используйте sqlpackage для создания файла DA C, поскольку он доступен на linux.
  • Используйте da c для обновления структуры в целевой базе данных
  • Используйте bcp из Ms sql Tools для копирования данных.

Решение может не сработать из-за сбоя обновления структуры.

Есть ли другой вариант, который я пропустил? Или лучшая идея?

РЕДАКТИРОВАТЬ: Я реализовал решение, как описано выше (sqlpackage + bcp), и закрепил его ЗДЕСЬ , все на linux.

Тем не менее, ищу лучший подход.

Ответы [ 4 ]

1 голос
/ 23 июля 2020

Пробовали ли вы использовать Microsoft MS SQL -Scripter Tool? Этот сайт детали с использованием MS SQL -Scripter и python для дампа схемы и / или данных из CLI.

Некоторые из их примеров кода:

запись схемы в файл:

mssql-scripter -S .\sql2016 -d WideWorldImporters --include-objects sales.CustomerCategories -f c:\test\sales_CustCategory.sql  

отображать данные в консоли:

mssql-scripter -S .\sql2016 -d WideWorldImporters --data-only --include-objects sales.CustomerCategories
1 голос
/ 16 июля 2020

Я использовал SQL сравнение схем и SQL сравнение данных в Visual Studio с SSDT с некоторым успехом для того же сценария, что и вы.

Лучшая последовательность - сначала выполнить сравнение схемы, но отмените выбор пользователей / разрешений и членов ролей в параметрах cog.

Выполните обновление, затем сравните снова, но на этот раз выполните вход только из объектов, не относящихся к области приложения.

затем выполните только Пользователи , Разрешения и членство в ролях.

Теперь вы можете сравнивать данные - щелкните, чтобы отобразить только записи, которые находятся только в источнике (поскольку ваша целевая база данных пуста)

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

Имейте в виду, что сравнение данных не выполняет таблицы сверх определенного размера, но я был в порядке с до 500000 записей. Поверьте.

В следующий раз, когда вам нужно будет синхронизировать вашу БД, это должно быть намного быстрее, так как при сравнении будет меньше работы.

0 голосов
/ 20 июля 2020

Вместо использования сценария, сгенерированного Management Studio, вы можете попытаться создать его через sys. * И заполнить таблицы сценарием, созданным INFORMATION_SCHEMA.COLUMNS, в динамические c запросы или преобразовать данные в XML. Если ваша установка SQL Server не имеет доступа для записи в любую доступную вам папку, вы можете просто настроить небольшой exe со строкой подключения в базу данных.

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

Например, вы можете создать Хранимые процедуры, такие как:

SELECT 'IF object_ID(N''[' + schema_name(schema_id) + '].[' + Name + ']'') IS NOT NULL 
               DROP PROCEDURE ['+ schema_name(schema_id) +' ].[' + Name + ']' + char(13) + char(10) + 'GO' + char(13) + char(10) +
               OBJECT_DEFINITION(OBJECT_ID) + char(13) +char(10) + 'GO' + char(13) + char(10)
               FROM sys.procedures
               WHERE is_ms_shipped = 0 and Name = 'Loop Name'

PS Будьте осторожны с BCP, это отстой: D

0 голосов
/ 16 июля 2020

В SQL Server Management Studio вы можете щелкнуть правой кнопкой мыши исходную базу данных и выбрать «Задачи»> «Создать сценарии». Здесь вы можете выбрать экспорт схемы и данных. Тогда вы получите, возможно, огромный сценарий SQL, который можно выполнить в целевой базе данных. Возможно, вам придется немного отредактировать его, чтобы он не попытался создать вашу целевую базу данных, если она уже существует. То же самое для пользователей в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...