Frissíthető előfizetések – Tranzakciós replikációhoz

A következőkre vonatkozik:SQL Server

Megjegyzés:

Ez a funkció továbbra is támogatott az SQL Server 2012 és 2016 közötti verzióiban. Ez a funkció az SQL Server egy későbbi verziójában lesz eltávolítva. Ne használja ezt a funkciót az új fejlesztési munkában, és tervezze meg a funkciót jelenleg használó alkalmazások módosítását.

A tranzakciós replikáció támogatja az előfizetők frissítéseit az frissíthető előfizetéseken és a társközi replikáción keresztül. Az alábbiakban az frissíthető előfizetések két típusát különböztetjük meg:

  • Azonnali frissítés. A Közzétevőnek és az Előfizetőnek csatlakoznia kell az előfizetői adatok frissítéséhez.

  • A Publisher és az Előfizető nincs szüksége folyamatos kapcsolatra a feliratkozó adatainak frissítéséhez. Frissítéseket lehet végrehajtani, amikor az előfizető vagy a közzétevő offline állapotban van.

Ha az adatok egy előfizetőnél frissülnek, a rendszer először a Közzétevőbe propagálja, majd más előfizetőknek propagálja. Ha azonnali frissítést használ, a rendszer azonnal propagálja a módosításokat a kétfázisú véglegesítési protokoll használatával. Ha várólistás frissítést használ, a módosítások egy üzenetsorban lesznek tárolva; az üzenetsorba helyezett tranzakciók ezután aszinkron módon lesznek alkalmazva a Publisherben, amikor rendelkezésre áll a hálózati kapcsolat. Mivel a frissítéseket aszinkron módon propagálja a Közzétevő, előfordulhat, hogy ugyanazokat az adatokat frissítette a Közzétevő vagy egy másik előfizető, és ütközések léphetnek fel a frissítések alkalmazásakor. Az ütközések észlelése és feloldása a kiadvány létrehozásakor beállított ütközésfeloldási szabályzatnak megfelelően történik.

Ha az Új kiadvány varázslóban frissíthető előfizetésekkel rendelkező tranzakciós kiadványt hoz létre, akkor az azonnali és az üzenetsoros frissítés is engedélyezve lesz. Ha tárolt eljárásokkal hoz létre kiadványt, engedélyezheti az egyik vagy mindkét beállítást. Amikor előfizetést hoz létre a kiadványhoz, meg kell adnia a használni kívánt frissítési módot. Ezután szükség esetén válthat a frissítési módok között. További információ: "Váltás a frissítési módok között".

A tranzakciós kiadványokhoz tartozó frissíthető előfizetések engedélyezéséhez engedélyezze a tranzakciós kiadványok előfizetéseinek frissítését

A tranzakciós kiadványokhoz használható előfizetések létrehozásához lásd: Frissíthető előfizetés létrehozása tranzakciós kiadványhoz (Management Studio)

Váltás a frissítési módok között

Frissíthető előfizetések használatakor megadhatja, hogy az előfizetések egy frissítési módot használjanak, majd váltson a másikra, ha az alkalmazás megköveteli. Megadhatja például, hogy az előfizetések azonnali frissítést használjanak, de ha egy rendszerhiba a hálózati kapcsolat megszakadását eredményezi, váltson az üzenetsoros frissítésre.

Megjegyzés:

A replikáció nem vált automatikusan a frissítési módok között. A frissítési módot az SQL Server Management Studióban kell beállítania, vagy az alkalmazásnak meg kell hívnia sp_setreplfailovermode (Transact-SQL) a módok közötti váltáshoz.

Ha az azonnali frissítésről az üzenetsor-frissítésre vált, nem válthat vissza azonnali frissítésre, amíg az Előfizető és a Közzétevő nem csatlakozik, és a Várólista-olvasó ügynök az üzenetsor összes függőben lévő üzenetét a Közzétevőre alkalmazza.

Váltás a frissítési módok között

A frissítési módok közötti váltáshoz engedélyeznie kell a kiadványt és az előfizetést mindkét frissítési mód esetében, majd szükség esetén váltania kell közöttük. További információ:
Váltás a frissíthető tranzakciós előfizetés frissítési módjai között.

Az frissíthető előfizetések használatának szempontjai

  • Ha egy kiadvány engedélyezve van az előfizetések vagy az üzenetsoros frissítési előfizetések frissítéséhez, a beállítás nem tiltható le a kiadványhoz (bár az előfizetéseknek nem kell használniuk). A beállítás letiltásához a kiadványt törölni kell, és létre kell hozni egy újat.

  • Az adatok ismételt közzététele nem támogatott.

  • A replikáció nyomon követés céljából hozzáadja a msrepl_tran_version oszlopot a közzétett táblákhoz. A további oszlop miatt minden INSERT utasításnak tartalmaznia kell egy oszloplistát.

  • Ha az előfizetések frissítését támogató kiadvány tábláján sémamódosításokat szeretne végezni, a tábla összes tevékenységét le kell állítani a Publisherben és az Előfizetőknél, a függőben lévő adatmódosításokat pedig minden csomópontra propagálja a sémamódosítások végrehajtása előtt. Ez biztosítja, hogy a függőben lévő tranzakciók ne ütköznek a függőben lévő sémamódosítással. Miután a sémamódosítások eljutottak az összes csomóponthoz, a tevékenység újraindulhat a közzétett táblákon. További információ: Replikációs topológia (replikáció Transact-SQL programozás).

  • Ha a frissítési módok közötti váltást tervezi, az üzenetsor-olvasó ügynöknek legalább egyszer futnia kell az előfizetés inicializálása után (alapértelmezés szerint a Várólista-olvasó ügynök folyamatosan fut).

  • Ha az előfizetői adatbázis horizontálisan particionált, és a partícióban vannak olyan sorok, amelyek az Előfizetőnél léteznek, de a Publisherben nem, az Előfizető nem tudja frissíteni az előző sorokat. A sorok frissítésének megkísérlése hibaüzenetet ad vissza. A sorokat törölni kell a táblából, majd hozzá kell adni a Publisherben.

  • A várólistára helyezett frissíthető előfizetők tranzakciós replikációja lassú teljesítményt tapasztalhat egyedi szűrt indexek használata esetén. Ha egy egyedi szűrt indexeket tartalmazó cikkben ütközés lép fel, az ütközések feloldása további törléseket és beszúrásokat eredményezne az előfizetőn az egyedi szűrt index által nem lefedett sorokhoz.

Frissítések az előfizetőnél

  • Az Előfizető frissítéseit akkor is propagálja a Közzétevő, ha egy előfizetés lejárt vagy inaktív. Győződjön meg arról, hogy az ilyen előfizetések elvetve vagy újrainicializálva vannak.

  • Ha TIMESTAMP vagy IDENTITY oszlopokat használ, és azok az alapadattípusként vannak replikálva, az ezekben az oszlopokban lévő értékeket nem szabad frissíteni az Előfizetőnél.

  • Az előfizetők nem tudják frissíteni vagy beszúrni a szöveg, az ntext vagy a kép értékeit, mert nem olvashatók be a beszúrt vagy törölt táblákból a replikáció változáskövetési eseményindítóiban. Hasonlóképpen, az előfizetők nem tudják frissíteni vagy beszúrni a szöveg - vagy képértékeketWRITETEXT vagy UPDATETEXT használatával, mert az adatokat felülírja a Publisher. Ehelyett particionálhatja a szöveg - és képoszlopokat egy külön táblára, és módosíthatja a két táblát egy tranzakción belül.

    Ha nagy méretű objektumokat szeretne frissíteni egy előfizetőnél, használja a varchar(max), nvarchar(max), varbinary(max) adattípusokat szöveg, ntext és kép adattípusok helyett.

  • Az ismétlődő elemeket létrehozó egyedi kulcsok (beleértve az elsődleges kulcsokat is) frissítése (például az űrlap UPDATE <column> SET <column> =<column>+1 frissítése nem engedélyezett, és az egyediség megsértése miatt el lesz utasítva. Ennek az az oka, hogy az Előfizetőnél végrehajtott frissítéseket a replikáció minden érintett sorra vonatkozóan egyedi FRISSÍTÉSi utasításként propagálja.

  • Ha az előfizetői adatbázis horizontálisan particionált, és a partícióban vannak olyan sorok, amelyek az Előfizetőnél léteznek, de a Közzétevőnél nem, az Előfizető nem tudja frissíteni a már meglévő sorokat. A sorok frissítésének megkísérlése hibaüzenetet ad vissza. A sorokat törölni kell a táblából, majd újra be kell szúrni.

Felhasználó által definiált eseményindítók

  • Ha az alkalmazás eseményindítókat igényel az Előfizetőnél, az eseményindítókat a Közzétevő NOT FOR REPLICATION és az Előfizető NOT FOR REPLICATION beállításával kell meghatározni. Ez biztosítja, hogy csak az eredeti adatváltozás esetén aktiválódjon a trigger, de nem, amikor a módosítás replikálódik.

    Győződjön meg arról, hogy a felhasználó által megadott eseményindító nem aktiválódik, amikor a replikációs eseményindító frissíti a táblát. Ez úgy érhető el, hogy meghívja a felhasználó által meghatározott eseményindító törzsében sp_check_for_sync_trigger eljárást. További információ: sp_check_for_sync_trigger (Transact-SQL).

Azonnali frissítés

  • Az előfizetések azonnali frissítéséhez az előfizető módosításait propagálja a közzétevő, és a Microsoft Distributed Transaction Coordinator (MS DTC) használatával alkalmazza. Győződjön meg arról, hogy az MS DTC telepítve van és konfigurálva van a Közzétevőben és az Előfizetőben. További információkért tekintse meg a Windows dokumentációját.

  • Az előfizetések azonnali frissítéséhez használt eseményindítókhoz kapcsolat szükséges a Publisherrel a módosítások replikálásához.

  • Ha a kiadvány lehetővé teszi az előfizetések azonnali frissítését, és a kiadvány egy cikke oszlopszűrővel rendelkezik, alapértelmezés szerint nem szűrheti a nem null értékű oszlopokat.

Sorban álló frissítés

  • Az egyesítési kiadványban szereplő táblák nem tehetők közzé olyan tranzakciós kiadvány részeként is, amely lehetővé teszi az előfizetések várólistára helyezését.

  • Az elsődleges kulcsoszlopok frissítése nem ajánlott az üzenetsoros frissítés használatakor, mert az elsődleges kulcsot minden lekérdezés rekordkeresőjeként használják. Ha az ütközésfeloldási szabályzat előfizetői wins értékre van állítva, körültekintően kell frissíteni az elsődleges kulcsokat. Ha az elsődleges kulcs frissítése mind a Közzétevőnél, mind az Előfizetőnél történik, az eredmény két sor, különböző elsődleges kulcsokkal.

  • SQL_VARIANT adattípusú oszlopok esetében: amikor az adatokat beszúrják vagy frissítik az Előfizetőnél, az Üzenetsor-olvasó ügynök a következő módon térképezi fel, amikor az adatokat az Előfizetőtől a sorra másolja:

    • A BIGINT, a DECIMÁLIS, a NUMERIKUS, a PÉNZ és a SMALLMONEYnumerikus értékre van leképezve.

    • BINÁRIS és VARBINARY típusok VARBINARY adatként vannak leképezve.

Ütközésészlelés és -feloldás

  • Az Előfizető nyeri ütközési szabályzat esetén: az ütközésfeloldás nem támogatott az elsődleges kulcsoszlopok frissítéséhez.

  • Az idegenkulcs-korlátozási hibák miatti ütközéseket a replikáció nem oldja fel:

    • Ha az ütközések nem várhatók, és az adatok jól particionáltak (az előfizetők nem frissítik ugyanazokat a sorokat), használhat idegenkulcs-korlátozásokat a Publisherre és az előfizetőkre.

    • Ha ütközések várhatók: ne használjon idegenkulcs-korlátozásokat a Közzétevőnél vagy az Előfizetőnél, ha az "Előfizető nyer" ütközésmegoldást használja; ha a "Közzétevő nyer" ütközésmegoldást használja, ne használjon idegenkulcs-korlátozásokat az Előfizetőnél.