Mengotomatiskan replikasi perubahan skema di Azure SQL Data Sync
Berlaku untuk:Azure SQL Database
SQL Data Sync memungkinkan pengguna menyinkronkan data antara database di Azure SQL Database dan instans SQL Server dalam satu arah atau kedua arah. Salah satu keterbatasan SQL Data Sync saat ini adalah kurangnya dukungan untuk replikasi perubahan skema. Setiap kali Anda mengubah skema tabel, Anda perlu menerapkan perubahan secara manual di semua titik akhir, termasuk hub dan semua anggota, lalu memperbarui skema sinkronisasi.
Artikel ini menawarkan solusi untuk mereplikasi perubahan skema secara otomatis ke semua titik akhir SQL Data Sync.
- Solusi ini menggunakan pemicu DDL untuk melacak perubahan skema.
- Pemicu menyisipkan perintah perubahan skema dalam tabel pelacakan.
- Tabel pelacakan ini disinkronkan ke semua titik akhir menggunakan layanan Data Sync.
- Pemicu DML setelah penyisipan digunakan untuk menerapkan perubahan skema pada titik akhir lainnya.
Artikel ini menggunakan ALTER TABLE sebagai contoh perubahan skema, tetapi solusi ini juga dapat diterapkan untuk jenis perubahan skema lainnya.
Penting
Sebaiknya Anda membaca artikel ini dengan cermat, terutama bagian Pemecahan Masalah dan Pertimbangan lainnya, sebelum mulai menerapkan replikasi perubahan skema otomatis di lingkungan sinkronisasi Anda. Sebaiknya Anda juga membaca Sinkronisasi data di beberapa database cloud dan lokal dengan SQL Data Sync. Beberapa operasi database dapat membuat solusi yang dijelaskan dalam artikel ini tidak efektif. Pengetahuan domain tambahan tentang SQL Server dan Transact-SQL mungkin diperlukan untuk memecahkan masalah tersebut.
Siapkan replikasi perubahan skema otomatis
Buat tabel untuk melacak perubahan skema
Buat tabel untuk melacak perubahan skema di semua database dalam grup sinkronisasi:
CREATE TABLE SchemaChanges (
ID bigint IDENTITY(1,1) PRIMARY KEY,
SqlStmt nvarchar(max),
[Description] nvarchar(max)
)
Tabel ini memiliki kolom identitas untuk melacak urutan perubahan skema. Anda bisa menambahkan lebih banyak bidang untuk mencatat informasi lainnya jika diperlukan.
Buat tabel untuk melacak riwayat perubahan skema
Di semua titik akhir, buat tabel untuk melacak ID dari perintah perubahan skema yang terakhir diterapkan.
CREATE TABLE SchemaChangeHistory (
LastAppliedId bigint PRIMARY KEY
)
GO
INSERT INTO SchemaChangeHistory VALUES (0)
Membuat pemicu ALTER TABLE DDL di database yang mengalami perubahan skema
Membuat pemicu DDL untuk operasi ALTER TABLE. Anda hanya perlu membuat pemicu ini di database yang mengalami perubahan skema. Untuk menghindari konflik, hanya perbolehkan perubahan skema dalam satu database dalam grup sinkronisasi.
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')
Pemicu menyisipkan rekaman dalam tabel pelacakan perubahan skema untuk setiap perintah ALTER TABLE. Contoh ini menambahkan filter untuk menghindari replikasi perubahan skema yang dibuat pada skema DataSync, karena perubahan ini kemungkinan besar diakibatkan oleh layanan Sinkronisasi Data. Tambahkan lebih banyak filter jika Anda hanya ingin mereplikasi tipe perubahan skema tertentu.
Anda juga dapat menambahkan lebih banyak pemicu untuk mereplikasi jenis perubahan skema lainnya. Misalnya, buat CREATE_PROCEDURE, ALTER_PROCEDURE, dan DROP_PROCEDURE untuk mereplikasi perubahan pada prosedur yang disimpan.
Buat pemicu pada titik akhir lain untuk menerapkan perubahan skema selama penyisipan
Pemicu ini menjalankan perintah perubahan skema ketika disinkronkan ke titik akhir lainnya. Anda perlu membuat pemicu ini di semua titik akhir, kecuali di titik di mana dilakukan perubahan skema (yaitu, dalam database di mana pemicu DDL AlterTableDDLTrigger
dibuat pada langkah sebelumnya).
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
Pemicu ini berjalan setelah dilakukan penyisipan dan memeriksa apakah perintah saat ini akan berjalan berikutnya. Logika kode memastikan bahwa tidak ada pernyataan perubahan skema yang dilewati, dan semua perubahan diterapkan meskipun penyisipan rusak.
Sinkronkan tabel pelacakan perubahan skema ke semua titik akhir
Anda bisa menyinkronkan tabel pelacakan perubahan skema ke semua titik akhir menggunakan grup sinkronisasi yang sudah ada atau grup sinkronisasi baru. Pastikan perubahan dalam tabel pelacakan dapat disinkronkan ke semua titik akhir, terutama saat Anda menggunakan sinkronisasi satu arah.
Jangan sinkronkan tabel riwayat perubahan skema, karena tabel tersebut mempertahankan status berbeda untuk setiap titik akhir yang berbeda.
Menerapkan perubahan skema dalam grup sinkronisasi
Replikasi dilakukan hanya untuk perubahan skema yang dibuat dalam database tempat pemicu DDL dibentuk. Perubahan skema yang dilakukan di database lain tidak direplikasi.
Setelah perubahan skema direplikasi ke semua titik akhir, Anda juga perlu mengambil langkah tambahan untuk memperbarui skema sinkronisasi untuk memulai atau berhenti menyinkronkan kolom baru.
Tambahkan kolom baru
Ubah skema.
Jangan lakukan perbahan pada data yang disinkronkan dengan kolom baru hingga Anda menyelesaikan langkah pembuatan pemicu.
Tunggu hingga perubahan skema diterapkan ke semua titik akhir.
Refresh skema database dan tambahkan kolom baru ke skema sinkronisasi.
Data di kolom baru disinkronkan selama operasi sinkronisasi berikutnya.
Hapus kolom
Menghapus kolom dari skema sinkronisasi. Data Sync berhenti menyinkronkan data dalam kolom ini.
Ubah skema.
Refresh skema database.
Perbarui jenis data
Ubah skema.
Tunggu hingga perubahan skema diterapkan ke semua titik akhir.
Refresh skema database.
Jika tipe data baru dan lama tidak sepenuhnya kompatibel - misalnya, jika Anda mengubah dari
int
kebigint
- sinkronisasi mungkin gagal sebelum langkah pembuatan pemicu selesai. Sinkronisasi berhasil setelah mencoba melakukannya kembali.
Mengganti nama kolom atau tabel
Mengganti nama kolom atau tabel membuat Data Sync berhenti berfungsi. Buat tabel atau kolom baru, isi ulang data, lalu hapus tabel atau kolom lama alih-alih mengganti nama.
Tipe perubahan skema lainnya
Untuk jenis perubahan skema lainnya - misalnya, membuat prosedur yang disimpan atau menghapus indeks - tidak perlu memperbarui skema sinkronisasi.
Memecahkan masalah replikasi perubahan skema otomatis
Logika replikasi yang dijelaskan dalam artikel ini berhenti berfungsi dalam beberapa situasi- misalnya, jika Anda membuat perubahan skema dalam database lokal yang tidak didukung di Azure SQL Database. Dalam hal ini, sinkronisasi tabel pelacakan perubahan skema gagal dilakukan. Anda perlu mengatasi masalah ini secara manual:
Nonaktifkan pemicu DDL dan hindari perubahan skema lebih lanjut sampai masalah diperbaiki.
Di database titik akhir tempat masalah terjadi, nonaktifkan pemicu AFTER INSERT pada titik akhir di mana perubahan skema tidak dapat dilakukan. Tindakan ini memungkinkan perintah perubahan skema untuk disinkronkan.
Sinkronisasi pemicu untuk menyinkronkan tabel pelacakan perubahan skema.
Di database titik akhir tempat masalah terjadi, lakukan kueri pada tabel riwayat perubahan skema untuk mendapatkan ID perintah perubahan skema yang terakhir diterapkan.
Lakukan kueri pada tabel pelacakan perubahan skema untuk mencantumkan semua perintah dengan ID yang lebih besar dari nilai ID yang Anda ambil di langkah sebelumnya.
a. Abaikan perintah yang tidak dapat dijalankan di database titik akhir. Anda harus mengatasi inkonsistensi skema. Kembalikan perubahan skema asli jika inkonsistensi ini berdampak pada aplikasi Anda.
b. Terapkan secara manual perintah-perintah yang harus diterapkan.
Perbarui tabel riwayat perubahan skema dan atur ID terakhir yang diterapkan ke nilai yang benar.
Periksa kembali apakah skema sudah diperbarui.
Aktifkan kembali pemicu AFTER INSERT yang dinonaktifkan di langkah kedua.
Aktifkan kembali pemicu DDL yang dinonaktifkan pada langkah pertama.
Jika Anda ingin membersihkan catatan dalam tabel pelacakan perubahan skema, gunakan DELETE, bukan TRUNCATE. Jangan pernah melakukan reseeding pada kolom identitas dalam tabel pelacakan perubahan skema dengan menggunakan DBCC CHECKIDENT. Anda dapat membuat tabel pelacakan perubahan skema baru dan memperbarui nama tabel di pemicu DDL jika reseeding diperlukan.
Pertimbangan Lainnya
Pengguna database yang mengonfigurasi hub dan database anggota harus memiliki izin yang cukup untuk menjalankan perintah perubahan skema.
Anda dapat menambahkan lebih banyak filter di pemicu DDL agar hanya mereplikasi perubahan skema dalam tabel atau operasi yang dipilih.
Anda hanya bisa membuat perubahan skema di database tempat pemicu DDL dibuat.
Jika Anda membuat perubahan dalam database SQL Server, pastikan perubahan skema didukung di Azure SQL Database.
Jika perubahan skema dibuat dalam database selain database tempat pemicu DDL dibuat, perubahan tidak direplikasi. Untuk menghindari masalah ini, Anda dapat membuat pemicu DDL untuk memblokir perubahan pada titik akhir lainnya.
Jika Anda perlu mengubah skema tabel pelacakan perubahan skema, nonaktifkan pemicu DDL sebelum Anda melakukan perubahan, lalu terapkan perubahan secara manual ke semua titik akhir. Memperbarui skema dalam pemicu AFTER INSERT pada tabel yang sama tidak berfungsi.
Jangan pernah melakukan reseeding pada kolom identitas dengan menggunakan DBCC CHECKIDENT.
Jangan gunakan TRUNCATE untuk membersihkan data dalam tabel pelacakan perubahan skema.
Langkah berikutnya
Untuk informasi selengkapnya tentang SQL Data Sync, lihat:
- Ringkasan - Menyinkronkan data di beberapa database cloud dan lokal dengan Azure SQL Data Sync
- Menyiapkan Sinkronisasi Data
- Di portal - Tutorial: Menyiapkan Sinkronisasi Data SQL untuk menyinkronkan data antara Azure SQL Database dan SQL Server
- Dengan PowerShell
- Agen Sinkronisasi Data - Agen Sinkronisasi Data untuk Azure SQL Data Sync
- Praktik terbaik - Praktik terbaik untuk Sinkronisasi Data Azure SQL
- Memantau - Memantau SQL Data Sync dengan log Azure Monitor
- Pemecahan Masalah - Memecahkan masalah dengan Azure SQL Data Sync
- Memperbarui skema sinkronisasi
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk