Rozdělení komponent
V předchozím dílu jsem vysvětlil teorii instancí SQL Serveru. Tedy fakt, že na jednom databázovém serveru může pracovat nezávisle na sobě několik instancí databázového systémů. I když se budete potýkat většinou jen s jednou instancí, nemyslím, že je na škodu vše probrat scénářem, kdy máme instancí víc – pomůže to k pochopení některých principů.
Způsob komunikace - protokol
Databázový systém má za úkol poskytnout rozhraní přes které se připojuje klientská aplikace, aby mohl posílat příkazy, jenž se mají proti databázi vykonat. Způsobů navázání komunikace v SQL Serveru je hned několik. Liší se rychlostí i dostupností. Jsou to konkrétně tyto čtyři:
- Sdílená paměť (shared memory) – přístup přes sdílenou paměť je bezesporu nejrychlejším nejméně problémovým způsobem komunikace. Nevyžaduje žádné nastavování a bývá implicitně povolen. Jeho nevýhodou je fakt, že funguje jen v rámci jednoho počítače – klient tedy musí být umístěn na počítači, kde běží databázový systém.
- Pojmenované roury (named pipes) – další způsob mezi-procesové komunikace. Tentokrát však pro komunikaci jak v rámci jednoho počítače, tak v rámci lokální sítě. U tohoto způsobu komunikace se navíc nastavuje textové jméno komunikační roury, což je při tomto způsobu komunikace vyžadováno – co by to bylo za pojmenovanou rouru, kdyby neměla jméno… Obecně se ale doporučuje využívat ke komunikaci místo pojmenovaných rour raději rozšířenější TCP/IP.
- VIA – Virtual Interface Adapter (adaptér virtuálního rozhraní) – Tento protokol se využívá pouze v případech komunikace se speciálně určeným VIA hardwarem. S takovým hardwarem jsem se zatím nesetkal a ani dokumentace jej moc neřeší. Myslím, že to i celkem dobře vystihuje oficiální popis: For information about how to use VIA, contact your hardware vendor. Jinými slovy – tento protokol nepoužívejte, pokud k tomu nebudete mít dobrý důvod.
- TCP/IP – Nejpoužívanější a oficiálně nejdoporučovanější protokol. Při správné konfiguraci pracuje v rámci stejného počítače, místní sítě i internetu. U TCP/IP již narážíme na komplexnější konfiguraci. Tu ale vysvětlím až na konci článku.
Je dobré vědět, že každý z těchto protokolů může být zapnut. Vzájemně se neovlivňují a po otevření k databází nemají žádná omezení. Rozdíly plynou pouze z rychlosti a způsobu navázání a udržení spojení. Protokoly jsou implementovány do klientských knihoven, takže to vývojáře trápit nemusí. V praxi se pravděpodobně setkáte pouze s protokoly shared memory a TCP/IP. Ostatní potřebovat nebudete a je zbytečné se jimi proto zabývat.
Co se doporučeného nastavení týče, vhodné je povolit Shared memory společně s TCP/IP – díky tomu je komunikace v rámci serveru realizována pomocí Shared memory a přes síť pomocí TCP/IP. Ve chvíli, kdy nechceme, aby bylo možné se připojit z jiného počítače, nechme aktivní pouze Shared memory (což bývá defaultní stav a tak není ze základu možné se připojit přes síť).
Nástroj, kde lze jednotlivé protokoly nastavovat ukážu společně s nástroji pro správu v následujících odstavcích. Všechny nástroje naleznete po instalaci v nabídce Start v kategorii Microsoft SQL Server 2008.
Nástroj: SQL Server Installation Center
Jedná se o pomocnou utilitu přidanou do SQL Serveru 2008, která má za úkol pomoct se spouštěním instalačních a updatovacích procesů. Zároveň poskytuje odkazy na dokumentaci a nástroje pro zjištění instalovaných instancí a komponent, či na kontrolu splnění systémových požadavků. Funkce se hodí především při první instalaci jako analytický nástroj, zda je připraveno vše, co je potřeba a zda je již nainstalovaná nějaká instance – ostatně při spuštění instalaci se prvně spustí tento nástroj ještě před započetím samotné instalace. Pro naše účely je ale zatím zbytečný.
Nástroj: SQL Server Configuration Manager
Tento nástroj konzole je o poznání zajímavější. Je tu také prakticky v nezměněné podobě už ze starší verze. Umožní prohlížet nainstalované instance, nastavit a kontrolovat parametry všech služeb a konfigurovat způsob komunikace databázové služby s klientem.
V dalších odstavcích popisuji funkci jednotlivých položek v levém sloupci.
SQL Server Services
Tady si můžeme prohlédnout všechny služby týkající se SQL Serveru (význam jednotlivých služeb popíšu později) – ideální pro kontrolu, které služby běží, pro nastavování parametrů služeb (klepnutí pravým tlačítkem a volba Vlastnosti). Dále tu máme možnost služby restartovat (klepnutí pravým tlačítkem Restartovat), zastavovat a spouštět – stejně jako v Nástrojích pro správu Windows, jen s tím rozdílem, že zde se zobrazí jen služby týkající se SQL Serveru.
Je to dobrý odrazový můstek při řešení problémů – například: proč se nemůžu připojit k databázi? Běží vůbec služba? Má nastavené automatické spouštění?
Podrobný popis služeb a jejich významu bude následovat dále v článku.
SQL Server Network Configuration
Zde nalezneme tolik pododdílů, kolik máme nainstalovaných instancí. Pro každou z nich je jeden pododdíl Protocols for “jméno instance”. A v každém tomto pododdílu nalezneme konfiguraci všech popsaných komunikačních protokolů. Jak už jsem psal, jednotlivé instance fungují nezávisle na sobě a proto má každá vlastní komunikační nastavení.
V kontextovém menu u každého z těchto protokolů lze nastavit, zda je povolen (Enabled), či zakázán (Disabled). Také je možné otevřít vlastnosti a upravit konfiguraci konkrétního protokolu.
SQL Native Client Configuration – Client protocols
Tento oddíl nemá s nastavením serveru prakticky nic společného. Definuje totiž v jakém pořadí se mají vyzkoušet protokoly pro připojení k serveru, pokud je tato stanice klientem. Pokud tedy například zde zakážeme TCP/IP, nikdy se z tohoto počítače nepřipojíme k žádnému SQL Serveru pomocí tohoto protokolu. Defaultní nastavení zkouší připojení v tomto logickém pořadí:
- Shared memory – nejrychlejší připojení
- Pokud nelze využít Shared memory, tak TCP/IP na defaultním portu 1433
- Pokud nelze využít ani TCP/IP, tak Named Pipes
- Protokol VIA bývá standardně zakázán
Toto nastavení necháváme běžně na těchto přednastavených hodnotách.
SQL Native Client Configuration – Aliases
SQL Server není obvykle neoddělitelnou součástí aplikace a čas od času se můžeme setkat s problémem, kdy je aplikace nastavena na komunikaci s konkrétním serverem a server buď již neexistuje nebo jej chceme dočasně změnit. Pokud je změna konfigurace připojovacích adres složitá, lze použít právě SQL Server Alias. Tím definujeme: pokud se kterákoliv aplikace připojující se z tohoto počítače pokusí připojit na server uvedený jako jméno aliasu (Alias name), komunikace se místo toho přesměruje na adresu serveru (Server) pod zvoleným prokolem (Protocol) a portem (Port No).
Následující obrázek ukazuje, jak na počítači, kde běží klientská aplikace, definovat alias pro připojování na server “staryServer”. Klient se bude místo toho automaticky připojovat na “novyServer”:
Nástroj: SQL Server Management Studio (SSMS)
SQL Server Management Studio (nebo zkráceně SSMS) slouží k připojení k instanci a k vizuální komunikaci s databází. Je to nástroj pro databázové specialisty a jeho úkolem je provádět všechny běžné operace s konkrétní databází, či celou instancí SQL Server. Zobrazuje připojené databáze v rámci instalované instance, dovoluje procházet a editovat jednotlivé databázové objekty, spouštět SQL příkazy a mnoho dalšího. Tomuto nástroji se v celém seriálu budu věnovat velmi často a budeme jej využívat prakticky na všechno.
Ve chvíli, kdy se podaří nakonfigurovat instance do požadovaného stavu, stává se SSMS prakticky jediný nástroj, který pro další správu potřebujete.
Význam jednotlivých služeb
Služba SQL Server (jméno_instance)
Toto je hlavní služba konkrétní instance SQL Serveru. Řeší jak přístup k datovým souborům, transakce, vykonávání a optimalizaci dotazů, tak komunikaci s klienty. Tato služba je jako jediná naprosto nezbytná k fungování konkrétní instance SQL Serveru.
Služba SQL Server Agent (jméno_instance)
Této služby si nevšímejte. SQL Server Agent je totiž služba, která má za úkol spouštět plánované úlohy a obecně automatizované úlohy SQL Serveru. V edici Express však není dostupná. V tomto seznamu ji sice můžete nalézt, ale spustit se vám ji nepodaří.
Služba SQL Full-text Filter Deamon Launcher (jméno_instance)
Služba starající se o indexaci obsahu databáze pro fulltextové vyhledávání. Pokud není fulltext instalovaný, služba se zde nezobrazí. Pokud není služba spuštěna, fulltextové vyhledávání nebude fungovat (tedy fungovat bude, ale nebude se aktualizovat index).
Tato služba bývá nastavena s manuálním spouštěním. Pokud to tak je, změňte nastavení na automatické spouštění ve vlastnostech v SQL Server Configuration Manageru, aby se spustila po startu systému (což je doporučené nastavení):
Služba SQL Server Browser
SQL Server Browser je služba společná pro všechny instance. Má za úkol dávat jednotně vědět klientům o instancích na serveru a způsobech jak s k nim připojit. Účelem je možnost se připojovat na instance bez nutnosti znát přesné parametry připojení (protokol, port a podobně). Stačí vědět pouze adresu serveru a jméno instance.
Celý proces pak funguje tak, že při spuštění si tato služba přečte konfiguraci protokolů pro všechny instance a začne poslouchat na napevno daném UDP portu 1434, který je také napevno definován v knihovnám sloužících jako klient pro připojování k SQL Serveru. Pokud se ze sítě pokusí kdokoliv připojit na pojmenovanou instanci, nejdříve si pošle požadavek na zjištění po tomto UDP kanálu a služba vrací odpověď o způsobu připojení – například: pro požadovanou instanci “SQLEXPRESS” se připoj na TCP/IP portu 2345. Tento proces je plně automatický a vývojář o něm nemusí vůbec vědět – toto je spíše věc na administrátora, který musí otevřít na firewallu UDP 1434 pro SQL Server Browser a příslušný TCP/IP port pro SQL server.
Vše jde ale vyřešit i bez SQL Server Browseru připojením na ručně zadaný port. Jedná se tedy jen o doplňkovou funkci, která neudělá nic jiného, než že nás odstíní od nutnosti znát konfiguraci protokolů. Běh této služby proto není nutností.
Ostatní služby
SQL Server ve vyšších edicích obsahuje řadu dalších služeb. Ty tu však nebudu popisovat.
Jak funguje připojování k instancím pomocí sdílené paměti?
Pokud máte aktivní protokol Shared memory (sdílená paměť), můžete v rámci počítače přistupovat k pojmenovaným i defaultním instancím. Nepotřebujete mít spuštěný proces SQL Server Browser, ani otevřené žádné porty. Navíc tato volba je bez konfigurace, nejrychlejší a zkouší se jako první – je defaultní.
Při připojování pak můžeme v rámci lokální PC použít:
- Připojit se k: “JménoPočítače” nebo “.” nebo “(local)” – všechny tyto varianty nás připojí k defaultní instanci na lokálním PC
- Připojit se k: “JménoPočítače\JménoInstance” nebo “.\JménoInstance” nebo “(local)\JménoInstance” – všechny tyto varianty nás připojí k pojmenované instanci na lokálním PC
Jak funguje připojování pomocí TCP/IP?
Pravidla pro zápis jména serveru při připojování přes Shared memory jsou jednoduchá. U nastavení TCP/IP je to bohužel trochu složitější a velká část lidí v tomto nemá úplně jasno. Zkusím to popsat co nejstručněji.
Nastavení TCP/IP protokolu pro připojování na instanci SQL Serveru má 2 režimy (jak je nastavit vysvětluji na konci článku):
- Statický port – instance poslouchá na pevně daném TCP portu (klasický problém – 2 instance mají stejný statický port – jedna z nich proto nelze spustit – pozor na to!)
- Dynamický port – TCP port na kterém služba instance poslouchá se volí automaticky při startu služby (u této varianty je nutné, aby běžel SQL Server Browser a dokázal o přiděleném portu říct klientům)
Je dobré dodat, že při instalaci SQL Serveru je možné nevědomky přednastavit oba režimy (aneb proč se administrátoři diví, že někdy je port pevný a někdy jej musí nastavovat):
- Pokud instalujeme pojmenovanou instanci, automaticky se nastavuje dynamický port a připojení ze sítě je tak možné jen se službou SQL Server Browser
- Pokud instalujeme defaultní instancí (bez jména), automaticky se nastavuje pevný TCP port 1433
Připojujeme-li se k nějaké instanci, máme tyto možnosti:
- Připojit se k: “JménoServeru\JménoInstance” – připojujeme se k pojmenované instanci – nejdříve se automaticky pomocí UDP protokolu na portu 1434 zkontaktuje SQL Server Browser s žádostí o informaci o nastavení protokolu ke konkrétní instanci. Pokud přijde odpověď, klient se připojí k příslušnému TCP/IP portu.
- Připojit se k: “JménoServeru,12345” – tímto způsobem zapíšeme adresu serveru se specifikovaným portem – tudíž instance není vyhledávána, protože se již připojujeme na konkrétní TCP/IP port. Vhodné pokud je nastaven statický port a nechceme mít zapnutý SQL Server Browser.
- Připojit se k: “JménoServeru” – v tomto případě se také nekontaktuje SQL Server Browser. Připojujeme se totiž na defaultní instanci a tak se klientská knihovna připojuje přímo na port TCP 1433, na které očekává defaultní instanci.
Pár tipů jak postupovat při konfiguraci
Pokud se připojujete ke stejnému PC, nemusíte nic řešit – využijete Shared memory protokol, který je defaultně zapnutý.
U připojování ze sítě máte několik možností. Jedno z nejjednodušších řešení je nastavit u všech instancí statické TCP porty. Při připojování se pak můžete rozhodnout, zda použít adresu s pevně zadaným portem (například “server,1234”) nebo případně zapnout SQL Server Browser a získat tak možnost připojení přes jméno instance (například “server\instance”). V prvním případě stačí ve firewallu nastavit otevřený příchozí port, podle toho, který jsme zvolili jako statický. U verze se SQL Server Browserem je navíc potřeba otevřít UDP 1434, aby se mohl klient dotázat serveru na na konkrétní instanci.
Mnoho administrátorů dává přednost verze bez SQL Server Browseru. Konfigurace je jednoduší, potřebujete mít otevřený pouze jeden statický TCP port a nemusíte řešit jména instancí - stačí znát pouze port.
Pokud používáte jen jednu instanci (což je pravděpodobné), nastavte ji pevný port na TCP/IP 1433. Připojovat se pak můžete vzdáleně jen přes jméno serveru (i když se nejedná o defaultní instanci). Je to z toho důvodu, že pokud neuvedete ani jméno instance, ani port, připojuje se klient na defaultním portu 1433 (kde kontaktuje instanci ať už defaultní, či pojmenovaná). U tohoto řešení není také potřeba SQL Server Browser – připojujete se na přímo.
A jak tedy nastavit statický (popřípadě dynamický) port u TCP/IP protokolu?
Pro konfiguraci TCP/IP protokolu spusťte SQL Server Configuration Manager. Zde v oddílu Sql Server Network Configuration otevřete vlastnosti pro TCP/IP protokol nad požadovanou instancí. Na záložce Protocol zkontrolujte, zda je povolen (Enabled = True) a přejděte na záložku IP Addresses:
Na této záložce můžete zapsat nastavení buď pro jednotlivé rozhraní a adresy (IP1, IP2, IP3…) a nebo pro všechny najednou (IPAll). Doporučuji nastavovat vše v sekci IPAll a u jednotlivých IP1, IP2 atp. nechat prázdné hodnoty (stejně jako je to na obrázku). Zajímají nás tyto dvě kolonky:
- TCP Dynamic Ports
- TCP Port
Vyplňme buď jednu hodnotu nebo druhou. Podle toho definujeme, zda chceme použít dynamický port (TCP Dynamic Ports) nebo statický (TCP Port). Nevyplňujte nikdy obě kolonky dohromady, jedna vždy zůstává prázdná.
Při nastavení statického portu vyplníme port (do kolonky TCP Port), který se bude pro komunikaci využívat – port na kterém bude služba naslouchat. U dynamického portu stačí zapsat číslo 0 – při prvním spuštění bude automaticky přidělen volný port (0 se automaticky nahradí za přidělený port).
Pozor: Po uložení je nutné restartovat hlavní službu editované instance, aby byla změna uplatněna.
Závěr
V tomto článku jsem popsal nástroje pro konfiguraci databázového systému SQL Server a nastínil jakým způsobem funguje připojování k instancím SQL Serveru. Doufám, že se mi podařilo vysvětlil význam jednotlivých protokolů, dynamických portů a služby SQL Server Browser. Pokud ano, dokážete nyní správně nakonfigurovat protokoly pro síťové i lokální prostředí, nastavit firewall a pochopit princip práce s více instancemi na jednom serveru. Pokud máte dotazy, ptejte se v diskuzi pod článkem. I když to byla víceméně teorie, věřím, že se jedná o důležité věci, které by měl znát každý, kdo chce SQL Server využívat. Snad byl dnešní článek alespoň trochu srozumitelný a přínosný.
V dalším díle se vrhneme konečně na nástroj SQL Server Management Studio a samotné databáze.