Sémamódosítások replikációjának automatizálása az Azure SQL Data Syncben
A következőre vonatkozik: Azure SQL Database
Az SQL Data Sync lehetővé teszi, hogy a felhasználók egy vagy mindkét irányban szinkronizálják az adatokat az Azure SQL Database és az SQL Server-példányok adatbázisai között. Az SQL Data Sync egyik jelenlegi korlátozása, hogy nem támogatja a sémamódosítások replikálását. Minden alkalommal, amikor módosítja a táblázatsémát, manuálisan kell alkalmaznia a módosításokat az összes végponton, beleértve a központot és az összes tagot, majd frissítenie kell a szinkronizálási sémát.
Ez a cikk egy olyan megoldást mutat be, amely automatikusan replikálja a sémamódosításokat az összes SQL Data Sync-végpontra.
- Ez a megoldás egy DDL-eseményindítót használ a sémaváltozások nyomon követéséhez.
- Az eseményindító beszúrja a sémamódosítási parancsokat egy követési táblába.
- Ez a nyomkövetési tábla az adatszinkronizálási szolgáltatással szinkronizálódik az összes végpontra.
- A beszúrás utáni DML-eseményindítók a sémamódosítások más végpontokon való alkalmazásához használhatók.
Ez a cikk az ALTER TABLE-et használja példaként a sémamódosításra, de ez a megoldás más típusú sémamódosításokhoz is használható.
Fontos
Javasoljuk, hogy gondosan olvassa el ezt a cikket, különösen a hibaelhárítással és egyéb szempontokkal foglalkozó szakaszokat, mielőtt elkezdené implementálni az automatikus sémamódosítás-replikációt a szinkronizálási környezetben. Azt is javasoljuk, hogy több felhőbeli és helyszíni adatbázison keresztül olvassa el a Szinkronizálás adatokat az SQL Data Sync használatával. Egyes adatbázis-műveletek megszakíthatják a cikkben ismertetett megoldást. A problémák elhárításához további tartományismeretre lehet szükség az SQL Serverről és a Transact-SQL-ről.
Automatikus sémamódosítás-replikáció beállítása
Tábla létrehozása a sémamódosítások nyomon követéséhez
Hozzon létre egy táblát a szinkronizálási csoport összes adatbázisának sémaváltozásainak nyomon követéséhez:
CREATE TABLE SchemaChanges (
ID bigint IDENTITY(1,1) PRIMARY KEY,
SqlStmt nvarchar(max),
[Description] nvarchar(max)
)
Ez a táblázat egy identitásoszlopot tartalmaz a sémamódosítások sorrendjének nyomon követéséhez. Szükség esetén további mezőket is hozzáadhat további adatok naplózásához.
Tábla létrehozása a sémamódosítások előzményeinek nyomon követéséhez
Minden végponton hozzon létre egy táblát a legutóbb alkalmazott sémamódosítási parancs azonosítójának nyomon követéséhez.
CREATE TABLE SchemaChangeHistory (
LastAppliedId bigint PRIMARY KEY
)
GO
INSERT INTO SchemaChangeHistory VALUES (0)
Alter TABLE DDL-eseményindító létrehozása abban az adatbázisban, amelyben sémamódosítások történnek
Hozzon létre egy DDL-eseményindítót az ALTER TABLE-műveletekhez. Ezt az eseményindítót csak abban az adatbázisban kell létrehoznia, amelyben sémamódosítások történnek. Az ütközések elkerülése érdekében csak egy szinkronizálási csoportban engedélyezze a sémamódosításokat egy adatbázisban.
CREATE TRIGGER AlterTableDDLTrigger
ON DATABASE
FOR ALTER_TABLE
AS
-- You can add your own logic to filter ALTER TABLE commands instead of replicating all of them.
IF NOT (EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'nvarchar(512)') like 'DataSync')
INSERT INTO SchemaChanges (SqlStmt, Description)
VALUES (EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)'), 'From DDL trigger')
Az eseményindító minden ALTER TABLE-parancshoz beszúr egy rekordot a sémaváltozás-követési táblába. Ez a példa szűrőt ad hozzá a séma DataSyncben végrehajtott sémamódosítások replikálásának elkerülése érdekében, mivel ezeket valószínűleg az Adatszinkronizálási szolgáltatás végzi. Ha csak bizonyos típusú sémamódosításokat szeretne replikálni, adjon hozzá további szűrőket.
További eseményindítókat is hozzáadhat más típusú sémamódosítások replikálásához. Létrehozhat például CREATE_PROCEDURE, ALTER_PROCEDURE és DROP_PROCEDURE eseményindítókat a tárolt eljárások módosításainak replikálásához.
Eseményindító létrehozása más végpontokon sémamódosítások beszúrása során történő alkalmazásához
Ez az eseményindító végrehajtja a sémamódosítási parancsot, amikor más végpontokkal van szinkronizálva. Ezt az eseményindítót az összes végponton létre kell hoznia, kivéve azt, amelyikben sémamódosítások történnek (vagyis abban az adatbázisban, ahol a DDL-eseményindítót AlterTableDDLTrigger
az előző lépésben hozták létre).
CREATE TRIGGER SchemaChangesTrigger
ON SchemaChanges
AFTER INSERT
AS
DECLARE @lastAppliedId bigint
DECLARE @id bigint
DECLARE @sqlStmt nvarchar(max)
SELECT TOP 1 @lastAppliedId=LastAppliedId FROM SchemaChangeHistory
SELECT TOP 1 @id = id, @SqlStmt = SqlStmt FROM SchemaChanges WHERE id > @lastAppliedId ORDER BY id
IF (@id = @lastAppliedId + 1)
BEGIN
EXEC sp_executesql @SqlStmt
UPDATE SchemaChangeHistory SET LastAppliedId = @id
WHILE (1 = 1)
BEGIN
SET @id = @id + 1
IF exists (SELECT id FROM SchemaChanges WHERE ID = @id)
BEGIN
SELECT @sqlStmt = SqlStmt FROM SchemaChanges WHERE ID = @id
EXEC sp_executesql @SqlStmt
UPDATE SchemaChangeHistory SET LastAppliedId = @id
END
ELSE
BREAK;
END
END
Ez az eseményindító a beszúrás után fut, és ellenőrzi, hogy az aktuális parancs fut-e legközelebb. A kódlogika biztosítja, hogy a rendszer ne hagyja ki a sémamódosítási utasítást, és a rendszer akkor is alkalmazza az összes módosítást, ha a beszúrás nem megfelelő.
A sémaváltozás-követési tábla szinkronizálása az összes végpontra
A sémaváltozás-követő táblát a meglévő szinkronizálási csoport vagy egy új szinkronizálási csoport használatával szinkronizálhatja az összes végponttal. Győződjön meg arról, hogy a nyomkövetési tábla módosításai szinkronizálhatók az összes végponttal, különösen akkor, ha egyirányú szinkronizálást használ.
Ne szinkronizálja a sémamódosítási előzménytáblát, mivel ez a tábla eltérő állapotot tart fenn a különböző végpontokon.
Sémamódosítások alkalmazása szinkronizálási csoportban
A rendszer csak a DDL-eseményindítót létrehozó adatbázisban végrehajtott sémamódosításokat replikálja. A más adatbázisokban végrehajtott sémamódosítások nem replikálódnak.
Miután a séma módosításait replikálta az összes végpontra, további lépéseket kell tennie a szinkronizálási séma frissítéséhez az új oszlopok szinkronizálásának elindításához vagy leállításához.
Új oszlopok hozzáadása
Módosítsa a sémát.
Az eseményindítót létrehozó lépés befejezéséig ne módosítsa az új oszlopokat tartalmazó adatváltozásokat.
Várja meg, amíg a sémamódosítások az összes végpontra érvényesek lesznek.
Frissítse az adatbázissémát, és adja hozzá az új oszlopot a szinkronizálási sémához.
Az új oszlopban lévő adatok szinkronizálása a következő szinkronizálási művelet során történik.
Oszlopok eltávolítása
Távolítsa el az oszlopokat a szinkronizálási sémából. Az Adatszinkronizálás leállítja az adatok szinkronizálását ezekben az oszlopokban.
Módosítsa a sémát.
Frissítse az adatbázissémát.
Adattípusok frissítése
Módosítsa a sémát.
Várja meg, amíg a sémamódosítások az összes végpontra érvényesek lesznek.
Frissítse az adatbázissémát.
Ha az új és a régi adattípusok nem teljes mértékben kompatibilisek – például váltáskor
int
bigint
– a szinkronizálás meghiúsulhat, mielőtt az eseményindítókat létrehozó lépések befejeződnek. Az újrapróbálkozások után a szinkronizálás sikeres lesz.
Oszlopok vagy táblák átnevezése
Az oszlopok vagy táblák átnevezése leállítja az Adatszinkronizálás működését. Hozzon létre egy új táblát vagy oszlopot, töltse ki újra az adatokat, majd átnevezés helyett törölje a régi táblát vagy oszlopot.
Más típusú sémamódosítások
Más típusú sémamódosítások esetén – például tárolt eljárások létrehozása vagy index elvetése – nem szükséges frissíteni a szinkronizálási sémát.
Automatikus sémamódosítás-replikáció hibaelhárítása
A cikkben ismertetett replikációs logika bizonyos helyzetekben leáll, például ha olyan sémamódosítást hajtott végre egy helyszíni adatbázisban, amelyet az Azure SQL Database nem támogat. Ebben az esetben a sémaváltozás-követési tábla szinkronizálása meghiúsul. A problémát manuálisan kell megoldania:
Tiltsa le a DDL-eseményindítót, és kerülje a további sémamódosításokat a probléma megoldásáig.
A végpontadatbázisban, ahol a probléma történik, tiltsa le az AFTER INSERT eseményindítót azon a végponton, ahol a sémamódosítás nem végezhető el. Ez a művelet lehetővé teszi a sémamódosítási parancs szinkronizálását.
A sémaváltozás-követési tábla szinkronizálásához aktiválja a szinkronizálást.
A végpontadatbázisban, ahol a probléma történik, kérje le a sémamódosítási előzménytáblát a legutóbb alkalmazott sémamódosítási parancs azonosítójának lekéréséhez.
A sémamódosítás-követési táblázat lekérdezésével listázhatja az összes parancsot az előző lépésben lekért azonosítónál nagyobb azonosítóval.
a. Hagyja figyelmen kívül azokat a parancsokat, amelyeket nem lehet végrehajtani a végpontadatbázisban. Foglalkoznia kell a séma inkonzisztencia. Ha az inkonzisztencia hatással van az alkalmazásra, állítsa vissza az eredeti sémamódosításokat.
b. Manuálisan alkalmazza azokat a parancsokat, amelyeket alkalmazni kell.
Frissítse a sémamódosítási előzménytáblát, és állítsa az utolsó alkalmazott azonosítót a megfelelő értékre.
Ellenőrizze, hogy a séma naprakész-e.
Engedélyezze újra a második lépésben letiltott AFTER INSERT eseményindítót.
Az első lépésben engedélyezze újra a letiltott DDL-eseményindítót.
Ha törölni szeretné a sémaváltozás-követési táblában lévő rekordokat, a TRUNCATE helyett használja a DELETE parancsot. Soha ne állítsa újra újra az identitásoszlopot a sémaváltozás-követési táblában a DBCC CHECKIDENT használatával. Új sémamódosítás-követő táblákat hozhat létre, és szükség esetén frissítheti a tábla nevét a DDL-eseményindítóban.
Egyéb szempontok
A központot és tagadatbázisokat konfiguráló adatbázis-felhasználóknak elegendő engedéllyel kell rendelkezniük a sémamódosítási parancsok végrehajtásához.
A DDL-eseményindítóban további szűrőket is hozzáadhat, hogy csak a kijelölt táblákban vagy műveletekben replikálja a sémamódosítást.
Csak abban az adatbázisban végezhet sémamódosítást, amelyben a DDL-eseményindító létrejön.
Ha módosít egy SQL Server-adatbázist, győződjön meg arról, hogy a sémamódosítás támogatott az Azure SQL Database-ben.
Ha a sémamódosítások a DDL-eseményindítót létrehozó adatbázistól eltérő adatbázisokban történnek, a rendszer nem replikálja a módosításokat. A probléma elkerülése érdekében DDL-eseményindítókat hozhat létre, hogy letiltsa a módosításokat más végpontokon.
Ha módosítania kell a sémamódosítás-követő tábla sémáját, a módosítás előtt tiltsa le a DDL-eseményindítót, majd alkalmazza manuálisan a módosítást az összes végpontra. A séma frissítése egy AFTER INSERT eseményindítóban ugyanazon a táblán nem működik.
Ne használja újra az identitásoszlopot a DBCC CHECKIDENT használatával.
Ne használja a TRUNCATE-t a sémaváltozás-követési táblában lévő adatok törléséhez.
További lépések
További információ az SQL Data Syncről:
- Áttekintés – Adatok szinkronizálása több felhőbeli és helyszíni adatbázison az Azure SQL Data Sync használatával
- Adatszinkronizálás beállítása
- A portálon – Oktatóanyag: Az SQL Data Sync beállítása adatok szinkronizálásához az Azure SQL Database és az SQL Server között
- A PowerShell használatával
- Adatszinkronizálási ügynök – Adatszinkronizálási ügynök az Azure SQL Data Synchez
- Ajánlott eljárások – Ajánlott eljárások az Azure SQL Data Synchez
- Monitorozás – SQL Data Sync monitorozása Azure Monitor-naplókkal
- Hibaelhárítás – Az Azure SQL Data Synctel kapcsolatos problémák elhárítása
- A szinkronizálási séma frissítése
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: