Několik zkušenosti s merge replikací na MSSQL proti SQL serveru CE (PDA)
Merge replikace na MSSQL proti SQL Serveru CE má svůj půvab, který ale odhalíte až po projití minového pole nástrah, o nichž v dokumentací naleznete jen pár sporadických zmínek. Spot jsem napsal proto, abych vás před nástrahami kapriciozních tvůrců CE replikací varoval a v některých případech nabídl i dočasné řešení.
1. Jestliže máte nainstalován na MSSQL Service Pack 3, nainstalujte podporu pro CE replikace na serveru z instalačního balíčku, který si můžete stáhnout zde.
2. Pro CE klienty je podporována jen "merge" replikace. Vytvoření publikace s podporou pro CE klienty je snadné - v průvodci "Create publication wizard" na formuláři "Specify subscriber types" zaškrtněte "Devices running SQL Server CE". Při manuálním vytváření publikace proceduru sp_addMergePublication nastavte argument @sync_mode na N'character' a povolte vytváření "subscription" anonymním klientům (@allow_anonymous = N'true').
3. Jestliže používáte dynamické filtry (to znamená, že filtrujete replikovaná data například podle Id uživatele), tak musí být v replikaci povolena optimalizace přenášených dat na klienta. V průvodci na formuláři "Optimize synchronization" zvolte "Yes, enable data optimization” . Alternativně v proceduře sp_addMergePublication nastavte argument @keep_partition_changes na true.
4. CE klienti NEPODPORUJÍ komprimované snapshoty, proto tuto volbu nikdy nezapínejte.
5. Po instalaci SQL Server CE 2.0 na serveru spustťe MMC konzoli SQL Server Connectivity Managament a vytvořte nový virtuální adresář. Na záložce Http Content Folder vyberte adresář, ve kterém je knihovna sscesa20.dll, která zpracovává požadavky na replikaci od PDA klientů. Virtuální adresář musí mit nastaveno právo Execute, takže MMC konzole vám toto právo nedovolí upravovat. Na záložce Http authentication si můžete vybrat vyžadovaný typ autentizace přistupujících klientů - jestliže se rozhodnete pro anonymní přístup, můžete kliknutím na tlačítko Edit... vybrat účet, pod kterým bude knihovna sscesa20.dll přistupovat ke zdrojům počítače. Na záložce NTFS permissions můžete upravit práva, která jsou přidělena účtu, pod kterým běží IIS - většinou ale není nutné s právy manipulovat, protože průvodce si sám nastaví potřebná práva a nedovolí je přes konzoli změnit. Jen pro upřesnění – IIS replikační agent nemusí být nainstalován na serveru, na němž běží MSSQL s publikací.
6. Dostupnost IIS aplikace si ověříte zadáním adresy souboru sscesa20.dll (například http://RSTEIN2/sqlserverce/sscesa20.dll). Jestliže je soubor správně nainstalován, zobrazí se text "SQL Server CE Server Agent". Když se vám zobrazí chybové hlášení nebo dokonce prohlížec nabídne stažení knihovny, přeregistrujte dll zadáním regsvr32 /i sscesa20.dll.
7. Do databáze s publikací musí mít uživatel povolen přístup a současně musí být uživatel přidán do PAL (Publication Access List) ve vlastnostech publikace. O jakého uživatele se ale jedná?
a) Jestliže používáte v IIS aplikaci anonymní autentizaci a pro přístup k MSSQL Windows autentizaci, přístup do databáze a umístění do PAL se týká uživatele, pod nímž běží IIS replikační agent (IUSR_NazevPocitace nebo účet vybraný v bodě 5).
b) Při "Basic" nebo "Integrated Windows" autentizaci uživatele v IIS aplikaci a Windows autentizaci do MSSQL, musí být povolen přístup do databáze a sočasně přidán záznam do PAL pro všechny uživatele, kteří replikaci provádějí.
c) Při SQL autentizaci do MSSQL je do PAL přidán příslušný SQL účet, kterému je také povolen přístup do databáze.
8. Snapshot publikace by měl být generován do vlastní složky, která je sdílena po síti a má nastavena minimální potřebná práva. Výchozí složka pro snapshoty je po síti totiž dostupná jen přes "administrátorské sdílení" (jméno disku se znakem dolaru na konci).
Složku se snapshotem určíte ve vlastnostech publikace na záložce Snapshot loation. Zaškrtněte volbu "Generate snapshots in this location" a do textového pole Folder zadejte název složky (například \\RSTEIN2\PDAREPLIKACE\PDA_FULL). Při zakládání publikace metodou sp_addMergePublication určete alternativní umístění snapshotu argumentem @alt_snapshot_folder. (@alt_snapshot_folder = '\\RSTEIN2\PDAREPLIKACE\PDA_FULL' ).
Na složce, do které je generován snapshot, musejí být nastavena tato práva.
a. Účty, pod kterými běží služby SQL Server a SQL Server Agent, musejí mít nastaveno plné řízení (Full control).
b. Jestliže používáte v IIS aplikaci anonymní autentizaci, musí mít anonymní účet právo "Read".
c. Jestliže používáte v IIS aplikaci "Basic" nebo "Integrated Windows" autentizaci, musejí mít všechny přistupující účty právo "Read".
9. Ke správě a řízení zařízení na PDA je možné vytvořit odlehčenou verzí replikačního manažera, kterého jsem popisoval v jiném spotu. CE replikační manažer má své zvláštnosti, protože například dotaz na dostupnost MSSQL je nesmyslný, poněvadž CE replikace komunikují jen s replikačním agentem v IIS. Namísto dotazu na MSSQL tedy vytvoříme GET požadavek na soubor sscesa20.dll a zkontrolujeme, jestli se nám vrátil řetězec "SQL Server CE Server Agent".
10. Nepříjemným omezením (chybou) v SQL serveru CE 2.0 je podpora pouze maximálně jedné "subscription" v jedné databázi. Přesněji řečeno - před začátkem práce na projektu jsem si ověřoval, jestli mi SQL CE server bude podporovat dvě "subscription", protože jsem chtěl vytvořit dvě publikace v jednoé databázi. Jedna z nich by byla filtrovaná, druhá nefiltrovaná, což je v souladu s doporučeními v MSDN, jež se zabývají optimalizacemi replikací. Vytvořil jsem tedy dvě zkušební "subscription" v jedné CE databázi a vše proběhlo bez problémů. Problém se vyskytl až při pokusu o první replikaci. První "subscription" byla úspěšně synchronizována se serverem a byl doručen snapshot, při synchronizaci druhé "subscription" byla vrácena chyba "Invalid subscription", která je ale natolik obecná, že jsem nejdříve několikrát generoval znovu snapshot na serveru a zkoušel zakládat nové "subscription". Jako poslední zoufalcovo gesto jsem prohodil pořadí synchronizace obou subscription - synchronizace druhé (původně první) "subscription" selhala. Takže i když se CE server „tváří“, že podporuje paralelně více subscription, nevěřte tomu a adekvátně upravte svůj návrh publikace.
11. API pro replikaci v compact .NET Frameworku představuje rozhraní třídy SqlCeReplication,
Příklad práce s objektem SqlCeReplication:
Vytvoříme pomocnou metodu, abychom měli v replikačním manažeru na jednom místě inicializaci vlastností instance třídy SqlCeReplication.
private SqlCeReplication getDefaultReplicationClass()
{
SqlCeReplication replication = new SqlCeReplication();
//Připojovací řetězec k CE databázi
replication.SubscriberConnectionString = m_connectionString;
//URL IIS agenta (souboru sscesa20.dll)
replication.InternetUrl= m_internetURL;
//Libovolný řetězec, který bude na serveru použit k filtrování tabulek (článků) - v MSSQL hodnotu vlastnosti vrátí funkce HOST_NAME.
replication.HostName = m_hostNameValue;
//Libovolný unikátní identifikátor jednoho PDA klienta
replication.Subscriber = m_subscriberValue;
//Když není prázdné heslo, tak je zvolena "basic" nebo "anonymní" autentizace V IISreplikačním agentovi
if ((m_internetUserPassword != String.Empty) &&
(m_internetUserPassword != null))
{
//Přihlašovací jméno uživatele (IIS replikační agent)
replication.InternetLogin = m_internetUserName;
//Heslo uživatele (IIS replikační agent)
replication.InternetPassword = m_internetUserPassword;
}
//Název databázoveho serveru s publikací
replication.Publisher = m_remoteServerName;
//Název databázoveho serveru s publikací
replication.PublisherDatabase = m_remoteDatabase;
//Název publikace
replication.Publication = m_publicationName;
//Typ autentizace k MSSQL (NT nebo SQL)
replication.PublisherSecurityMode = this.m_serverSecurityMode;
//Jestliže je zvolena SQL autentizace k MSSQL, doplníme jméno a heslo
if (m_serverSecurityMode == SecurityType.DBAuthentication)
{
//Přihlašovací jmeno k SQL serveru (SQL účet)
replication.PublisherLogin = m_serverLoginName;
//Heslo k SQL serveru (SQL účet)
replication.PublisherPassword = m_serverLoginPassword;
}
//Vrácení inicializovaného objektu SqlCeReplication
return replication;
}
Metoda pro spuštění replikace.
public bool RunReplication(bool reinitialise)
{
//Resetování členské proměnné,která nese informaci o počtu provedených změn při poslední replikaci
m_totalChanges = 0;
//Získání inicializovaného objektu SqlCeReplication SqlCeReplication ceReplication = getDefaultReplicationClass();
//Podmíněná reinicializace "subscription" (=vynucení si opětovného dodání snapshotu)
if (reinitialise)
{
ceReplication.ReinitializeSubscription(true);
}
try
{
//Metodou Synchronize spustíme replikaci dat. Předtím můžete ještě voláním ceReplication.CreateSubscription založit „subscription“ před první synchronizací. V replikačním manažeru spravují „subscriptions“ speciální metody.
ceReplication.Synchronize();
//Celkový počet změn je součtem změn provedených na klientovi a serveru
m_totalChanges += (ceReplication.PublisherChanges + ceReplication.SubscriberChanges);
return true;
}
catch (Exception e)
{
//Jestliže došlo k chybě, naplníme členskou proměnnou m_lastReplicationError s popisem chyby pro prostého uživateli
m_lastReplicationError = STATIC_REPLICATION_ERROR_MESSAGE + Environment.NewLine + e.Message;
return false;
}
finally
{
//Objekt SqlCeReplication používá neřízené prostředky, proto zavoláme jeho metodu Dispose.
if (ceReplication!= null)
{
ceReplication.Dispose();
}
}
}
Tento kód předpokládá, že MSSQL server s rolí „publisher“ je současně i „distributor“ publikace.
12. Jestliže chcete zjistit, jaké chyby při replikaci nastaly, tak po zachycení výjimky SqlCeException projděte její kolekci Errors, která obsahuje objekty SqlCeError, a zkontrolujte jejich vlastnosti Hresult, Message, NativeError a Source.
13. Na serveru můžete logovat činnost IIS replikačního agenta přidáním nového klíče do registrů pod větev HKLM\Software\Microsoft\MSSQLSERVERCE\Transport. Klíč musí být typu DWORD a jeho názvem musí být fyzická (!ne virtuální) cesta k adresáři, v němž je umístěn soubor sscesa20.dll, doplněná řetězcem LOGGING_LEVEL. Hodnota klíče musí být v intervalu od 0 do 3 (0 – logování vypnuto, 1 – logování chyb, 2 – logování chyb a varování, 3 – logování chyb, varování a všech informativních hlášení). Po zapnutí nebo změně úrovně logování musíte restartovat IIS. Soubor s logem je vytvořen v adresáři IIS replikačního agenta a jmenuje se Sscerepl.log. (klíč c:\Inetpub\Sqlce20Agent\ LOGGING_LEVEL s hodnotou 1 zapne po restartu IIS logování chyb do souboru c:\Inetpub\Sqlce20Agent\ Sscerepl.log).
14. V books online pro SQL CE 2.0 si pozorně prostudujte článek o mapování mezi datovými typy MSSQL a SQL CE 2.0 (MSSQL ), abyste již při návrhu databáze počítali se všemi omezeními SQL CE klienta. Článek má název Supported Data Types and Data Type Mappings.
Sunday, September 12, 2004 6:35:00 PM (Central Europe Standard Time, UTC+01:00)
(MS)SQL tipy a triky
Další hrátky s Merge replikací
Tak dnes jsem si lál do příliš brzy zpychlých individuí, protože ve spotu z minulého týdne jsem se chlubil, jak se nám podařilo Merge replikaci zkrotit. Dnes za mnou přišel tester, který dostal za úkol vyzkoušet replikaci ve Virtual PC s Windows XP a souborovým systémem FAT. Uznávám, kombinace Windows XP a FAT zní nesmyslně, ale z mně neznámého důvodu ji na některých stanicích náš zákazník používá, a my jsme si chtěli být jisti, že nebudou při zítřejším releasu žádné problémy.
Tester přišel, že se mu nedaří založit subscription. Vždy nastala tato výjimka :
"System.Runtime.InteropServices.COMException(0x80004005). The subscription to publication <nazev publikace> is invalid.
Překvapilo mě, že k založení "subscription" přes tuto hlášku došlo, protože se zobrazila v sekci Subscriptions v Enterprise manageru. Vyzkoušel jsem založení "subscription" na třech dalších počítačích, virtuálních i hmotných.:) Vše proběhlo bez problémů. Po několika neúspěšných pokusech o založení "subscription" na stroji s XP a FAT, jsem se pokusil zaregistrovat inkriminovaný MS SQL server v mém Enterprise Manageru . Přitom jsem si všiml, že občas se název MSSQL serveru zobrazí, občas ne, registrace selže, ale za 10 sekund již proběhne bez problémů. Začal jsem mít podezření, že jde o síťový problém. Tester se mi až po mém přímém a přiznám už dost nevrle a neomaleně formulovaném dotazu, jaké že to koniny musel provádět s názvem stanice, přiznal, že po instalaci MSSQL změnil název počítače. Vrátit původní název stanici ale nestačilo. Bylo třeba znovu zaregistrovat jméno MSSQL serveru.
Musíte nejdříve zjistit, pod jakým jménem se MSSQL hlásí.
select @@SERVERNAME
Poté odregistrujete server ze seznamu známých serverů.
sp_dropserver <Současný název serveru>
Server znovu zaregistrujete se správným jménem a parametrem 'local'. Pouze jeden server může být registrován jako "local" Od této chvíle bude proměnná @@SERVERNAME vracet nový název.
sp_addserver <Nový název> , 'LOCAL'
Ještě můžete zkontrolovat, že procedura sp_addserver opravdu úspěšně proběhla. Lokální server musí mít ve sloupci Id nulu.
sp_helpserver
Poučení? Merge replikace je opravdu zkrocena, jen nad kreativními testery je třeba nestále práskat varovným bičem. Nemám rád kritickou podmínku úspěchu zvanou lidský faktor.:)
Tuesday, May 18, 2004 7:58:00 PM (Central Europe Standard Time, UTC+01:00)
(MS)SQL tipy a triky
Zkrocení zlé ženy - "Merge" replikace na MSSQL aneb co v MSDN nenaleznete
"Merge" replikace v MSSQL se používá hlavně tehdy, když má více uživatelů paralelně pořizovat data v odpojeném (offline) režimu. Bonbónkem je u "merge" replikace podpora mobilních klientů (PDA). Uživatelé se připojí, pořízená data odreplikují na server a server jim na oplátku doručí změny v datech provedené ostatními uživateli. Typickými kandidáty na integraci "merge" replikace do designu aplikace jsou systémy pro podporu obchodních zástupců v terénu. Proč se psát s vlastní komponentou pro replikaci, když je zde komponenta již dostatečně otestovaná Microsoftem na nezanedbatelném množství pokusných králíků.:) . Provoz systému s replikacemi ale přesto není triviální, protože se po čase začnou objevovat problémy, jejichž řešení po mobilním telefonu s obchodním zástupcem vyžaduje velkou dávku sebezapření a neustálého sebeujišťování, že si právě teď zasluhujete plat, takže není žádoucí mezi zuby procedit jadrné hodnocení ohledně intelektální potence protějšku, s nímž právě hovoříte.
Proto jsem pro replikace napsal manažera replikaci, jenž je natolik inteligentní, že uživatele většinou ignoruje a jen občas mu dovolí kliknout na nějaké tlačítko :) Na co byste tedy při návrhu vlastního manažera replikací neměli zapomenout?
Ještě upozorňuji, že tato doporučení se týkají hlavně mně důvěrně známé konfigurace, kdy uživatelé přistupují přes VPN k MSSQL serveru s publikací a na svém počítači jsou přihlášení pod lokálním (ne doménovým) účtem. Uživatelé mají na svém počítači databázi MSDE 2000.
1) Ověření dostupnosti lokálního databázového serveru.
2) Kontrola existence lokální databáze, do níž jsou replikována data.
3) Manažer má v rozhraní metody pro založení a zrušení lokální databáze. V konfiguračním souboru je cesta k souborům se skripty pro zrušení a založení databáze.
4) Ověření dostupnosti serveru (počítače) s replikacemi - "Ping".
5) Zjištění, že na serveru běží MSSQL. Prakticky se jedná o ověření, že se lze připojit na port, na němž "poslouchá" MSSQL (standardně se jedná o port 1433).
6) Manažer musí umět založit novou "subscription". "Subscription" je aktivní relace mezi jedním klientem replikace a MSSQL. Na "subscription" je navázána kompletní historie provedených replikací a prohlédnout si ji můžete v Enterprise Manageru. Po uplynutí nastaveného intervalu neaktivity replikace jsou "subscription" na serveru vymazány. Když obchodní zástupce odjede na čtrnáctidenní dovolenou, tak za existenci této metody si můžete dát pořádného panáka Four Roses. Lépe dva:)
7) Komplementární k metodě pro založení "subscription" je pochopitelně metoda pro zrušení staré "subscription".
8) Reinicializace "subscription" bez ztráty existujících lokálních dat. Například při podezření na neúplné schéma databáze u klienta je nutné znovu doručit inicializační snapshot se schématem. Je zbytečné zakládat novou "subscription", postačí reinicializace stávající.
9) Ověření dostupnosti složek, ve kterých je uložen snapshot. Inicializační snapshot musí být před zahájením replikace dostupný. Ověření dostupnosti složek probíhá až po impersonaci uživatele (viz bod 11).
10) Ověření dostupnosti pracovní složky na lokálním počítači, ve které je rozbalován snapshot. Ověření dostupnosti složky probíhá opět až po impersonaci uživatele (viz bod 11).
11) Impersonace speciálního uživatele, který má doménový účet v síti s MSSQL serverem, na němž je vytvořena publikace. Účet má přístup jen k složkám se snapshoty a k lokálnímu pracovnímu adresáři replikace. Celá replikace běží pod tímto speciálním účtem. Impersonaci nemůžete provádět na počítačích, na kterých jsou nainstalovány operační systémy Windows 98 nebo ME.
12) A samozřejmě musíte mít metodu pro spuštění replikace.
A na konec. Měli byste zájem o nějaký podrobný tutorial o vytváření replikací?
Tuesday, May 11, 2004 9:41:00 PM (Central Europe Standard Time, UTC+01:00)
.NET Framework | (MS)SQL tipy a triky