Při práci s SQL Serverem a nástroji jako DbaTools může být běžným problémem selhání úkolů, které mohou vést k obtížím při správě databází. Jedním z nejběžnějších problémů je situace, kdy job neprobíhá správně, což může být způsobeno různými faktory, jako je neexistující krok v rámci úkolu nebo nesprávná konfigurace. V této části si ukážeme, jak analyzovat chyby pomocí DbaTools, a jak efektivně řešit problémy týkající se chybějících nebo nesprávně nastavených kroků v úkolech SQL Serveru.

Představme si situaci, kdy při běhu úkolu v SQL Serveru narazíme na chybu, která je konzistentní. V tomto případě se například opakovaně objevuje zpráva o tom, že JobManager se pokouší spustit neexistující krok. Tento problém je snadno identifikovatelný v historii úkolů, kde lze vidět, že se úkol selhává vždy v témže místě, přičemž chybová zpráva je často zkrácená. Při používání nástrojů jako DbaTools můžeme použít příkaz Get-DbaAgentJobHistory, který umožňuje získat podrobnosti o jednotlivých úkolech a jejich výsledcích.

Pokud se zaměříme na výstupy příkazu, zjistíme, že každá iterace úkolu zobrazuje chybu související s neexistujícím krokem v rámci úkolu. Tato informace nám umožňuje zjistit přesnou příčinu selhání úkolu, což je důležité pro následné řešení problému. Abychom získali více informací, můžeme využít příkaz Select-Object -ExpandProperty Message, který nám ukáže celé chybové hlášení, čímž odstraníme zkrácení, které je běžné při výstupu bez rozšíření.

Další klíčovou věcí, kterou je třeba řešit, je to, jak správně nakonfigurovat poslední krok úkolu. Původní konfigurace úkolu může mít problém, pokud je poslední krok nastaven tak, že po jeho dokončení se spustí „další krok“, který ve skutečnosti neexistuje. Tento problém vzniká, pokud je parametr OnSuccessAction nebo OnFailureAction nastaven na hodnotu „GoToNextStep“, což vede k pokusu o spuštění neexistujícího kroku. Řešením této situace je změnit nastavení posledního kroku tak, aby místo spuštění neexistujícího kroku, proces skončil úspěšně nebo selhal, podle výsledku předchozího kroku. Toho lze dosáhnout pomocí příkazu Set-DbaAgentJobStep, kde je možné upravit vlastnosti jako OnSuccessAction nebo OnFailAction.

Například příkaz pro aktualizaci posledního kroku úkolu by mohl vypadat takto:

powershell
$params = @{ SqlInstance = "localhost" Job = "DbaMaintenance" StepName = "RebuildIndexes" OnSuccessAction = "QuitWithSuccess" OnFailAction = "QuitWithFailure" } Set-DbaAgentJobStep @params

Tento příkaz zajistí, že pokud poslední krok úkolu proběhne úspěšně, úkol skončí, aniž by se pokusil spustit neexistující krok. Pokud krok selže, úkol bude ukončen s neúspěchem.

DbaTools je velmi užitečný nástroj pro správce databází, který poskytuje robustní alternativu k oficiálnímu modulu PowerShell pro SQL Server. I když tento nástroj má své limity, například nedostatek schopnosti přiřazovat oprávnění k vlastním rolím, nabízí podstatně širší pokrytí funkcí než Microsoft verze. Díky tomuto nástroji mohou správci databází rychle a efektivně spravovat SQL Server bez nutnosti psát složité T-SQL skripty.

V rámci DbaTools je k dispozici více než 700 různých příkazů, které umožňují správu různých aspektů SQL Serveru. Mezi nejčastěji používané příkazy patří Invoke-DbaQuery, který je ekvivalentem příkazu Invoke-SqlCmd v Microsoft modulu, ale s výhodou větší flexibility, především co se týče předávání parametrů.

Pokud jde o správu SQL Server Agentu nebo bezpečnosti, DbaTools poskytuje velmi rychlé a flexibilní řešení bez nutnosti psát vlastní T-SQL skripty. Příkazy jsou navrženy tak, aby byly konzistentní a snadno použitelné, což výrazně zjednodušuje život správcům databází, kteří hledají efektivní způsoby automatizace a správy úkolů.

Je však důležité si uvědomit, že i když DbaTools poskytuje široké možnosti, stále existují některé situace, které si žádají pokročilou analýzu a případné manuální zásahy. Vždy je dobré mít na paměti možnosti ladění a ověřování stavu úkolů, zejména při řešení problémů souvisejících s konfigurací nebo chybami v úlohách.

