Поделиться через


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

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

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

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

Если не удается установить средство dotnet SqlPackage, которое позволяет выполнять команды SqlPackage из командной строки в любом каталоге:

  1. Скачайте ZIP-файл для SqlPackage в .NET 8 для операционной системы (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.

Исключение переполнения стека

Крупные скрипты T-SQL со многими вложенными операторами часто вызывают периодические или постоянные исключения переполнения стека. В этом случае сообщение об ошибке будет содержать текст Stack overflow и трассировку стека:

Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor.Visit(Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression)
Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor.ExplicitVisit(Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression)
Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression.Accept(Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor)
Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression.AcceptChildren(Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor)
Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression.Accept(Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor)
Microsoft.SqlServer.TransactSql.ScriptDom.BinaryQueryExpression.AcceptChildren(Microsoft.SqlServer.TransactSql.ScriptDom.TSqlFragmentVisitor)

Параметр sqlPackage доступен во всех командах, /ThreadMaxStackSize:что указывает максимальный размер стека для потока, выполняющего процесс SqlPackage. Значение по умолчанию определяется версией .NET под управлением SqlPackage. Установка большого значения может повлиять на общую производительность SqlPackage, однако увеличение этого значения может устранить исключение переполнения стека, вызванное вложенными операторами. Рефакторинг кода T-SQL рекомендуется избежать исключений переполнения стека по возможности, но /ThreadMaxStackSize: этот параметр можно использовать в качестве обходного решения.

При использовании /ThreadMaxStackSize: параметра рекомендуется настроить повторяющиеся операции с наименьшим значением, разрешающим исключение переполнения стека при отмечении влияния на производительность. Значение параметра в мегабайтах (МБ), примеры значений для тестирования в качестве обходного решения включают 10 и 100.

Диагностика

Журналы являются важными средствами для устранения неполадок. Запишите журналы диагностики в файл с параметром /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".

Дополнительные ресурсы

Блог службы поддержки базы данных Azure содержит множество статей по устранению неполадок и настройке производительности для База данных SQL Azure, включая несколько статей в SqlPackage.

Ниже приведены некоторые из наиболее важных статей: