Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Artikel ini selangkah demi selangkah menjelaskan bagaimana menerapkan
bidirectional transactional replication. Artikel ini juga membahas isu-isu
yang terlibat dalam melaksanakan bidirectional transaksional
replikasi.
Bidirectional Transactional Replication with scripts
Bidirectional transactional replication, juga dikenal sebagai dua arah
Transactional replication, mengizinkan server untuk kedua penerbit dan a
pelanggan untuk data yang sama. Karena server yang berpartisipasi dalam
replikasi akan mengulangi setiap perubahan ke server lain, perubahan
tidak dapat disebarkan kembali ke server berasal.
Sebagai contoh, jika Anda
memiliki dua server (Server A dan Server B), server dikatakan dalam
bidirectional transactional replication jika kedua kondisi berikut
benar:
Perubahan yang dibuat ke meja T1 pada Server A
direplikasi ke meja T1 pada Server B.
Perubahan yang dibuat ke meja T1 Server b
direplikasi ke meja T1 pada Server A.
Oleh karena itu, jika perubahan berasal dari Server A, perubahan adalah
direplikasi ke Server B, tapi Server B tidak menyebarkan perubahan sama kembali ke
Server A. replikasi menggunakan mekanisme deteksi loopback yang distributor
menggunakan untuk menentukan apakah akan mengirim perubahan kembali ke berasal
server.
Rencana topologi untuk Bidirectional Transactional Replication with scripts
Untuk bidirectional transactional replication, salah satu server
dapat bertindak sebagai pusat pelanggan, dan semua
server lain berlangganan ke pelanggan tengah. Oleh karena itu, setiap perubahan yang
berasal di server direplikasi ke pelanggan tengah, dan kemudian
pelanggan tengah, pada gilirannya, bereplikasi perubahan untuk semua server
yang berpartisipasi dalam replikasi. Namun, dengan bantuan loopback
mekanisme deteksi, distributor berhenti perubahan dari yang disebarkan ke
server berasal.
Sebagai contoh, jika tiga server (Server A,
Server B, dan Server C) berpartisipasi dalam bidirectional transactional replication with scripts
dan Server A pelanggan tengah, penerbit dan pelanggan
dikelola dengan cara berikut:
Server a menerbitkan Server B dan Server C.
Server a berlangganan dari Server B dan Server C.
Server b menerbitkan untuk dan berlangganan dari hanya Server
A.
Server c menerbitkan untuk dan berlangganan dari hanya Server
A.
Oleh karena itu, setiap perubahan yang berasal pada Server B direplikasi
untuk Server A dan Server C.
Konflik di Bidirectional Transactional Replication with scripts
Ketika Anda membuat perubahan pada server yang berpartisipasi dalam
replikasi, perubahan direplikasi ke semua server lain berpartisipasi.
Selama ini replikasi, konflik dapat terjadi dan replikasi mungkin gagal. The
Daftar berikut ini menjelaskan kemungkinan konflik dan cara-cara yang Anda dapat menghindari
konflik ini:
Jika Anda memasukkan catatan yang memiliki kunci ke dalam tabel pada satu
server dan catatan lain yang memiliki tombol yang sama sudah ada di
server lain yang berpartisipasi dalam replikasi, replikasi tidak
menyebarkan perubahan ke server lain.
Menyarankan
Tindakan Untuk menghindari masalah ini, pastikan bahwa Anda menggunakan kunci berbeda pada
setiap server yang berpartisipasi dalam replikasi. Untuk melakukannya, mengalokasikan
kisaran kunci untuk setiap server yang berpartisipasi dalam yang telah ditetapkan
replikasi. Anda juga dapat menggunakan kunci komposit pada setiap server.
Ketika Anda memperbarui data yang telah dihapus lain
server, UPDATE pernyataan mempengaruhi nol baris pada server di mana catatan
telah dihapus, dan replikasi gagal dengan kesalahan.
Menyarankan tindakan Untuk menghindari masalah ini, lakukan salah satu langkah berikut:
Menghapus @@ ROWCOUNT Periksa setelah pernyataan UPDATE sebenarnya dalam pembaruan
prosedur yang tersimpan.
-atau-
Penggunaan -Skiperrors parameter untuk agen distribusi untuk mengabaikan kesalahan ini. Untuk lebih
informasi tentang melompat-lompat kesalahan dalam transactional replication, kunjungi
Web site Microsoft berikut:
Mencari record sebelum UPDATE pernyataan di
Update prosedur yang tersimpan. Jika tidak ada catatan yang ada, memotong UPDATE pernyataan, dan
record telah dihapus pada semua pelanggan.
Ketika Anda memperbarui kolom dalam catatan yang diperbarui pada
bersamaan pada server lain, data mungkin berbeda di kedua
server.
Menyarankan tindakan Untuk menghindari masalah ini, menentukan jika data sedang diperbarui pada
sama waktu pada server lain, dan kemudian mengambil tindakan bila diperlukan. Untuk melakukannya,
memodifikasi disimpan prosedur kustom pembaruan dan menggunakan sintaks XCALL untuk memanggil
Update prosedur yang tersimpan. Sintaks XCALL menyediakan nilai-nilai untuk semua
kolom sebelum prosedur pembaruan disebut dan memberikan nilai-nilai diperbarui
di kolom. Anda dapat membandingkan nilai sekarang dari kolom terhadap
nilai sebelum update disimpan prosedur yang disebut. Jika Anda melihat berbeda
nilai-nilai, kolom ini sedang diperbarui pada saat yang sama oleh server yang berbeda. Anda
dapat menyesuaikan prosedur yang tersimpan untuk memilih nilai yang tetap. Untuk lebih
informasi tentang cara menggunakan XCALL, kunjungi Website Microsoft berikut
situs:
Catatan Anda dapat menentukan sintaks XCALL untuk memanggil update sesuai
prosedur yang disimpan atau menghapus disimpan prosedur dengan menggunakan sp_addarticle selama publikasi. Anda juga dapat menentukan sintaks XCALL oleh
menggunakan SQL Server Enterprise Manager. Untuk melakukannya, ikuti langkah berikut ini:
Dalam SQL Server Enterprise Manager, Cari
publikasi yang Anda inginkan.
Klik kanan publikasi, dan kemudian klik Properti.
Klik Artikel tab, Cari
Artikel, dan kemudian klik tombol properti artikel (...) sebelah
artikel.
Dalam Tabel artikel properti dialog
kotak, klik Perintah tab.
Dalam Menggantikan perintah UPDATE dengan ini disimpan
prosedur panggilan kotak teks, ketik XCALL, dan kemudian
Klik Oke.
Dalam Publikasi properti dialog
kotak, klik Oke.
Ketika Anda memperbarui kolom yang berbeda dalam catatan, simultan
Pembaruan dari kolom catatan yang berbeda kadang-kadang dapat mengakibatkan
konflik.
Menyarankan tindakan Untuk menghindari masalah ini, menentukan apakah kolom berbeda dalam
rekaman sama Diperbarui pada saat yang sama, dan kemudian mengambil tindakan bila diperlukan.
Untuk melakukannya, memodifikasi disimpan prosedur kustom pembaruan, dan kemudian menggunakan XCALL
sintaks untuk memanggil update disimpan prosedur. Karena XCALL syntax menyediakan
nilai-nilai sebelum update disimpan prosedur yang disebut, Anda dapat menambahkan salah satu
mengakses pilihan berikut untuk update disimpan prosedur sebelum update sebenarnya
dilakukan:
Membandingkan nilai-nilai saat ini semua kolom terhadap
nilai-nilai mereka sebelum update disimpan prosedur yang disebut.
Menambahkan kolom untuk mewakili versi baris dan
membandingkan nilai saat ini dengan nilai sebelum prosedur pembaruan yang disimpan
disebut.
Nilai-nilai yang berbeda menunjukkan bahwa kolom berbeda sedang
Diperbarui pada waktu yang sama. Anda kemudian dapat memutuskan apakah akan memperbarui
kolom.
Ketika Anda menghapus baris yang sedang diperbarui oleh orang lain
server pada saat yang sama, replikasi mungkin gagal.
Menyarankan tindakan Untuk menentukan apakah berturut-turut diperbarui dan dihapus pada saat yang sama,
gunakan sintaks XCALL di Hapus disimpan prosedur. Bandingkan setiap kolom
baris yang menjadi dihapus terhadap nilai-nilai sebelum menghapus yang disimpan
prosedur yang disebut. Nilai-nilai yang berbeda menunjukkan bahwa pembaruan ini sedang
dilakukan pada waktu yang sama. Anda dapat menghapus atau mempertahankan diperbarui
baris.
Catatan Bahkan jika Anda tidak menghapus catatan pelanggan,
Catatan tidak ada lagi di server yang berasal dari Hapus
pernyataan.
Ketika Anda menghapus baris yang menjadi dihapus pada saat yang sama
waktu pada server lain yang berpartisipasi dalam replikasi,
replikasi gagal karena Hapus pernyataan tidak mempengaruhi setiap baris pada beberapa
pelanggan.
Menyarankan
Tindakan Untuk menghindari masalah ini, lakukan salah satu langkah berikut:
Menghapus @@ ROWCOUNT Periksa setelah pernyataan Hapus sebenarnya dalam pembaruan
prosedur yang tersimpan.
-atau-
Penggunaan -Skiperrors parameter di agen distribusi untuk mengabaikan kesalahan ini. Untuk lebih
informasi tentang melompat-lompat kesalahan dalam transactional replication, kunjungi
Web site Microsoft berikut:
Catatan Setiap penggunaan mungkin memerlukan pendekatan yang berbeda untuk menyelesaikan ini
konflik, tergantung pada kebutuhan bisnis. Konflik ini lebih mudah untuk
menyelesaikan ketika hanya dua server terlibat. Ketika lebih dari dua server yang
terlibat, Anda dapat menggunakan prosedur yang tersimpan untuk menentukan yang server
berasal dari perubahan. Update disimpan prosedur yang digunakan untuk memperbarui
Catatan di Server C tidak tahu jika perubahan berasal dalam Server A atau di
Server B. Tidak seperti gabungan replikasi, transactional replication with scripts tidak dirancang
untuk menyelesaikan konflik. Menyebarkan transactional replication with scripts hanya dalam skenario di mana
konflik dapat dihindari bukan diselesaikan.
Menerapkan Bidirectional Transactional Replication with scripts
Untuk menerapkan bidirectional transactional replication, semua
Setelah kondisi harus benar:
Data disinkronisasi antara mereplikasi
server.
Disimpan prosedur yang digunakan oleh replikasi berada
di semua database berpartisipasi.
Berlangganan didirikan dengan menggunakan @ loopback_detection = 'benar' parameter.
Catatan Opsi untuk mengatur @ loopback_detection = 'benar' saat ini tidak tersedia di antarmuka pengguna. Oleh karena itu, Anda
harus berlangganan dengan menggunakan sp_addsubscription prosedur yang tersimpan.
Jika Anda melakukan backup dan restore, ingat yang berbeda
situs memerlukan kendala yang berbeda pada tombol utama untuk memastikan bahwa
kunci primer duplikat tidak diciptakan. Juga ingat untuk membuat semua kendala
dengan tidak untuk REPLIKASI klausa.
Anda dapat menggunakan berikut
contoh untuk mengatur bidirectional transactional replication di komputer yang menjalankan
SQL Server 2000.
Catatan Transact-SQL pernyataan terdaftar untuk masing-masing berikut
langkah-langkah. Menjalankan Transact-SQL pernyataan untuk melakukan tugas yang disebutkan dalam
langkah sebelumnya.
Membuat distributor, penerbit, dan pelanggan pada
komputer yang menjalankan SQL Server. Untuk melakukannya, ikuti langkah berikut ini:
Buat database dua:
use master
go
create database test1
go
create database test2
go
Membuat dua tabel yang IDENTITAS kolom dengan pilihan tidak untuk REPLIKASI mengatur:
use test1
go
create table two_way_test1
(
pkcol INTEGER PRIMARY KEY NOT NULL,
intcol INTEGER IDENTITY(1,1) NOT FOR REPLICATION,
charcol CHAR(100),
timestampcol TIMESTAMP
)
use test2
go
create table two_way_test2
(
pkcol INTEGER PRIMARY KEY NOT NULL,
intcol INTEGER IDENTITY(1000000000,1) NOT FOR REPLICATION,
charcol CHAR(100),
timestampcol TIMESTAMP
)
go
Mengalokasikan ditentukan berbagai nilai-nilai untuk utama
kunci kolom sehingga nilai-nilai pada server yang berbeda tidak sama dalam satu
jangkauan. Sebagai contoh, Anda dapat menerapkan 1-1000 sebagai rentang kunci untuk two_way_test1 Tabel di test1 database, dan kemudian menerapkan 1001-2000 sebagai rentang kunci untuk two_way_test2 Tabel di Uneltele Mele nelu57 database. Untuk melakukannya, gunakan kode berikut:
-- Constraint to enforce a range of values between 1 and 1000 in database test1
use test1
go
alter table
two_way_test1
with nocheck
add constraint
checkprimcol check NOT FOR REPLICATION
(
pkcol BETWEEN 1 and 1000
)
go
use test2
go
-- Constraint to enforce a range of values between 1001 and 2000 in the database test2
alter table
two_way_test2
with nocheck
add constraint
checkprimcol check NOT FOR REPLICATION
(
pkcol BETWEEN 1001 and 2000
)
go
Mengaktifkan server Anda sebagai distributor, dan kemudian membuat
distribusi database:
use master
go
sp_adddistributor @distributor = '<distributor name>'
go
use master
go
sp_adddistributiondb @database='distribution'
go
Mengaktifkan semua komputer yang menjalankan SQL Server yang berpartisipasi dalam
replikasi sebagai Penerbit:
use master
go
exec sp_adddistpublisher
@publisher = '<Your Server Name>',
@distribution_db ='distribution',
@security_mode = 0,
@login = 'sa',
@password = 'sa',
@working_directory ='<Location of Directory>'
Mengaktifkan semua database diidentifikasi untuk replikasi:
use master
go
exec sp_replicationdboption N'test1', N'publish', true
go
exec sp_replicationdboption N'test2', N'publish', true
go
Membuat kustom disimpan prosedur untuk INSERT, UPDATE, dan
MENGHAPUS operasinya pada semua database untuk menerapkan perubahan yang dibuat
selama replikasi.
Catatan Biasanya, ketika Anda memasukkan nilai ke dalam kolom identitas,
IDENTITY_INSERT pilihan untuk meja harus ON. Tugas ini dicapai dengan
TIDAK untuk REPLIKASI pilihan untuk masuk replikasi agen.
Anda
tidak dapat memperbarui nilai-nilai di kolom identitas. Oleh karena itu, ketika Anda memperbarui
nilai-nilai selama replikasi, Anda harus menghapus nilai-nilai lama dan masukkan
nilai-nilai baru. Untuk membuat disimpan prosedur kustom, ikuti langkah berikut:
Membuat kustom disimpan prosedur di test1 database:
use test1
go
-- INSERT Stored Procedure
create procedure sp_ins_two_way_test1
@pkcol int,
@intcol int,
@charcol char(100),
@timestampcol timestamp,
@rowidcol uniqueidentifier
as
insert into two_way_test1
(
pkcol,
intcol,
charcol
)
values
(
@pkcol,
@intcol,
@charcol
)
go
--UPDATE Stored Procedure
create procedure sp_upd_two_way_test1
@pkcol int,
@intcol int,
@charcol char(100),
@timestampcol timestamp,
@rowidcol uniqueidentifier,
@old_pkcol int
as
declare @x int
declare @y int
declare @z char(100)
select
@x=pkcol,
@y=intcol,
@z=charcol
from
two_way_test1
where
pkcol = @pkcol
delete
two_way_test1
where
pkcol=@pkcol
insert into two_way_test1
(
pkcol,
intcol,
charcol
)
values
(
case isnull(@pkcol,0) when 0 then @x else @pkcol end,
case isnull(@intcol,0) when 0 then @y else @intcol end,
case isnull(@charcol,'N') when 'N' then @z else @charcol end
)
go
-- DELETE Stored Procedure
create procedure sp_del_two_way_test1
@old_pkcol int
as
delete
two_way_test1
where
pkcol = @old_pkcol
go
Membuat kustom disimpan prosedur di Uneltele Mele nelu57 database:
use test2
go
-- INSERT Stored Procedure
create procedure sp_ins_two_way_test2
@pkcol int,
@intcol int,
@charcol char(100),
@timestampcol timestamp,
@rowidcol uniqueidentifier
as
insert into two_way_test2
(
pkcol,
intcol,
charcol
)
values
(
@pkcol,
@intcol,
@charcol
)
go
--UPDATE Stored Procedure
create procedure sp_upd_two_way_test2
@pkcol int,
@intcol int,
@charcol char(100),
@timestampcol timestamp,
@rowidcol uniqueidentifier,
@old_pkcol int
as
declare @x int
declare @y int
declare @z char(100)
select
@x=pkcol,
@y=intcol,
@z=charcol
from
two_way_test2
where
pkcol = @pkcol
delete
two_way_test2
where
pkcol=@pkcol
insert into two_way_test2
(
pkcol,
intcol,
charcol
)
values
(
case isnull(@pkcol,0) when 0 then @x else @pkcol end,
case isnull(@intcol,0) when 0 then @y else @intcol end,
case isnull(@charcol,'N') when 'N' then @z else @charcol end
)
go
-- DELETE Stored Procedure
create procedure sp_del_two_way_test2
@old_pkcol int
as
delete
two_way_test2
where
pkcol = @old_pkcol
go
Menciptakan publikasi transaksional, dan kemudian tambahkan artikel
publikasi di kedua test1 dan Uneltele Mele nelu57 database:
Mengaktifkan sebagai pelanggan semua server yang berpartisipasi dalam
replikasi:
exec sp_addsubscriber
@subscriber = '<Your Server Name>',
@login = '<login name>',
@password = '<password>'
go
Mengidentifikasi satu database sebagai pelanggan tengah.
Membuat transaksional langganan di semua database yang berpartisipasi dalam
replikasi sehingga semua database berlangganan ke pelanggan tengah dan
pelanggan tengah berlangganan semua database.
Untuk
contoh, dalam skenario ini, test1 database yang pelanggan tengah. Membuat transaksional
langganan di Uneltele Mele nelu57 database yang berlangganan publikasi di test1 dan dalam test1 database yang berlangganan publikasi di Uneltele Mele nelu57.
Catatan Membuat semua langganan dengan pilihan LOOPBACK_DETECTION
diaktifkan.
Untuk melakukannya, gunakan kode berikut:
--Adding the transactional subscription in test1.
use test1
go
exec sp_addsubscription
@publication = N'two_way_pub_test1',
@article = N'all',
@subscriber = '<Your Server Name>',
@destination_db = N'test2',
@sync_type = N'none',
@status = N'active',
@update_mode = N'sync tran',
@loopback_detection = 'true'
go
-- Adding the transactional subscription in test2.
use test2
go
exec sp_addsubscription
@publication = N'two_way_pub_test2',
@article = N'all',
@subscriber = '<Your Server Name>',
@destination_db = N'test1',
@sync_type = N'none',
@status = N'active',
@update_mode = N'sync tran',
@loopback_detection = 'true'
go
Catatan Anda juga dapat membuat kustom disimpan prosedur untuk semua publikasi
dengan menggunakan sp_scriptpublicationcustomprocs sistem disimpan prosedur. Untuk informasi lebih lanjut tentang sp_scriptpublicationcustomprocs sistem disimpan prosedur, melihat
"sp_scriptpublicationcustomprocs" topik dalam buku yang diperbarui SQL Server 2000
Online.
Catatan SQL Query Analyzer kembali hanya 256 karakter per kolom. Anda
dapat mengubah pilihan ini untuk maksimum yang diizinkan nilai.
Untuk informasi tambahan, klik artikel berikut
nomor ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
320499
(http://support.microsoft.com/kb/320499/EN-US/
)
Bagaimana untuk secara manual melakukan sinkronisasi replikasi langganan oleh menggunakan cadangan atau pemulihan
299903
(http://support.microsoft.com/kb/299903/
)
FIX: sp_scriptpublicationcustomprocs menghasilkan replikasi disimpan prosedur
327817
(http://support.microsoft.com/kb/327817/
)
INF: Menggunakan "-SkipErrors" Parameter di agen distribusi hati-hati
Untuk informasi tambahan tentang pelaksanaan bidirectional transaksional
replikasi di SQL Server 7.0, klik nomor artikel di bawah ini untuk melihat artikel di dalam Basis Pengetahuan Microsoft:
300164
(http://support.microsoft.com/kb/300164/EN-US/
)
INF: Cara Set Up identitas kolom pada kedua penerbit dan
Pelanggan dengan Transactional Replication with scripts
240235
(http://support.microsoft.com/kb/240235/
)
BUG: "menerapkan Nonpartitioned, Bi-directional, transaksional replikasi" sampel di buku Online berisi kesalahan
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:820675
(http://support.microsoft.com/kb/820675/en-us/
)
Seberapa besar usaha yang anda keluarkan dalam menggunakan artikel ini?
Sangat kecil
Kecil
Menengah
Besar
Sangat besar
Apa yang dapat kami lakukan untuk meningkatkan informasi ini?
Untuk melindungi privasi Anda, jangan menyertakan informasi kontak dalam umpan balik Anda.
Terima kasih! Umpan balik Anda akan digunakan untuk membantu meningkatkan konten dukungan kami. Untuk opsi-opsi bantuan lebih lanjut, kunjungi Halaman Muka Bantuan dan Dukungan.