Jak efektivně využívat metadata v SQL serveru pro analýzu výkonu dotazů a plánů

V moderních databázových systémech, jako je Microsoft SQL Server, je analýza výkonu klíčovým faktorem pro optimalizaci a správu efektivity dotazů. Pro tento účel je důležité pochopit a správně využívat různé pohledy v katalogu SQL, které poskytují podrobné informace o dotazech a vykonávacích plánech. Dva z nejdůležitějších pohledů pro tuto analýzu jsou sys.query_store_query a sys.query_store_plan, které umožňují správcům databáze a vývojářům sledovat a optimalizovat výkon dotazů.

Podrobnosti o dotazech v sys.query_store_query

Pohled sys.query_store_query poskytuje přehled o všech dotazech prováděných v databázi, včetně agregovaných statistik, jako jsou časy kompilace, doby vykonání a počet kompilací. Tento pohled se připojuje k pohledu sys.query_store_query_text, který obsahuje text SQL dotazu, a k pohledu sys.query_context_settings, který uchovává informace o nastavení kontextu pro každý dotaz.

Jedním z hlavních sloupců tohoto pohledu je query_id, který slouží jako primární klíč a identifikuje každý jednotlivý dotaz. Dalším důležitým sloupcem je query_text_id, který se používá k propojení s textem samotného dotazu v jiném pohledu. Tento pohled také obsahuje informace o tom, zda je dotaz interní nebo uživatelský (pomocí sloupce is_internal_query), a poskytuje údaje o parametrech dotazu, což může být užitečné pro pochopení, jak byly parametry použity při kompilaci.

Dalšími užitečnými informacemi v tomto pohledu jsou údaje o kompilaci dotazu, jako je čas první kompilace (initial_compile_start_time), čas poslední kompilace (last_compile_start_time), a průměrná doba kompilace (avg_compile_duration). To vše může pomoci při analýze, zda jsou některé dotazy pomalejší nebo zda se při každém spuštění znovu kompilují, což může mít vliv na výkon.

Analýza vykonávacích plánů v sys.query_store_plan

Kromě detailů o samotných dotazech je klíčové sledovat i vykonávací plány, které jsou generovány při provádění dotazů. Pro tuto analýzu se využívá pohled sys.query_store_plan, který se spojuje s sys.query_store_query pomocí sloupce query_id. Tento pohled poskytuje podrobnosti o plánech vykonání, včetně jejich hashe (query_plan_hash), který umožňuje rychlou identifikaci konkrétního plánu pro daný dotaz.

Kromě hashe plánu obsahuje pohled sys.query_store_plan také informace o typu plánu (plan_type), který může být buď kompilovaný plán, plán dispatcheru nebo plán varianty dotazu. Pomocí těchto informací je možné sledovat, jak SQL server rozhoduje o výběru konkrétního plánu pro dotaz a jaké faktory ovlivňují toto rozhodnutí.

Další důležitou informací je, zda je plán vynucený (is_forced_plan). Vynucení plánu může být užitečné v případech, kdy je třeba zajistit, že SQL Server používá konkrétní plán pro dotaz, aby se předešlo neefektivnímu vykonání, například při změnách v databázovém schématu. Pokud se pokus o vynucení plánu nezdaří, mohou být zobrazeny informace o důvodu selhání ve sloupcích jako last_force_failure_reason a last_force_failure_reason_desc.

Optimalizace výkonu dotazů a plánů

Použití těchto pohledů k analýze výkonu dotazů a plánů umožňuje detailní přehled o tom, jak SQL Server provádí dotazy, jaké plány vykonává a jaké operace zaberou nejvíce času. Tato data mohou být užitečná nejen pro optimalizaci jednotlivých dotazů, ale i pro identifikaci širších problémů s výkonem, jako jsou špatně navržené plány nebo neefektivní využívání indexů.

Kromě analýzy výkonu konkrétních dotazů by měly být sledovány i dlouhodobé trendy v kompilacích a vykonávání dotazů, což umožňuje lepší pochopení výkonnostních změn v systému. Například pokud se zjistí, že dotazy častěji používají různé plány vykonání, může to naznačovat problémy s optimalizátorem dotazů nebo s parametry dotazů, které nejsou efektivně parametrovány.

Pro zajištění stabilního výkonu je také kladeno důraz na monitoring a správu vynucených plánů, které mohou zaručit, že vysoce náročné dotazy vždy využijí optimální plán, což výrazně zlepší celkový výkon databáze. Pro správce databáze a vývojáře je zásadní nejen sledovat aktuální stav, ale také se zaměřit na historické trendy a optimalizace, které mohou vést k dlouhodobému zlepšení výkonu.

Jak navrhnout a implementovat databázi inventáře: Praktické tipy

Při návrhu databáze inventáře pro správu serverů a služeb je klíčové nejen správně definovat strukturu tabulek, ale i pečlivě zvážit volbu datových typů a způsob implementace primárních klíčů. Důležité je také správně implementovat šifrování pro ochranu citlivých údajů, jako jsou hesla k účtům. V této kapitole se zaměříme na konkrétní kroky, jak efektivně navrhnout takovou databázi, jaké datové typy a klíče použít, a jak zajistit bezpečnost uchovávaných dat.

Při navrhování tabulek pro inventář serverů je třeba začít se správným mapováním atributů na názvy sloupců. Například atributy jako "Server name", "Instance name" nebo "Service account name" by měly mít odpovídající názvy sloupců v databázi, jako jsou ServerName, InstanceName a ServiceAccountName. Důležité je také dodržet konvence při volbě datových typů. Pro identifikátory serverů a instancí se doporučuje použití datového typu NVARCHAR(128), což odpovídá standardu používanému SQL Serverem pro ukládání názvů objektů.

Dalším krokem je výběr vhodného datového typu pro každou kategorii. Například pro IP adresu se doporučuje typ NVARCHAR(15), který umožňuje ukládat adresy ve formátu, který zahrnuje číselné hodnoty i tečky. U "service account name" je vhodné použít NVARCHAR(128), což je dostatečné pro většinu názvů účtů. Kromě toho je důležité zvážit i použití datového typu BIT pro atributy, které mají pouze dvě možné hodnoty, jako například "Cluster flag" nebo "Virtual flag", kde 0 označuje fyzický server a 1 virtuální stroj.

Když se podíváme na šifrování dat, je nezbytné, aby hesla uložená v databázi byla chráněna. Pro tento účel je třeba vytvořit Master Key databáze, který bude sloužit jako základ pro další šifrování. Tento proces začíná vytvořením certifikátu, který je šifrován pomocí Database Master Key. Poté lze bezpečně uložit šifrované údaje, například hesla k účtům SA. Tento přístup nejen chrání citlivé údaje, ale i minimalizuje riziko jejich zneužití.

Pokud jde o volbu primárního klíče pro každou tabulku, doporučuje se použít umělý klíč, který je obvykle implementován prostřednictvím sloupce typu INT. Tento klíč zajistí efektivní indexování a referenční integritu tabulek. Pokud byste použili přírodní klíče (například názvy serverů nebo instancí), mohl by být klíč příliš široký a tím by došlo k nadměrnému využívání serverových prostředků, jako je RAM a diskový prostor. Umělý klíč (například typ INT) je efektivnější, protože každý záznam bude zabírat pouze 4 bajty, což je mnohem menší nárok na systémové prostředky.

Při vytváření samotné databáze můžete využít nástroje jako DbaTools pro její rychlé nasazení. Příkaz New-DbaDatabase vám umožní vytvořit základní strukturu databáze, přičemž nastaví parametry jako je kolace, majitel databáze a model obnovení. Tento proces je důležitý nejen pro nastavení optimálního výkonu, ale také pro zajištění konzistence a bezpečnosti dat.

Je také nezbytné, aby databáze měla správně nastavený záložní režim, zejména pokud se jedná o OLTP databázi, kde je nutné pravidelně zálohovat transakční logy. To zajistí, že při nečekaném výpadku serveru budou data chráněna a obnovitelná bez ztrát.

Důležitým krokem při implementaci databáze je také šifrování. Před tím, než začnete ukládat citlivé údaje, je nutné zajistit šifrování, aby byla data chráněna i v případě, že k nim dojde neoprávněná osoba. Tento proces zahrnuje vytvoření šifrovacích klíčů a certifikátů, které jsou následně použity k šifrování citlivých dat jako jsou hesla nebo další přihlašovací údaje.

Každý, kdo se podílí na návrhu a správě takové databáze, by měl být obeznámen s těmito základními principy a nástroji, které mu umožní efektivně a bezpečně pracovat s databázemi a minimalizovat potenciální rizika.