Bu adım adım makalede, çift yönlü işlem çoğaltması nasıl açıklar. Bu makalede ayrıca, çift yönlü işlem çoğaltması gerçekleştirmek söz konusu sorunları anlatılır.
Çift yönlü işlem yineleme olarak da bilinen çift yönlü işlem çoğaltması, bir sunucu hem yayımcı hem de aynı verilere abone olmasını sağlar. Yineleme işlemine katılan sunucular olur çünkü çoğaltılır, tüm değişiklikleri diğer sunuculara, değişiklikleri özgün sunucuya geri dağıtılmasını değil.
Iki sunucu (sunucu ve sunucu B) varsa, örneğin, sunucular aşağıdaki koşulların her ikisi de doğruysa çift yönlü işlem çoğaltması olduğu söylenir:
Tablo T1 sunucu B'deki BIR öğeler tablo T1 Server sırasında yapılan değişiklikleri çoğaltılmamışsa
Tablo T1 sunucu A'ADRESINDEKI sunucu b tablo T1 yaptığınız değişiklikler çoğaltılır
Bu nedenle, bir değişiklik, sunucu A kaynağı, değişiklik, sunucu B için çoğaltılır, ancak sunucu B değil yaymak aynı değişikliği geri Server A Replication dağıtıcı göndermek için değişiklikler sunucu kaynak için yeniden olup olmadığını belirlemek için kullandığı bir geridöngü algılama düzeneğini kullanır.
Çift yönlü işlem çoğaltması için sunuculardan biri merkezi abonesi olarak çalışabildiği ve tüm diğer sunucuları için bir merkez abone abone olun. Bu nedenle, değişiklikleri, bir sunucuda merkezi abonesi tarafından çoğaltılır, ve sonra merkez abone, sırayla değişikliklerin yineleme işlemine katılan tüm diğer sunuculara çoğaltır. Ancak, geridöngü algılama düzeneğini yardımıyla, değişikliği özgün sunucuya yayılmasını dağıtıcı durdurur.
Örneğin, üç sunucu (sunucu, sunucu B ve Server-C)'ı çift yönlü işlem çoğaltmaya katılan ve sunucu merkez abone olursa yayıncıların ve abonelerin aşağıdaki yollarla saklanır:
BIR sunucu için sunucu B'ı ve Server C yayımlar.
<a1>Sunucu</a1> BIR sunucu B'YI ve Server C abone olur.
<a1>Sunucu</a1> B yayımlar ve sunucudan yalnızca abone olan A.
<a1>Sunucu</a1> C yayımlar ve sunucudan yalnızca abone olan A.
Bu nedenle, sunucu B kaynağı herhangi bir değişiklik için Sunucu A ve sunucu c çoğaltılacağı
Çoğaltmaya katılan bir sunucu üzerinde değişiklikler yaptığınızda, değişiklikler, diğer katılımcı tüm sunuculara çoğaltılır. Bu bir çoğaltma sırasında çakışma ortaya çıkabilir ve çoğaltması başarısız. Aşağıdaki liste, olası çakışmaları ve bu çakışmaları önlemek yolları açıklanmaktadır:
Sunuculardan biri bir tabloya bir anahtarı olan bir kayıt eklediğiniz ve yineleme işlemine katılan diğer sunucular üzerinde aynı anahtarı olan başka bir kayda var, çoğaltma değişiklikleri diğer sunuculara yaymak değil.
Önerilen eylem Bu sorunun oluşmaması için <a0></a0>, yineleme işlemine katılan her sunucuda farklı anahtarlar kullandığınızdan emin olun. Bunu yapmak için <a0></a0>, tuşları, yineleme işlemine katılan her sunucu için önceden belirlenmiş bir dizi ayrılamadı. Ayrıca, her sunucuda bir bileşik anahtar kullanabilirsiniz.
UPDATE deyimi, başka bir sunucuda silinen bir kaydı güncelleştirdiğinizde, kaydı sildi ve yineleme, bir hata ile başarısız sunucu sıfır satır etkiler.
Önerilen eylem Bu sorunun oluşmaması için <a0></a0>, aşağıdaki adımlardan birini gerçekleştirin:
@@ ROWCOUNT kaldırmak gerçek UPDATE deyiminin güncelleştirmenin özel saklı yordamında sonra denetleyin.
-VEYA-
Use -Skiperrors bu hata atlamak Dağıtım Aracısı için bir parametre. Işlem çoğaltması atlanıyor hataları hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
UPDATE deyimi güncelleştirmesine saklı yordamını önce bir kayıt için bakın. Hiçbir kayıt varsa, UPDATE deyiminin atlamak, ve kayıt üzerinde tüm abonelerin silinir.
Bir sütun, bir kayıttaki aynı anda başka bir sunucuda güncelleştirildi güncelleştirdiğinizde, verileri iki sunucularda farklı olabilir.
Önerilen eylem Bu sorunun oluşmaması için <a0></a0>, verileri diğer sunuculara aynı anda güncelleştiriliyor, belirleyin ve sonra tüm gerekli eylemi gerçekleştirin. Saklı yordamını, güncelleştirmenin özel saklı yordamın değiştirin ve güncelleştirmeyi aranacak XCALL sözdizimi'ni kullanın. Güncelleştirme yordamı olarak adlandırılır ve güncelleştirilmiş sütunundaki değerleri sağlar önce XCALL sözdizimi, tüm sütunlar için değerleri sağlar. Güncelleştirme, saklı yordamı çağrılmadan önce sütunun değeri karşı geçerli değeri karşılaştırabilirsiniz. Farklı değerler görürseniz, sütun farklı sunucuları tarafından aynı anda güncelleştiriliyor. Saklı yordamın, hangi değerin devam ederse seçmek için özelleştirebilirsiniz. XCALL kullanma hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
Not Karşılık gelen güncelleştirmenin aranacak XCALL sözdizimi saklı yordamını veya saklı yordam, yayın sırasında sp_addarticle kullanarak silme belirtebilirsiniz. Ayrıca, SQL Server Enterprise Manager'ı kullanarak XCALL sözdizimi belirtebilirsiniz. Bunu yapmak için şu adımları izleyin:
SQL Server Enterprise Manager'da, istediğiniz yayını bulun.
Yayını'nı sağ tıklatın ve sonra da Properties ' i tıklatın.
Makaleyi bulmak makaleleri sekmesini tıklatın ve makaleyi yanındaki makale Özellikler düğmesini (...) tıklatın.
Tablo makalesi özellikleri iletişim kutusunda, Komutlar sekmesini tıklatın.
Bu saklı yordam çağrısı Değiştir GÜNCELLEŞTIR komutlarıyla metin kutusuna XCALL yazın ve Tamam ' ı tıklatın.
Yayını özellikler iletişim kutusunda, <a3>Tamam</a3>'ı tıklatın.
Bir kayıttaki farklı sütunlar güncelleştirdiğinizde, farklı bir sütun, bir kaydın eşzamanlı güncelleştirmeleri bazen çakışmalarına neden olabilir.
Önerilen eylem Bu sorunun oluşmaması için <a0></a0>, farklı sütunlar aynı kaydı aynı anda güncelleştirilir ve sonra tüm gerekli eylemi gerçekleştirin belirler. Bunu yapmak, güncelleştirmenin özel saklı yordamın değiştirin ve sonra XCALL için güncelleştirmeyi aramak için sözdizimi saklı yordamını. Güncelleştirme saklı yordamı çağrılmadan önce XCALL sözdizimi değerlerini sağladığından, gerçek güncelleştirme gerçekleştirilmeden önce aşağıdaki seçeneklerden birini güncelleştirme depolanmış yordamın ekleyebilirsiniz:
Tüm sütunların değerlerini güncelleştirme saklı yordamını önce karşı olarak adlandırılan geçerli değerleri karşılaştırın.
Bir sütunun satır sürümü temsil eden ve güncelleştirmenin saklı yordamını önce geçerli değerini değeriyle karşılaştırılacak adlı ekleyin.
Aynı anda farklı sütunlar güncelleştirilmekte olan farklı değerleri gösterir. Daha sonra sütun güncelleştirilip güncelleştirilmeyeceğini karar verebilirsiniz.
Aynı anda başka bir sunucu tarafından güncelleştirilen bir satırı sildiğinizde, çoğaltması başarısız olabilir.
Önerilen eylem Bir satır güncelleştirildi ve aynı anda silindi, belirlemek için <a0></a0>, silme, saklı yordamda XCALL sözdizimi'ni kullanın. Her sütun değerleri karşı siliniyor silme saklı yordamı çağrılmadan önce satırın karşılaştırın. Bu güncelleştirmelerin aynı anda gerçekleştirilmekte farklı değerleri gösterir. Silmek veya güncelleştirilmiş satır korur.
Not Abone kaydı silme olsa bile, kayıt SILME kaynaklanan sunucuda artık ifadesi.
DELETE deyimi abonelerin bazı satırlar etkilemez, çünkü yineleme işlemine katılan bir başka bir sunucuya aynı anda silinmiş olan bir satırı sildiğinizde, yineleme başarısız olur.
Önerilen eylem Bu sorunun oluşmaması için <a0></a0>, aşağıdaki adımlardan birini gerçekleştirin:
@@ ROWCOUNT kaldırmak sonra güncelleştirmenin özel saklı yordamın gerçek DELETE deyiminde denetleyin.
-VEYA-
Use -Skiperrors parametresi bu hatanın atlamak için Dağıtım Aracısı en. Işlem çoğaltması atlanıyor hataları hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
Not Her dağıtım iş gereksinimlerine bağlı olarak, bu çakışmaları çözmek için farklı bir yaklaşım kullanmanız gerekebilir. Bu çakışmaları yalnızca iki sunucular, söz konusu çözümlemeye daha kolaydır. Ikiden fazla sunucu söz konusu olduğunda, saklı yordamlar, hangi sunucunun değişiklikleri geldiğini belirlemek için kullanmak mümkün olabilir. Sunucu c kayıtları güncelleştirmek için kullanılan depolanan güncelleştirme yordamı, değişiklik sunucu veya sunucu b kaynağı bilmez Birleştirme çoğaltması farklı olarak, işlem çoğaltması, çakışmaları çözümlemek için tasarlanmamıştır. Yalnızca burada çakışmaları yerine kaçınılması senaryolarda işlem çoğaltması dağıtmak çözümlendi.
Çift yönlü işlem çoğaltması uygulamak için aşağıdaki koşulların tümünün doğru olması gerekir:
Verileri çoğaltma sunucular arasında eşitlenir.
Çoğaltma tarafından kullanılan saklı yordamlar, katılan tüm veritabanlarında bulunur.
Abonelik @ loopback_detection kullanılarak ayarlanmış durumda = 'true' parametresi.
Not Seçeneği @ loopback_detection ayarlamak = 'true' kullanıcı arabiriminde şu anda kullanılabilir değil. Bu nedenle, sp_addsubscription saklı yordamını kullanarak abone olmalısınız.
Yedekleme ve geri yükleme gerçekleştiriyorsanız, farklı siteler farklı yinelenen birincil anahtarlar oluşturulmadı emin olmak için birincil anahtar kısıtlamaları gerektiğini unutmayın. Tüm kısıtlamalar IÇIN NOT REPLICATION yan tümcesiyle birlikte oluşturmak de unutmayın.
Aşağıdaki örnek, SQL Server 2000 çalıştıran bir bilgisayarda çift yönlü işlem çoğaltması ayarlamak için kullanabilirsiniz.
Not Transact-SQL deyimlerini aşağıdaki adımlar için listelenen. Önceki adımda anlatılan görevi gerçekleştirmek için Transact-SQL deyimlerini çalıştırın.
SQL Server çalıştıran bir bilgisayarda, bir dağıtıcı, yayımcı ve abonelerin oluşturun. Bunu yapmak için şu adımları izleyin:
Iki veritabanını oluşturun:
use master
go
create database test1
go
create database test2
go
Bir IDENTITY sütunu IÇIN NOT REPLICATION seçeneği ayarlanmış olan iki tablo oluşturun:
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
Böylece farklı sunucular üzerindeki değerleri, aynı aralıkta olmayan bir önceden belirlenmiş aral??? için birincil anahtar sütunu ayrılamadı. Örneğin, test1 veritabanındaki two_way_test1 tablosu için bir anahtar aralığı 1-1000 zorlamak ve sonra da anahtar <a0>test2</a0> veritabanında two_way_test2 tablo aralığı olarak 1001-2000 zorlamak. Bunu yapmak için şu kodu kullanın:
-- 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
Dağıtıcı olarak sunucunuzu etkinleştirin ve sonra bir dağıtım veritabanı oluşturun:
use master
go
sp_adddistributor @distributor = '<distributor name>'
go
use master
go
sp_adddistributiondb @database='distribution'
go
Çoğaltma yayımcı üyesi olan SQL Server çalıştıran tüm bilgisayarların etkinleştir:
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>'
Çoğaltma için tanımlanan tüm veritabanlarının etkinleştir:
use master
go
exec sp_replicationdboption N'test1', N'publish', true
go
exec sp_replicationdboption N'test2', N'publish', true
go
INSERT, UPDATE özel saklı yordamlarda oluşturmak ve çoğaltma sırasında yapılan değişiklikleri uygulamak için tüm veritabanlarının işlemlerde DELETE.
Not Genellikle, bir IDENTITY sütununa bir değer eklediğinizde, tablonun ıdentıty_ınsert seçeneği AÇıK olmalıdır. Bu görev IÇIN NOT REPLICATION seçeneği için gelen çoğaltma aracıları tarafından sağlanır.
KIMLIK sütununu değerleri güncelleştiremiyor. Çoğaltma sırasında değerleri güncelleştirdiğinizde, bu nedenle, eski değerlerini kaldırın ve yeni değerler eklemek gerekir. Özel saklı yordamlarda oluşturmak için aşağıdaki adımları izleyin:
Create the custom stored procedures in the 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
Create the custom stored procedures in the test2 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
Işlem bir yayın oluşturursanız ve makalelere, test1 ve test2 veritabanlarının her ikisini de yayına ekleyin:
Çoğaltmaya katılan tüm sunucuları aboneleri etkinleştir:
exec sp_addsubscriber
@subscriber = '<Your Server Name>',
@login = '<login name>',
@password = '<password>'
go
Veritabanlarının bir merkezi abonesi olarak tanımlayın. Böylece, tüm veritabanlarının merkezi için abone ol ve merkez abone için diğer tüm veritabanlarının abone olan yineleme işlemine katılan tüm veritabanlarının işlem abonelikler oluşturun.
Örneğin, bu senaryoda, test1 veritabanı merkez abone olur. Işlem abonelikler, yayın sırasında test1 abone test2 veritabanında ve test2 adresindeki yayınına abone test1 veritabanında oluşturun.
Not Tüm abonelikler LOOPBACK_DETECTION seçeneği etkinken oluşturun.
Bunu yapmak için şu kodu kullanın:
--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
NotSp_scriptpublicationcustomprocs Sistem saklı yordamını kullanarak, tüm yayınlar için özel saklı yordamlarda da oluşturabilirsiniz. Sp_scriptpublicationcustomprocs Sistem saklı yordamı hakkında daha fazla bilgi için SQL Server 2000 güncelleştirme Books Online'da "sp_scriptpublicationcustomprocs" konusuna bakın.
Not SQL Query Analyzer sütun başına düşen yalnızca 256 karakter verir. Değer izin verilen en fazla için bu seçeneği değiştirebilirsiniz.
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
320499
(http://support.microsoft.com/kb/320499/EN-US/
)
Nasıl yapılır: el ile çoğaltma abonelikler kullanarak yedekleme veya geri yükleme tarafından Eşitle
299903
(http://support.microsoft.com/kb/299903/
)
Düzeltme: depolanan sp_scriptpublicationcustomprocs oluşturuyor çoğaltma yordamlar
SQL Server 7. 0'çift yönlü işlem çoğaltması uygulama hakkında ek bilgi için Microsoft Knowledge Base'deki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
300164
(http://support.microsoft.com/kb/300164/EN-US/
)
INF: Nasıl hem yayımcı hem de abone işlem çoğaltması ile bir kimlik sütunu yukarı ayarla
240235
(http://support.microsoft.com/kb/240235/
)
Hata: "uygulama" Nonpartitioned, çift yönlü, işlem çoğaltma örnek defterleri çevrimiçi hataları içerir.
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:820675
(http://support.microsoft.com/kb/820675/en-us/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.