Sdílet prostřednictvím


Řešení problémů a výkonu se SqlPackage

V některých scénářích operace SqlPackage trvá déle, než se čekalo, nebo se nedokončí. Tento článek popisuje některé často navrhované taktiky pro řešení potíží nebo zlepšení výkonu těchto operací. Při čtení konkrétní stránky dokumentace pro každou akci se doporučuje porozumět dostupným parametrům a vlastnostem, tento článek slouží jako výchozí bod při zkoumání operací SqlPackage.

Celková strategie

Obecně platí, že lepší výkon lze získat prostřednictvím verze .NET SqlPackage místo verze rozhraní .NET Framework nainstalované prostřednictvím DacFramework.msi.

Pokud nemůžete nainstalovat nástroj SqlPackage dotnet, který umožňuje spouštění příkazů SqlPackage z příkazového řádku v libovolném adresáři:

  1. Stáhnout zip pro SqlPackage v .NET 8 pro váš operační systém (Windows, macOS nebo Linux).
  2. Rozbalte archiv podle pokynů na stránce pro stažení.
  3. Otevřete příkazový řádek a změňte adresář (cd) do složky SqlPackage.

Je důležité používat nejnovější dostupnou verzi SqlPackage, protože jsou pravidelně vydávány zlepšení výkonu a opravy chyb.

Nahrazení sqlpackage pro službu importu a exportu

Pokud jste se pokusili k importu nebo exportu databáze použít službu Import/Export, můžete stejnou operaci provést pomocí nástroje SqlPackage s větší kontrolou volitelných parametrů a vlastností.

Příklad příkazu importu:

./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>

V případě exportu je příklad příkazu:

./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>

Alternativou k uživatelskému jménu a heslu je možné použít vícefaktorové ověřování k ověřování prostřednictvím ověřování Microsoft Entra (dříve Azure Active Directory) s vícefaktorovým ověřováním. Nahraďte parametry uživatelského jména a hesla pro /ua:true a /tid:"yourdomain.onmicrosoft.com".

Diagnostický balíček

V sqlpackage 162.5 a novějších můžete vygenerovat diagnostický balíček, který vám pomůže s řešením potíží. Diagnostický balíček obsahuje verzi SqlPackage, spuštěný příkaz a výstup příkazu. K vygenerování diagnostického balíčku použijte parametr /DiagnosticsFile:<filename>.

Běžné problémy

Chyby časového limitu

V případě problémů souvisejících s vypršením časových limitů je možné k ladění připojení mezi sqlpackage a instancí SQL použít následující vlastnosti:

  • /p:CommandTimeout=: Určuje časový limit příkazu v sekundách při spuštění dotazu. Výchozí hodnota: 60
  • /p:DatabaseLockTimeout=: Určuje časový limit uzamčení databáze v sekundách. -1 lze použít k čekání na neomezenou dobu, výchozí hodnota: 60
  • /p:LongRunningCommandTimeout=: Specifikuje časový limit v sekundách pro dlouho běžící příkaz. Výchozí hodnota 0 se používá k čekání na neomezenou dobu.

Spotřeba prostředků klienta

Pro příkazy pro export a extrakci se data tabulky předávají dočasnému adresáři do vyrovnávací paměti před zápisem do souboru bacpac/dacpac. Tento požadavek na úložiště může být velký a je relativní vzhledem k plné velikosti dat, která se mají exportovat. Zadejte alternativní dočasný adresář s vlastností /p:TempDirectoryForTableData=<path>.

Model schématu je zkompilován v paměti, takže u velkých databázových schémat může být důležitý požadavek na paměť na klientském počítači, na kterém běží SqlPackage.

Nízká spotřeba prostředků serveru

SqlPackage ve výchozím nastavení nastaví maximální paralelismus serveru na hodnotu 8. Pokud si povšimnete nízké spotřeby prostředků serveru, zvýšení hodnoty parametru MaxParallelism může zvýšit výkon.

Přístupový token

Použití parametru /AccessToken: nebo /at: umožňuje ověřování na základě tokenů pro SqlPackage, ale předání tokenu příkazu může být složité. Pokud parsujete objekt přístupového tokenu v PowerShellu, buď explicitně předáte řetězcovou hodnotu, nebo zabalte odkaz na vlastnost tokenu v $(). Například:

$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)

Připojení

Pokud se sqlPackage nedaří připojit, server nemusí mít povolené šifrování nebo nakonfigurovaný certifikát nemusí být vystavený od důvěryhodné certifikační autority (například certifikátu podepsaného svým držitelem). Příkaz SqlPackage můžete změnit tak, aby se buď připojil bez šifrování, nebo důvěřoval certifikátu serveru. Osvědčeným postupem je zajistit, aby bylo možné navázat důvěryhodné šifrované připojení k serveru.

  • Připojení bez šifrování: /SourceEncryptConnection:False nebo /TargetEncryptConnection:False
  • Certifikát důvěryhodného serveru: /SourceTrustServerCertificate:True nebo /TargetTrustServerCertificate:True

Při připojování k instanci SQL se může zobrazit některá z následujících zpráv s upozorněním, že parametry příkazového řádku můžou vyžadovat změny připojení k serveru:

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.

Další informace o změnách zabezpečení připojení v sqlPackage jsou k dispozici v Vylepšení zabezpečení připojení v SqlPackage 161.

Chyba akce importu 2714 pro omezení

Při provádění akce importu se může zobrazit chyba 2714, pokud objekt již existuje:

*** 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];

Tady jsou příčiny a řešení této chyby:

  1. Ověřte, že cíl, do kterého importujete, je prázdná databáze.
  2. Pokud má vaše databáze omezení, která používají atribut DEFAULT (kde SQL Server přiřadí k omezení náhodný název) a explicitně pojmenované omezení, může být omezení se stejným názvem vytvořeno dvakrát. Měli byste použít všechna explicitně pojmenovaná omezení (nepoužívá se výchozí) nebo všechny názvy definované systémem (pomocí DEFAULT).
  3. Ručně upravte model.xml a přejmenujte omezení s názvem, u kterých došlo k chybě, na jedinečný název. Tato možnost by měla být provedena pouze pokud k tomu vyzve podpora Microsoftu a nese riziko .bacpac poškození.

Výjimka přetečení zásobníku

Velké skripty T-SQL s mnoha vnořenými příkazy jsou často příčinou přerušovaných nebo trvalých výjimek přetečení zásobníku. V takovém případě bude chybová zpráva zahrnovat text Stack overflow a trasování zásobníku:

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)

Parametr pro SqlPackage je k dispozici pro všechny příkazy, /ThreadMaxStackSize:, který určuje maximální velikost zásobníku pro vlákno, ve kterém běží proces SqlPackage. Výchozí hodnota je určená verzí .NET, na které běží SqlPackage. Nastavení velké hodnoty může mít vliv na celkový výkon SqlPackage, ale zvýšení této hodnoty může vyřešit výjimku přetečení zásobníku způsobenou vnořenými příkazy. Refaktoring kódu T-SQL se doporučuje, aby se zabránilo výjimkám přetečení zásobníku, pokud je to možné, ale jako alternativní řešení lze použít parametr /ThreadMaxStackSize:.

Při použití parametru /ThreadMaxStackSize: se doporučuje ladit opakované operace na nejnižší hodnotu, která vyřeší výjimku přetečení zásobníku, pokud je zaznamenán dopad na výkon. Hodnota parametru je v megabajtech (MB), například hodnoty pro testování jako alternativní řešení zahrnují 10 a 100.

Diagnostika

Protokoly jsou nezbytné pro řešení potíží. Zachyťte diagnostické protokoly do souboru pomocí parametru /DiagnosticsFile:<filename>.

Další data trasování související s výkonem lze protokolovat nastavením proměnné prostředí DACFX_PERF_TRACE=true před spuštěním SqlPackage. Pokud chcete nastavit tuto proměnnou prostředí v PowerShellu, použijte následující příkaz:

Set-Item -Path Env:DACFX_PERF_TRACE -Value true

Tipy k akcím importu

U importů, které obsahují velké tabulky nebo tabulky s mnoha indexy, může použití /p:RebuildIndexesOfflineForDataPhase=True nebo /p:DisableIndexesForDataPhase=False zlepšit výkon. Tyto vlastnosti upravují operaci opětovného sestavení indexu tak, aby probíhala offline, nebo aby k ní vůbec nedošlo. Tyto a další vlastnosti jsou k dispozici k ladění Operace importu sqlPackage.

Pokyny pro export akcí

Běžnou příčinou snížení výkonu během exportu jsou nevyřešené odkazy na objekty, což způsobí, že sqlPackage se pokusí objekt vyřešit vícekrát. Například zobrazení je definováno tak, že odkazuje na tabulku a tabulka již v databázi neexistuje. Pokud se v protokolu exportu zobrazí nevyřešené odkazy, zvažte opravu schématu databáze, aby se zlepšil výkon exportu.

Ve scénářích, kdy je místo na disku s operačním systémem omezené a během exportu dochází, umožňuje použití /p:TempDirectoryForTableData data pro export do vyrovnávací paměti na alternativním disku. Požadované místo pro tuto akci může být velké a je relativní vzhledem k plné velikosti databáze. To a další vlastnosti jsou k dispozici k ladění SqlPackage Export operace.

Během procesu exportu se data tabulky komprimují v souboru bacpac. Použití /p:CompressionOption nastavené na Fast, SuperFastnebo NotCompressed může zvýšit rychlost exportu při komprimaci výstupního souboru bacpac méně.

Chcete-li získat schéma databáze a data při vynechání ověření schématu, proveďte Export s vlastností /p:VerifyExtraction=False. Může se vytvořit neplatný export, který se nedá importovat.

Azure SQL Database

Následující tipy jsou specifické pro spuštění importu nebo exportu ve službě Azure SQL Database z virtuálního počítače Azure:

  • Pro zajištění nejlepšího výkonu používejte databázi úrovně Business Critical nebo Premium.
  • Použijte úložiště SSD na virtuálním počítači.
  • Ujistěte se, že je dostatek místa pro rozepnutí bacpaku.
  • Spusťte SqlPackage z virtuálního počítače ve stejné oblasti jako databáze.
  • Povolte akcelerované síťové služby na virtuálním počítači.

Další informace o využití skriptu PowerShellu ke shromažďování dalších informací o operaci importu najdete v tématu Lekce Naučené #211: Monitorování procesu importu SQLPackage.

Další zdroje informací

Blog podpory služby Azure Database obsahuje mnoho článků o řešení potíží a ladění výkonu pro Azure SQL Database, včetně několika článků o sqlpackage.

Mezi nejdůležitější články patří: