Устранение проблем с SqlPackage и его производительность

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

Общая стратегия

В качестве общего руководства более высокую производительность можно получить с помощью версии SqlPackage .NET Core.

  1. Скачайте ZIP-файл SqlPackage в .NET Core для вашей операционной системы (Windows, macOS или Linux).
  2. Распакуйте архив в соответствии с инструкциями на странице скачивания.
  3. Откройте окно командной строки и перейдите в папку (cd) SqlPackage.

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

Замена SqlPackage для службы импорт и экспорт

Если вы попытались использовать службу импорт и экспорт для импорта или экспорта базы данных, можно использовать SqlPackage для выполнения той же операции с дополнительным контролем над необязательными параметрами и свойствами.

Пример команды для импорта:

./SqlPackage /Action:Import /sf:<source-bacpac-file-path> /tsn:<full-target-server-name> /tdn:<a new or empty database> /tu:<target-server-username> /tp:<target-server-password> /df:<log-file>

Пример команды для экспорта:

./SqlPackage /Action:Export /tf:<target-bacpac-file-path> /ssn:<full-source-server-name> /sdn:<source-database-name> /su:<source-server-username> /sp:<source-server-password> /df:<log-file>

Кроме имени пользователя и пароля, многофакторная проверка подлинности может использоваться для проверки подлинности через проверку подлинности Microsoft Entra (ранее Azure Active Directory) с многофакторной проверкой подлинности. Замените параметры имени пользователя и пароля для /ua:true и /tid:"yourdomain.onmicrosoft.com".

Распространенные проблемы

Ошибки, связанные с истечением времени ожидания

Для проблем, связанных с истечением времени ожидания, можно использовать следующие свойства для настройки соединения между SqlPackage и экземпляром SQL:

  • /p:CommandTimeout=. Указывает время ожидания команды в секундах при выполнении запроса. По умолчанию: 60
  • /p:DatabaseLockTimeout=. Задает время ожидания блокировки базы данных в секундах. -1 можно использовать для неограниченного ожидания, по умолчанию: 60
  • /p:LongRunningCommandTimeout=. Задает время ожидания длительной команды в секундах. Значение по умолчанию 0 используется для неограниченного ожидания.

Потребление ресурсов клиента

Для команд экспорта и извлечения таблица данных передается во временный каталог для буферизации перед записью в файл bacpac/dacpac. Это требование к хранилищу может быть большим и соответствует полному размеру экспортируемых данных. Укажите альтернативный временный каталог со свойством /p:TempDirectoryForTableData=<path>.

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

Низкое потребление ресурсов сервера

По умолчанию SqlPackage устанавливает максимальный параллелизм сервера равным 8. Если вы отмечаете низкое потребление ресурсов сервера, увеличение значения MaxParallelism параметра может повысить производительность.

Маркер доступа

Параметр /AccessToken: или /at: позволяет включить проверку подлинности на основе маркеров для SqlPackage, но передача маркера в команду может быть сложной задачей. Если вы анализируете объект маркера доступа в PowerShell либо явно передайте строковое значение, либо заключите ссылку на свойство токена в $(). Например:

$Account = Connect-AzAccount -ServicePrincipal -Tenant $Tenant -Credential $Credential
$AccessToken_Object = (Get-AzAccessToken -Account $Account -Resource "https://database.windows.net/")
$AccessToken = $AccessToken_Object.Token

SqlPackage /at:$AccessToken
# OR
SqlPackage /at:$($AccessToken_Object.Token) 

Connection

Если SqlPackage не удается подключиться, сервер может не включать шифрование или настроенный сертификат может не выдаваться из доверенного центра сертификации (например, самозаверяющего сертификата). Вы можете изменить команду SqlPackage, чтобы подключиться без шифрования или доверять сертификату сервера. Рекомендуется убедиться, что надежное зашифрованное подключение к серверу можно установить.

  • Подключение без шифрования: /SourceEncrypt Подключение ion=False или /TargetEncrypt Подключение ion=False
  • Сертификат сервера доверия: /SourceTrustServerCertificate=True или /TargetTrustServerCertificate=True

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

The settings for connection encryption or server certificate trust may lead to connection failure if the server is not properly configured.
The connection string provided contains encryption settings which may lead to connection failure if the server is not properly configured.

Дополнительные сведения об изменениях безопасности подключений в SqlPackage доступны в Подключение улучшения безопасности в SqlPackage 161.

Ошибка действия импорта 2714 для ограничения

При выполнении действия импорта может появиться ошибка 2714, если объект уже существует:

*** Error importing database:Could not import package.
Error SQL72014: Core Microsoft SqlClient Data Provider: Msg 2714, Level 16, State 5, Line 1 There is already an object named 'DF_Department_ModifiedDate_0FF0B724' in the database.
Error SQL72045: Script execution error.  The executed script:
ALTER TABLE [HumanResources].[Department]
    ADD CONSTRAINT [DF_Department_ModifiedDate_] DEFAULT ('') FOR [ModifiedDate];

Ниже приведены причины и решения для решения этой ошибки:

  1. Убедитесь, что назначение, в которое вы импортируете, является пустой базой данных.
  2. Если в базе данных есть ограничения, использующие атрибут DEFAULT (где SQL Server назначает случайное имя ограничению) и явно именованное ограничение, то ограничение с тем же именем может быть создано дважды. Следует использовать все явно именованные ограничения (не используя DEFAULT) или все системные имена (с помощью DEFAULT).
  3. Вручную измените model.xml и переименуйте ограничение с именем, в котором возникла ошибка с уникальным именем. Этот вариант следует предпринять только в том случае, если она направляется в службу поддержки Майкрософт и представляет риск повреждения BACPAC.

Диагностика

Журналы являются важными средствами для устранения неполадок. Запишите журналы диагностики в файл с параметром /DiagnosticsFile:<filename>.

Дополнительные данные трассировки, связанные с производительностью, можно зарегистрироваться, задав переменную DACFX_PERF_TRACE=true среды перед запуском SqlPackage. Чтобы задать эту переменную среды в PowerShell, используйте следующую команду:

Set-Item -Path Env:DACFX_PERF_TRACE -Value true

Советы по операциям импорта

Для импорта, содержащего большие таблицы или таблицы с большим количеством индексов, использование /p:RebuildIndexesOfflineForDataPhase=True или /p:DisableIndexesForDataPhase=False повышение производительности. Эти свойства изменяют операцию перестроения индекса, чтобы она происходила в автономном режиме или не происходила соответственно. Эти и другие свойства доступны для настройки операции импорта SqlPackage.

Советы по операциям экспорта

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

В сценариях, когда дисковое пространство ОС ограничено и заканчивается во время экспорта, использование /p:TempDirectoryForTableData позволяет буферизовать данные для экспорта на альтернативном диске. Пространство, необходимое для этого действия, может быть большим и определяется относительно полного размера базы данных. Эти и другие свойства доступны для настройки операции экспорта SqlPackage.

Во время экспорта данные таблицы сжимаются в bacpac-файле. Использование /p:CompressionOption со значением Fast, SuperFast или NotCompressed может повысить скорость процесса экспорта при меньшем сжатии выходного файла BACPAC.

Для получения схемы и данных базы данных при пропуске проверки схемы выполните операцию Экспорт со свойством /p:VerifyExtraction=False.

База данных SQL Azure

Следующие советы относятся к выполнению импорта или экспорта в Базу данных SQL Azure с виртуальной машины Azure:

  • Используйте критически важный для бизнеса или базу данных уровня "Премиум", чтобы повысить производительность.
  • Используйте хранилище SSD на виртуальной машине и убедитесь, что достаточно места для распаковки bacpac.
  • Выполнение SqlPackage из виртуальной машины в том же регионе, что и база данных.
  • Включите ускоренную сеть на виртуальной машине.

Дополнительные сведения об использовании скрипта PowerShell для сбора дополнительных сведений об операции импорта см. в статье "Урок обучения 211: мониторинг процесса импорта SQLPackage".