Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ět příkazy SqlPackage z příkazového řádku v libovolném adresáři:
- Stáhnout zip pro SqlPackage v .NET 8 pro váš operační systém (Windows, macOS nebo Linux).
- Rozbalte archiv podle pokynů na stránce ke stažení.
- Otevřete příkazový řádek a změňte adresář (
cd) do složky SqlPackage.
Používejte nejnovější dostupnou verzi SqlPackage, protože vylepšení výkonu a opravy chyb jsou pravidelně vydávány.
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í. Blogový příspěvek Optimalizace importů BACPAC – SqlPackage Hotovo správně! vás provede postupem použití sqlPackage místo služby Import/Export pro .bacpac import.
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>
Použijte vícefaktorovou autentizaci jako alternativu k uživatelskému jménu a heslu pro autentizaci pomocí Microsoft Entra. Nahraďte parametry uživatelského jména a hesla pro /ua:true a /tid:"contoso.onmicrosoft.com".
Diagnostics
Diagnostika chyb a neočekávaného chování v sqlPackage je podporována diagnostickými protokoly a diagnostickým balíčkem. Diagnostické protokoly jsou nezbytné pro řešení potíží a zaznamenávají se do souboru s parametrem /DiagnosticsFile:<filename>.
Úroveň detailu diagnostického výstupu je řízena pomocí parametru /DiagnosticsLevel . Použijte Information hodnoty a Verbose pro získání více podrobností.
Zaznamenávejte trasovací data související s výkonem nastavením proměnné prostředí DACFX_PERF_TRACE=true před spuštěním SqlPackage. Trasovací data zvětšují objem protokolu, proto je zahrnujte pouze při diagnostice problémů s výkonem. 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
V SqlPackage 162.5 a novějších verzích můžete vytvořit diagnostický balíček pro řešení problémů. Diagnostický balíček obsahuje verzi SqlPackage, spuštěný příkaz, informace o zdrojových a cílových databázových modelech a výstup příkazu. K vygenerování diagnostického balíčku použijte parametr /DiagnosticsPackageFile:<filename>.
Běžné problémy
Chyby časového limitu
Při problémech s časovým limitem použijte následující vlastnosti k ladění spojení mezi SqlPackage a SQL instancí:
-
/p:CommandTimeout=: Specifikuje časový limit příkazu během několika sekund při spuštění dotazu. Výchozí hodnota: 60 -
/p:DatabaseLockTimeout=: Určuje časový limit uzamčení databáze v sekundách. Použijte-1k č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í hodnota0, čeká neomezeně dlouho.
Spotřeba prostředků klienta
Pro příkazy exportu a extrakce SqlPackage předává data tabulky do dočasného adresáře, který je uloží do bufferu před zápisem do souboru BACPAC nebo DACPAC. Tato požadavek na úložiště může být velký a je relativní k plné velikosti dat k exportu. Zadejte alternativní dočasný adresář s vlastností /p:TempDirectoryForTableData=<path>.
SqlPackage kompiluje model schématu v paměti. U velkých databázových schémat může být požadavek na paměť na klientském stroji běžícím SqlPackage značný.
Nízká spotřeba prostředků serveru
SqlPackage ve výchozím nastavení nastaví maximální paralelismus serveru na hodnotu 8. Pokud si všimnete nízké spotřeby serverových zdrojů, zvýšení hodnoty parametru MaxParallelism může zlepšit výkon.
Token přístupu
Použití parametru /AccessToken: or /at: umožňuje tokenovou autentizaci pro SqlPackage, ale předání tokenu příkazu může být složité. Pokud v PowerShellu parsujete objekt přístupového tokenu, buď explicitně předejte řetězcovou hodnotu, nebo uzavřete odkaz na vlastnost tokenu do $(). 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)
Connection
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:Falsenebo/TargetEncryptConnection:False - Certifikát důvěryhodného serveru:
/SourceTrustServerCertificate:Truenebo/TargetTrustServerCertificate:True
Při připojení k SQL instanci můžete vidět jednu nebo více z následujících varovných zpráv, které naznačují, že parametry příkazového řádku mohou vyžadovat změny pro 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í
Když provedete importní akci, můžete dostat chybu 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:
- Ověřte, že cíl, do kterého importujete, je prázdná databáze.
- Pokud má vaše databáze omezení, která používají
DEFAULTatribut (kde SQL Server přiřadí omezení náhodné jméno) a explicitně pojmenované omezení, může být omezení se stejným názvem vytvořeno dvakrát. Použijte všechna explicitně pojmenovaná omezení (nepoužívejteDEFAULT), nebo použijte všechna systémově definovaná jména (použijteDEFAULT). - Ručně upravte
model.xmlsoubor a přejmenujte omezení podle jména, které chybu způsobuje, na jedinečné jméno. Tato možnost by měla být provedena pouze pokud k tomu vyzve podpora Microsoftu a nese riziko.bacpacpoškození.
Výjimka přetečení zásobníku
Velké skripty T-SQL s mnoha vnořenými příkazy mohou způsobit občasné nebo trvalé výjimky z přetečení zásobníku. Když nastane tato podmínka, chybová zpráva obsahuje text Stack overflow a stackovou stopu:
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í vysoké hodnoty může ovlivnit celkový výkon SqlPackage. Zvýšení této hodnoty však může vyřešit výjimku přetečení zásobníku způsobenou vnořenými příkazy. Refaktorujte kód T-SQL tak, aby se pokud možno předešlo výjimkám typu stack overflow. Pokud nemůžete refaktorovat, použijte parametr /ThreadMaxStackSize: jako obcházení.
Když použijete parametr /ThreadMaxStackSize:, nastavte počet opakování na nejnižší hodnotu, která zabrání výjimce přetečení zásobníku, pokud zaznamenáte dopad na výkon. Hodnota parametru je v megabajtech (MB). Například můžete testovat hodnoty jako 10 a .100
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 vlastnosti a další vlastnosti můžete použít k ladění operace SqlPackage Import .
Indexy jsou po importu zakázány
Pro efektivní načítání dat import deaktivuje neclusterované indexy před datovou fází a následně je znovu sestaví (výchozí /p:DisableIndexesForDataPhase=True chování). Pokud je import přerušen nebo selže po načtení dat, ale před dokončením přestavby, jeden nebo více neshlukovaných indexů může zůstat deaktivováno. Zakázáný index zůstává v metadatech, ale optimalizátor dotazů je ignoruje, což může způsobit pomalé dotazy po importu, který jinak vypadá jako úspěšný.
Pro nalezení deaktivovaných indexů zkontrolujte sloupec is_disabled v zobrazení katalogu sys.indexes :
SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,
OBJECT_NAME(object_id) AS table_name,
name AS index_name
FROM sys.indexes
WHERE is_disabled = 1;
Pro opětovné povolení deaktivovaného indexu jej znovu sestavte pomocí ALTER INDEX. Použijte ALTER INDEX ALL ... REBUILD pro povolení všech deaktivovaných indexů v tabulce:
ALTER INDEX ALL ON <schema>.<table> REBUILD;
Pro více informací viz Povolit indexy a omezení.
Tipy pro akce exportu
Aby byl export transakční konzistentní, ujistěte se, že během exportu neprobíhá žádná zápisová aktivita, nebo že exportujete z transakčně konzistentní kopie vaší databáze. Pokud během importu obdržíte chyby ohledně omezení cizích klíčů, export nemusí být transakční konzistentní kvůli vloženým nebo aktualizovaným záznamům během exportu.
Výkon během exportu
Častou příčinou zhoršení výkonu během exportu jsou nevyřešené objektové reference. Tento problém způsobuje, že SqlPackage se opakovaně pokouší objekt vyřešit. Například je definován pohled, který odkazuje na tabulku, ale 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.
Během procesu exportu se data tabulky komprimují v souboru bacpac. Nastavení /p:CompressionOption na Fast, SuperFast, nebo NotCompressed může zlepšit rychlost exportního procesu při menším kompresi výstupního bacpac souboru.
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.
Místo na disku během exportu
V situacích, kdy je prostor na disku operačního systému omezený a během exportu dojde místo, použijte /p:TempDirectoryForTableData k dočasnému ukládání dat pro export na jiný disk. Požadované místo pro tuto akci může být velké a je relativní vzhledem k plné velikosti databáze. Operaci exportu SqlPackage můžete nastavit nastavením této a dalších vlastností.
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.
Pro více informací o použití PowerShell skriptu ke sběru informací o importní operaci viz Lesson Learned #211: Monitoring SQLPackage Import Process.
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ří:
- Optimalizace importů BACPAC – SqlPackage zvládnutý správně!
- Poznatky č. 535: Selhání importu BACPAC ve službě Azure SQL Database kvůli nekompatibilním uživatelům
- Poučení z lekce 523: Měření času importu - Analyzování protokolů ze SqlPackage pomocí PowerShellu
- Jak přeskočit odkazy na externí zdroje dat při exportu nebo obnovení databáze Azure SQL
- Migrace služby Azure SQL DATABASE do SQL MI s využitím služby SqlPackage nebo ADF
- Ponaučení z lekce #446: Jak zjednodušit ladění logu SQLPackage pomocí PowerShellu
- Jak používat sqlpackage se spravovanou identitou
- Lekce 298: Obrovská doba trvání exportu databáze pomocí sqlpackage
- Lekce č. 281: Export selže kvůli výjimce systémové nedostatek paměti
- Poučení č. 281: Řešení potíží s omezením CHECK při importu bacpac souboru kvůli obchodní logice
- Poučení 272: Vypršel časový limit spuštění – chyba při importu souboru Bacpac
- lekci č. 213: Nelze nastavit vlastnost AccessToken, pokud je integrované zabezpečení nastaveno
- lekci 211: Monitorování procesu importu SQLPackage
- Lekce č. 51: Spravovaná instance – Import přes Sqlpackage.exe neumožňuje automatické navyšování
- Naučená lekce #32: Jak exportovat více databází z SQL Serveru do souboru Bacpac
- krok za krokem: Jak používat SQLPackage s přístupovým tokenem
- Kolizační konflikt při přesunu Azure SQL DB na SQL server on-premises nebo Azure VM pomocí SQLPackage