Automatizace instalace SQL Serveru a správné řízení verzí aktualizací jsou klíčové pro efektivní správu IT infrastruktury. Moderní přístupy zahrnují použití samoextrahovatelných souborů a PowerShell skriptů, které usnadňují nasazení a správu databázových instancí bez nutnosti manuálních zásahů. Tato metodika umožňuje nejen rychlou instalaci, ale i flexibilitu při zavádění nových verzí a opravných balíčků.

Jedním z neocenitelných nástrojů je možnost instalace kumulativních aktualizací (CU) během procesu nastavení SQL Serveru. Tento přístup je výhodný zejména v prostředí, kde není implementován WSUS (Windows Server Update Services). Jakmile je schválena nová úroveň opravy, stačí jednoduše vyměnit příslušný soubor aktualizace v síťovém sdílení. Nové instance tak mohou automaticky přijmout nejnovější aktualizace bez nutnosti úpravy PowerShell skriptu pro každou novou instalaci. Tento přístup zjednodušuje proces a minimalizuje chybovost.

Příklad záznamu v PowerShellu pro instalaci SQL Serveru během samotného nastavení je následující. Tento skript nainstaluje instanci SQL Serveru s názvem SCRIPTING2 a zároveň aplikuje CU1, který je umístěn na souborovém serveru:

swift
.\SETUP.EXE /IACCEPTSQLSERVERLICENSETERMS /ACTION="Install" /FEATURES=SQLEngine,Replication /INSTANCENAME="SCRIPTING2" /SQLSVCACCOUNT="MyDomain\SQLServiceAccount1" /SQLSVCPASSWORD="Pa$$w0rd" /AGTSVCACCOUNT="MyDomain\SQLServiceAccount1" /AGTSVCPASSWORD="Pa$$w0rd" /SQLSYSADMINACCOUNTS="MyDomain\SQLDBA" /UPDATEENABLED=1 /UPDATESOURCE="\\192.168.183.1\SQL2022_CU1\" /qs

Je důležité si uvědomit, že účet, který skript používá pro provádění instalace, musí mít příslušná oprávnění k přístupu na sdílený síťový disk.

Dalším způsobem automatizace je použití konfiguračního souboru. V něm jsou definovány všechny potřebné parametry pro instalaci konkrétní instance SQL Serveru, například jméno instance, účet pro službu SQL a další volitelné parametry, jako je aktivace protokolů TCP/IP nebo Named Pipes. Tento soubor může vypadat takto:

makefile
; SQL Server 2022 Configuration File
[OPTIONS] IACCEPTSQLSERVERLICENSETERMS ACTION="Install" QUIETSIMPLE="True" FEATURES=SQLENGINE,REPLICATION INSTANCENAME="EXPERTSCRIPTING3" AGTSVCACCOUNT="MyDomain\SQLServiceAccount1" AGTSVCPASSWORD="Pa$$w0rd" AGTSVCSTARTUPTYPE="Automatic" FILESTREAMLEVEL="1" SQLCOLLATION="Latin1_General_CI_AS" SQLSVCACCOUNT="MyDomain\SQLServiceAccount1" SQLSVCPASSWORD="Pa$$w0rd" SQLSYSADMINACCOUNTS="MyDomain\SQLDBA" TCPENABLED="1" NPENABLED="1"

Pro instalaci SQL Serveru na základě tohoto konfiguračního souboru lze využít následující příkaz:

arduino
.\setup.exe /CONFIGURATIONFILE="c:\SQL2022\Configuration1.ini"

Tato metoda je ideální pro zavedení konzistentního procesu instalace napříč různými servery. Umožňuje vytvořit znovu použitelný skript, který lze použít i v prostředí, kde se nepoužívají technologie jako sysprep pro automatizovanou konfiguraci serverů.

Další pokročilou metodou je kombinace konfiguračního souboru a parametrů předávaných přímo v příkazu. Tento přístup nabízí flexibilitu, pokud se některé parametry liší mezi jednotlivými servery, například jméno instance nebo účet pro službu. Příklad takového příkazu je:

bash
.\SETUP.EXE /INSTANCENAME="SCRIPTING4" /SQLSVCACCOUNT="MyDomain\SQLServiceAccount1" /SQLSVCPASSWORD="Pa$$w0rd" /AGTSVCACCOUNT="MyDomain\SQLServiceAccount1" /AGTSVCPASSWORD="Pa$$w0rd" /CONFIGURATIONFILE="C:\SQL2022\Configuration2.ini"

Tato metoda umožňuje dynamicky přiřazovat specifické parametry pro každou instalaci, čímž zůstává zachována flexibilita a opakovatelnost procesu.

Pokud chcete ještě více zautomatizovat proces, můžete vytvořit parametrizovaný PowerShell skript, který umožní snadné zadání specifických parametrů při každé nové instalaci. V tomto případě je možné využít skript, který přijímá parametry pro název instance a přihlašovací údaje pro služby. Skript bude vypadat například takto:

php
param(
[string]$InstanceName, [PSCredential]$SQLServiceAccountCredential, [PSCredential]$AgentServiceAccountCredential ) $params = @( '/INSTANCENAME="{0}"' -f $InstanceName '/SQLSVCACCOUNT="{0}"' -f $SQLServiceAccountCredential.Username '/SQLSVCPASSWORD="{0}"' -f $SQLServiceAccountCredential.GetNetworkCredential().Password )

Tento skript poskytuje ještě větší flexibilitu, protože si jej můžete přizpůsobit na konkrétní potřeby vaší infrastruktury. Každý nový server tak bude mít stejné parametry pro instalaci SQL Serveru, což umožňuje kontrolu verzí a zjednodušuje správu.

Je třeba mít na paměti, že i když jsou všechny tyto metody vysoce efektivní pro automatizaci procesu, stále existují určité aspekty, které je nutné hlídat. K tomu patří zajištění správných přístupových práv k souborovým sdílením a správa oprávnění pro různé účty, které se používají během instalace. Navíc je nutné pravidelně kontrolovat kompatibilitu verzí a přizpůsobovat skripty, pokud dojde k novým verzím SQL Serveru nebo změnám v provozní infrastruktuře.

Jak automatizovat instalaci SQL Serveru pomocí DSC

V předchozí kapitole jsme se zaměřili na konfiguraci operačního systému Windows pomocí DSC. V této kapitole se zaměříme na rozšíření této konfigurace tak, aby zahrnovala i instalaci instance SQL Serveru. Abychom toho dosáhli, bude nutné nainstalovat modul SQLServerDSC. Tento krok provedeme pomocí příkazu zobrazeného v příkladu 6-14. Tento příkaz musí být spuštěn ve verzi PowerShell 5.

Příklad 6-14. Instalace modulu SQLServerDSC:

powershell
Install-Module SqlServerDsc

Jakmile máme tento modul nainstalovaný, můžeme pokračovat v rozšiřování konfigurace, kterou jsme vytvořili v předchozí kapitole. K tomu přidáme prostředek, který zajistí vytvoření instance SQL Serveru s názvem „DSCInstance“, přičemž použijeme verzi Developer Edition. Tento prostředek je uveden v příkladu 6-15. Všimnete si, že předáváme požadovaný název instance, cestu ke zdrojovým souborům instalačního média SQL Serveru a produktový klíč jako řetězce. K parametru „features“ přidáme hodnotu „SQLENGINE“, ale pokud bychom chtěli nainstalovat více komponent, tento řetězec by byl tvořen seznamem odděleným čárkami. Dále předáváme pole Windows loginů, které chceme přidat do role sysadminů. V našem případě předáváme pouze jeden login – Administrator.

Poznámka: Je důležité změnit cestu ke zdrojovým souborům tak, aby odpovídala umístění instalačních souborů SQL Serveru.

Příklad 6-15. Prostředek InstallInstance:

powershell
SqlSetup 'InstallInstance' { InstanceName = 'DSCInstance' Features = 'SQLENGINE' SourcePath = 'C:\SQL Media' SQLSysAdminAccounts = @('Administrator') ProductKey = '22222-00000-00000-00000-00000' }

Tip: Produktový klíč, který zde předáváme, je klíč pro verzi Developer Edition, což znamená, že tato edice bude nainstalována. Pokud bychom použili klíč pro edice Enterprise nebo Standard, nainstalovala by se odpovídající edice.

V příkladu 6-16 nyní můžeme vidět, jak bude naše rozšířená konfigurace vypadat, když přidáme nový prostředek. Dvě důležité věci, které je třeba si všimnout: První je, že jsme změnili službu, kterou prostředek SQLServerService spravuje, z výchozí instance na DSCInstance, protože právě s touto instancí budeme pracovat. Druhá důležitá věc je, že byla přidána syntaxe „DependsOn = '[SqlSetup]InstallInstance'“ na konec prostředku SQLServerService. To znamená, že nechceme, aby konfigurace spustila službu SQL Server Database Engine dříve, než bude instance nainstalována. Při kompilaci konfigurace není zaručené pořadí, ve kterém budou prostředky aplikovány, a proto je v případě závislosti mezi prostředky vždy doporučeno použít DependsOn, aby se zajistil správný pořádek.

Příklad 6-16. Aktualizovaná konfigurace:

powershell
Configuration WindowsConfig { Import-DscResource -ModuleName 'PSDesiredStateConfiguration' Import-DscResource -ModuleName 'SqlServerDsc' Node 'localhost' { File CreateCertificateBackupsFolder { Ensure = "Present" Type = "Directory" DestinationPath = "C:\CertificateBackups" } Registry OptimizeForBackgroundServices { Ensure = "Present" Key = "HKEY_LOCAL_MACHINE:\SYSTEM\CurrentControlSet\Control\PriorityControl" ValueName = "Win32PrioritySeparation" ValueData = 24 ValueType = 'Dword' } SqlSetup 'InstallInstance' { InstanceName = 'DSCInstance' Features = 'SQLENGINE' SourcePath = 'C:\SQL Media' SQLSysAdminAccounts = @('Administrator') ProductKey = '22222-00000-00000-00000-00000' } Service SQLServerService { Name = 'MSSQL$DSCInstance' StartupType = 'Automatic' State = 'Running' DependsOn = '[SqlSetup]InstallInstance' } } }

Tato konfigurace nyní funguje, ale je poněkud nepružná. Vždy nainstaluje instanci se stejným názvem a vždy použije verzi Developer Edition. Aby byla konfigurace flexibilnější, můžeme ji parametrizovat, což nám umožní při použití konfigurace předat název instance a produktový klíč, které budou odpovídat konkrétnímu uzlu. Parametrizovanou verzi konfigurace naleznete v příkladu 6-17. Všimněte si, že byla přidána blok „param“, který přijímá parametry pro název instance a edici. Parametr $SQLInstanceName je nastaven na hodnotu „MSSQLSERVER“, což znamená výchozí instanci. K dispozici je také blok IF...ELSE IF..., který podle předané edice vypočítá, který produktový klíč použít.

Poznámka: Pro tento příklad byl použit produktový klíč pro verzi Evaluation Edition jak pro edice Enterprise, tak pro edice Standard. Tyto produktové klíče by měly být nahrazeny vlastními klíči pro edice Enterprise a Standard.

Příklad 6-17. Parametrizovaná konfigurace:

powershell
Configuration WindowsConfig { param ( [string] $SqlInstanceName = 'MSSQLSERVER', [Parameter(Mandatory)] [ValidateSet('Developer', 'Standard', 'Enterprise')] [string] $Edition ) Import-DscResource -ModuleName 'PSDesiredStateConfiguration' Import-DscResource -ModuleName 'SqlServerDsc' if ($Edition -eq 'Developer') { $ProductKey = '22222-00000-00000-00000-00000' } elseif ($edition -eq 'Standard') { $ProductKey = '00000-00000-00000-00000-00000' } elseif ($edition -eq 'Enterprise') { $ProductKey = '00000-00000-00000-00000-00000' } Node 'localhost' { File CreateCertificateBackupsFolder { Ensure = "Present" Type = "Directory" DestinationPath = "C:\CertificateBackups" } Registry OptimizeForBackgroundServices { Ensure = "Present" Key = "HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl" ValueName = "Win32PrioritySeparation" ValueData = 24 ValueType = 'Dword' } SqlSetup 'InstallInstance' { InstanceName = $SqlInstanceName Features = 'SQLENGINE' SourcePath = 'C:\SQL Media' SQLSysAdminAccounts = @('Administrator') ProductKey = $ProductKey } Service SQLServerService { Name = 'MSSQL${0}' -f $SqlInstanceName StartupType = 'Automatic' State = 'Running' DependsOn = '[SqlSetup]InstallInstance' } } }

Nyní můžeme předat parametry do příkazu Start-DscConfiguration pro aplikování této konfigurace. Příkaz v příkladu 6-18 použije konfiguraci, zajistí, že instance DSCInstance bude existovat a použije Developer Edition. Vzhledem k tomu, že předáváme parametry, musíme nejprve dot-source skript, aby byl součástí stejné relace jako volající kontext.

Příklad 6-18. Aplikování parametrizované konfigurace:

powershell
# dot source the configuration file . C:\Scripts\WindowsConfig.ps1 # compile the configuration WindowsConfig -Edition Developer -SqlInstanceName 'DSCInstance2' # apply the configuration Start-DscConfiguration -Path "C:\Scripts\WindowsConfig" -Verbose -Wait

Tímto způsobem je možné zajistit, že konfigurace je nejen flexibilní, ale i snadno přizpůsobitelná pro různé edice SQL Serveru, což eliminuje nutnost ručně provádět každou instalaci.

Jak správně navrhnout a spravovat databázi pro inventář?

Vytváření dobře navržené databáze pro inventář může výrazně zjednodušit práci správců databází (DBA), automatizovat údržbu a poskytovat centrální úložiště informací pro další procesy. Správný návrh databáze však vyžaduje pečlivé zvážení jak platformových požadavků, tak logického a fyzického návrhu tabulek. Na každém kroku je nutné mít na paměti nejen funkčnost databáze, ale i její bezpečnost a efektivitu. Tento proces zahrnuje několik klíčových aspektů, jako je zálohování šifrovacích klíčů, tvorba certifikátů a symetrických klíčů, a také bezpečné uložení citlivých dat, například hesel.

Představme si, že začínáme s vytvořením zálohy hlavního šifrovacího klíče, což je základní krok pro ochranu našich citlivých informací. Pomocí skriptu, jak je uvedeno v příkladu, můžeme zálohovat hlavní klíč databáze, který bude použit pro šifrování všech dalších dat v databázi. Tento krok je nezbytný, protože v případě selhání šifrovacího mechanismu je nutné mít zálohu, která zaručí, že data budou stále chráněna. Zálohování je prováděno skrze příkaz Backup-DbaDbMasterKey, který uloží klíč do určené složky.

Stejně důležitým krokem je vytvoření certifikátu, který bude použit pro šifrování dat v databázi. Tento certifikát musí být zálohován podobně jako hlavní klíč, aby bylo možné jej obnovit v případě potřeby. Pomocí příkazu New-DbaDbCertificate se certifikát vytvoří, a stejně jako v předchozím případě, bude nutné ho zálohovat pro budoucí použití. Certifikát slouží jako základ pro vytvoření symetrického klíče, který bude použit přímo pro šifrování citlivých dat, například hesel.

Dalším krokem je vytvoření symetrického klíče, který bude šifrovat konkrétní data. Tento klíč je vytvořen pomocí certifikátu, a v praxi je to jeden z nejdůležitějších prvků pro bezpečné ukládání citlivých informací, jako jsou přihlašovací údaje. V případě, že použitý nástroj nedovoluje vytvoření klíče přímo skrze DbaTools, lze použít alternativní příkaz Invoke-DbaQuery, který umožňuje spustit T-SQL skript pro vytvoření symetrického klíče.

Jakmile máme šifrovací mechanismy v pořádku, dalším krokem je vytvoření tabulek pro ukládání informací o inventáři. I když existují nástroje, které usnadňují tento proces, mnozí správcové dávají přednost psaní vlastního SQL skriptu, který umožňuje lepší kontrolu nad tím, co se děje v databázi. V našem případě vytváříme několik tabulek pro uložení informací o serverech, službách a instancech. Zajímavostí je, že některé sloupce, například pro ukládání šifrovaných hesel, jsou definovány jako VARBINARY(256), aby bylo možné bezpečně ukládat šifrované hodnoty.

Celý tento proces, od zálohování klíčů až po vytvoření schématu tabulek, má za cíl vytvořit robustní a bezpečnou databázi pro správu inventáře. Tento přístup je vhodný pro organizace, které potřebují centralizovaně spravovat informace o svých serverech a databázích, a zároveň zajistit jejich ochranu před neautorizovaným přístupem.

Vždy však mějte na paměti, že správná implementace HA/DR (High Availability / Disaster Recovery) strategií je nezbytná pro udržení dostupnosti a integritě databáze. Ačkoli tento příklad ukazuje pouze část celkového návrhu, je třeba zvážit i umístění databáze, aby nedošlo k izolaci datového centra nebo ke ztrátě dat v případě havárie. Ideálně by měla být databáze geograficky rozdělena, což pomáhá zajistit „nízkou“ údržbu a vysokou dostupnost.

Co se týče samotného návrhu databáze, je doporučeno používat normalizaci dat, která byla vynalezena v roce 1970 pro eliminaci redundantních dat a zajištění integrity databáze. Normalizace pomáhá optimalizovat prostor, usnadňuje údržbu a zajišťuje, že data jsou správně uspořádána, což je klíčové pro efektivní fungování databáze v dlouhodobém horizontu.