Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Bu konuda, SQL Server Management Studio, çoğaltma aracıları veya Çoğaltma Yönetimi Nesneleri (RMO) kullanarak SQL Server'daki push aboneliğinin nasıl eşitleneceği açıklanmaktadır.
Uyarı
Azure SQL Yönetilen Örnek, anlık görüntü ve işlem çoğaltması için yayımcı, dağıtıcı ve abone olarak kullanılabilir. Azure SQL Veritabanı'ndaki veritabanları yalnızca anlık görüntü ve işlem çoğaltması için gönderim aboneleri olabilir. Daha fazla bilgi için bkz. Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği ile işlem çoğaltması.
SQL Server Management Studio'yu kullanma
Abonelikler Dağıtım Aracısı (anlık görüntü ve işlem çoğaltması için) veya Birleştirme Aracısı (birleştirme çoğaltması için) tarafından eşitlenir. Ajanlar sürekli çalışabilir, isteğe bağlı olarak çalıştırılabilir veya bir zamanlamaya göre çalışabilir. Eşitleme zamanlamalarını belirtme hakkında daha fazla bilgi için bkz. Eşitleme Zamanlamalarını Belirtme.
Microsoft SQL Server Management Studio'daki Yerel Yayınlar ve Yerel Abonelikler klasörlerinden ve Çoğaltma İzleyicisi'ndeki Tüm Abonelikler sekmesinden isteğe bağlı olarak aboneliği eşitleyin. Oracle yayın abonelikleri, aboneden isteğe bağlı olarak eşitlenemez. Çoğaltma İzleyicisi'ni başlatma hakkında bilgi için bkz. Çoğaltma İzleyicisi'ni başlatma.
Management Studio'da (Yayımcı'da) talep üzerine bir push aboneliğini eşitlemek için
Management Studio'da Publisher'a bağlanın ve sunucu düğümünü genişletin.
Çoğaltma klasörünü genişletin ve ardından Yerel Yayınlar klasörünü genişletin.
Abonelikleri senkronize etmek istediğiniz yayının ayrıntılarını açın.
Eşitlemek istediğiniz aboneliğe sağ tıklayın ve ardından Eşitleme Durumunu Görüntüle'ye tıklayın.
Eşitleme Durumunu Görüntüle - <Abone>:<AbonelikVeritabanı> iletişim kutusunda Başlat'a tıklayın. Eşitleme tamamlandığında Eşitleme tamamlandı iletisi görüntülenir.
Kapat'a tıklayın.
Talep üzerine Management Studio'da (Abonede) bir iletim aboneliğini eşitlemek için
Management Studio'da Abone'ye bağlanın ve ardından sunucu düğümünü genişletin.
Çoğaltma klasörünü genişletin ve ardından Yerel Abonelikler klasörünü genişletin.
Eşitlemek istediğiniz aboneliğe sağ tıklayın ve ardından Eşitleme Durumunu Görüntüle'ye tıklayın.
Dağıtımcı ile bağlantı kurma hakkında bir ileti görüntülenir. Tamam'a tıklayın.
Eşitleme Durumunu Görüntüle - <Abone>:<AbonelikVeritabanı> iletişim kutusunda Başlat'a tıklayın. Eşitleme tamamlandığında Eşitleme tamamlandı iletisi görüntülenir.
Kapat'a tıklayın.
Replication Monitor'da isteğe bağlı olarak bir push aboneliğini senkronize etmek için
Çoğaltma İzleyicisi'nde, sol bölmede bir Yayımcı grubunu genişletin, bir Publisher'ı genişletin ve sonra bir yayına tıklayın.
Tüm Abonelikler sekmesine tıklayın.
Eşitlemek istediğiniz aboneliğe sağ tıklayın ve ardından Eşitlemeyi Başlat'a tıklayın.
Eşitleme ilerleme durumunu görüntülemek için aboneliğe sağ tıklayın ve ardından Ayrıntıları Görüntüle'ye tıklayın.
Çoğaltma Aracılarını Kullanma
Push abonelikleri, komut satırından uygun çoğaltma aracısının yürütülebilir dosyası çağrılarak programatik olarak ve istemli olarak eşitlenebilir. Çağrılan çoğaltma aracısı yürütülebilir dosyası, gönderme aboneliğinin ait olduğu yayın türüne bağlıdır.
Dağıtım Aracısı'nı başlatarak bir gönderim aboneliğini işlem yayınına senkronize etmek için
Komut isteminden veya Dağıtımcı'daki bir toplu iş dosyasından distrib.exe'yi çalıştırın. Aşağıdaki komut satırı argümanlarını belirtin:
-Yayınevi
-PublisherDB
-Dağıtıcı
-Abone
-SubscriberDB
-SubscriptionType = 0
SQL Server Kimlik Doğrulaması kullanıyorsanız aşağıdaki bağımsız değişkenleri de belirtmeniz gerekir:
-DistributorLogin
-DağıtıcıŞifre
-DistributorSecurityMode = 0
-PublisherLogin
-PublisherPassword
-PublisherSecurityMode = 0
-SubscriberLogin
-SubscriberPassword
-SubscriberSecurityMode = 0
Önemli
Mümkün olduğunda Windows kimlik doğrulamayı kullanın.
Birleştirme yayınına gönderme aboneliğini eşitlemek için Birleştirme Aracısı'nı başlatın.
Dağıtımcı'daki komut isteminden veya bir toplu iş dosyasında replmerg.exe dosyasını çalıştırın. Aşağıdaki komut satırı parametrelerini giriniz:
-Yayınevi
-PublisherDB
-Yayın
-Dağıtıcı
-Abone
-SubscriberDB
-SubscriptionType = 0
SQL Server Kimlik Doğrulaması kullanıyorsanız aşağıdaki bağımsız değişkenleri de belirtmeniz gerekir:
-DistributorLogin
-DistributorPassword
-DistributorSecurityMode = 0
-PublisherLogin
-PublisherPassword
-PublisherSecurityMode = 0
-SubscriberLogin
-SubscriberPassword
-SubscriberSecurityMode = 0
Önemli
Mümkün olduğunda Windows kimlik doğrulamayı kullanın.
Örnekler (Çoğaltma Aracıları)
Aşağıdaki örnek, bir gönderim aboneliğini eşitlemek için Dağıtım Aracısı'nı başlatır.
REM -- Declare the variables.
SET Publisher=%instancename%
SET Subscriber=%instancename%
SET PublicationDB=AdventureWorks2022
SET SubscriptionDB=AdventureWorks2022Replica
SET Publication=AdvWorksProductsTran
REM -- Start the Distribution Agent with four subscription streams.
REM -- The following command must be supplied without line breaks.
"C:\Program Files\Microsoft SQL Server\120\COM\DISTRIB.EXE" -Subscriber %Subscriber%
-SubscriberDB %SubscriptionDB% -SubscriberSecurityMode 1 -Publication %Publication%
-Publisher %Publisher% -PublisherDB %PublicationDB% -Distributor %Publisher%
-DistributorSecurityMode 1 -Continuous -SubscriptionType 0 -SubscriptionStreams 4
Aşağıdaki örnek, gönderme aboneliğini eşitlemek için Birleştirme Aracısı'nı başlatır.
REM -- Declare the variables.
SET Publisher=%instancename%
SET Subscriber=%instancename%
SET PublicationDB=AdventureWorks2022
SET SubscriptionDB=AdventureWorks2022Replica
SET Publication=AdvWorksSalesOrdersMerge
REM -- Start the Merge Agent.
REM -- The following command must be supplied without line breaks.
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher %Publisher%
-Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PublicationDB%
-SubscriberDB %SubscriptionDB% -Publication %Publication% -PublisherSecurityMode 1
-OutputVerboseLevel 3 -Output -SubscriberSecurityMode 1 -SubscriptionType 0
-DistributorSecurityMode 1
Çoğaltma Yönetimi Nesnelerini (RMO) Kullanma
Çoğaltma Yönetimi Nesneleri (RMO) ve çoğaltma aracısı işlevlerine yönetilen kod erişimi kullanarak anında iletme aboneliklerini program aracılığıyla eşitleyebilirsiniz. Anında iletme aboneliğini eşitlemek için kullandığınız sınıflar, aboneliğin ait olduğu yayın türüne bağlıdır.
Uyarı
Uygulamanızı etkilemeden otonom olarak çalışan bir eşitleme başlatmak istiyorsanız aracıyı zaman uyumsuz olarak başlatın. Ancak, eşitleme işleminin sonucunu izlemek ve eşitleme işlemi sırasında aracıdan geri çağırmalar almak istiyorsanız (örneğin, bir ilerleme çubuğu görüntülemek istiyorsanız), aracıyı zaman uyumlu bir şekilde başlatmanız gerekir. Microsoft SQL Server 2005 Express sürümü Aboneleri için aracıyı zaman uyumlu olarak başlatmanız gerekir.
Anında iletme aboneliğini anlık görüntü yayınına veya işlem tabanlı yayına eşitlemek için
sınıfını kullanarak Dağıtımcı ile ServerConnection bağlantı oluşturun.
Sınıfının bir örneğini TransSubscription oluşturun ve aşağıdaki özellikleri ayarlayın:
DatabaseName için yayın veritabanı adı.
Aboneliğin ait olduğu yayının adı PublicationName.
için SubscriptionDBNameabonelik veritabanının adı.
abonesinin SubscriberNameadı.
1. adımda ConnectionContext için oluşturulan bağlantı.
LoadProperties yöntemini, kalan abonelik özelliklerini almak için çağırın. Bu yöntem false döndürürse aboneliğin var olduğunu doğrulayın.
Dağıtım Aracısını Dağıtımcı'da aşağıdaki yollardan biriyle başlatın:
Adım 2'deki TransSubscription örneğinde SynchronizeWithJob yöntemini çağırın. Bu yöntem, Dağıtım Aracı'nı zaman uyumsuz olarak başlatır ve aracı görevi çalışırken kontrol derhal uygulamanıza geri döner. CreateSyncAgentByDefault değeriyle abonelik oluşturulduysa, bu yöntemi çağıramazsınız.
SynchronizationAgent özelliğinden TransSynchronizationAgent sınıfının bir örneğini alın ve Synchronize yöntemini çağırın. Bu yöntem aracıyı zaman uyumlu olarak başlatır ve denetim çalışan aracı işiyle birlikte kalır. Zaman uyumlu yürütme sırasında aracı çalışırken Status olayını işleyebilirsiniz.
Bir push aboneliğini birleştirme yayınına eşitlemek için
sınıfını kullanarak Dağıtımcı ile ServerConnection bağlantı oluşturun.
Sınıfının bir örneğini MergeSubscription oluşturun ve aşağıdaki özellikleri ayarlayın:
DatabaseName için yayın veritabanı adı.
Aboneliğin PublicationName için ait olduğu yayının adı.
için SubscriptionDBNameabonelik veritabanının adı.
Abonenin adı SubscriberName.
1. adımda ConnectionContext için oluşturulan bağlantı.
Kalan abonelik özelliklerini almak için LoadProperties yöntemini çağırın. Bu yöntem false döndürürse aboneliğin var olduğunu doğrulayın.
Dağıtımcıda Birleştirme Aracısı'nı aşağıdaki yollardan biriyle başlatın:
2. adımda yer alan MergeSubscription örneğinde SynchronizeWithJob yöntemini çağırın. Bu yöntem, Birleştirme Aracısı'nı eşzamanlı olmayan şekilde başlatır ve aracının görevi çalışırken denetim hemen uygulamanıza geri döner. CreateSyncAgentByDefault için false değeriyle abonelik oluşturulduysa bu yöntemi çağıramazsınız.
SynchronizationAgent özelliğinden MergeSynchronizationAgent sınıfının bir örneğini alın ve Synchronize yöntemini çağırın. Bu yöntem Birleştirme Aracısı'nı zaman uyumlu olarak başlatır ve kontrol çalışan aracı işiyle birlikte kalır. Zaman uyumlu yürütme sırasında, Status olayını aracı çalışırken işleyebilirsiniz.
Örnekler (RMO)
Bu örnek, bir push aboneliğini, aracının işi ile zaman uyumsuz olarak başlatılan bir işlemsel yayına senkronize eder.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
/// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
TransSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Instantiate the push subscription.
subscription = new TransSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription and the job exists, start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
// Start the Distribution Agent asynchronously.
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As TransSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Instantiate the push subscription.
subscription = New TransSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription and the job exists, start the agent job.
If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
' Start the Distribution Agent asynchronously.
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
Bu örnek, bir gönderme aboneliğini, aracın eşzamanlı olarak başlatıldığı bir transaksiyonel yayınla eşitler.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
TransSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Define the push subscription.
subscription = new TransSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription exists, start the synchronization.
if (subscription.LoadProperties())
{
// Check that we have enough metadata to start the agent.
if (subscription.SubscriberSecurity != null)
{
// Synchronously start the Distribution Agent for the subscription.
subscription.SynchronizationAgent.Synchronize();
}
else
{
throw new ApplicationException("There is insufficent metadata to " +
"synchronize the subscription. Recreate the subscription with " +
"the agent job or supply the required agent properties at run time.");
}
}
else
{
// Do something here if the push subscription does not exist.
throw new ApplicationException(String.Format(
"The subscription to '{0}' does not exist on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksProductTran"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As TransSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Define the push subscription.
subscription = New TransSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription exists, start the synchronization.
If subscription.LoadProperties() Then
' Check that we have enough metadata to start the agent.
If Not subscription.SubscriberSecurity Is Nothing Then
' Synchronously start the Distribution Agent for the subscription.
subscription.SynchronizationAgent.Synchronize()
Else
Throw New ApplicationException("There is insufficent metadata to " + _
"synchronize the subscription. Recreate the subscription with " + _
"the agent job or supply the required agent properties at run time.")
End If
Else
' Do something here if the push subscription does not exist.
Throw New ApplicationException(String.Format( _
"The subscription to '{0}' does not exist on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
Bu örnek, bir aracı işini kullanarak eşzamanlı olmayan bir şekilde başlatılan birleştirme yayınına yönelik bir push aboneliğini eşitler.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
MergeSubscription subscription;
try
{
// Connect to the Publisher.
conn.Connect();
// Define push subscription.
subscription = new MergeSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription and the job exists, start the agent job.
if (subscription.LoadProperties() && subscription.AgentJobId != null)
{
// Start the Merge Agent asynchronously.
subscription.SynchronizeWithJob();
}
else
{
// Do something here if the subscription does not exist.
throw new ApplicationException(String.Format(
"A subscription to '{0}' does not exists on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As MergeSubscription
Try
' Connect to the Publisher.
conn.Connect()
' Define push subscription.
subscription = New MergeSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription and the job exists, start the agent job.
If subscription.LoadProperties() And Not subscription.AgentJobId Is Nothing Then
' Start the Merge Agent asynchronously.
subscription.SynchronizeWithJob()
Else
' Do something here if the subscription does not exist.
Throw New ApplicationException(String.Format( _
"A subscription to '{0}' does not exists on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
Bu örnek, aracının senkron olarak başlatıldığı bir birleştirme yayınına yönelik push aboneliğini eşitler.
// Define the server, publication, and database names.
string subscriberName = subscriberInstance;
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string subscriptionDbName = "AdventureWorks2022Replica";
string publicationDbName = "AdventureWorks2022";
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
MergeSubscription subscription;
try
{
// Connect to the Publisher
conn.Connect();
// Define the subscription.
subscription = new MergeSubscription();
subscription.ConnectionContext = conn;
subscription.DatabaseName = publicationDbName;
subscription.PublicationName = publicationName;
subscription.SubscriptionDBName = subscriptionDbName;
subscription.SubscriberName = subscriberName;
// If the push subscription exists, start the synchronization.
if (subscription.LoadProperties())
{
// Check that we have enough metadata to start the agent.
if (subscription.SubscriberSecurity != null)
{
// Synchronously start the Merge Agent for the subscription.
subscription.SynchronizationAgent.Synchronize();
}
else
{
throw new ApplicationException("There is insufficent metadata to " +
"synchronize the subscription. Recreate the subscription with " +
"the agent job or supply the required agent properties at run time.");
}
}
else
{
// Do something here if the push subscription does not exist.
throw new ApplicationException(String.Format(
"The subscription to '{0}' does not exist on {1}",
publicationName, subscriberName));
}
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("The subscription could not be synchronized.", ex);
}
finally
{
conn.Disconnect();
}
' Define the server, publication, and database names.
Dim subscriberName As String = subscriberInstance
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim subscriptionDbName As String = "AdventureWorks2022Replica"
Dim publicationDbName As String = "AdventureWorks2022"
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Dim subscription As MergeSubscription
Try
' Connect to the Publisher
conn.Connect()
' Define the subscription.
subscription = New MergeSubscription()
subscription.ConnectionContext = conn
subscription.DatabaseName = publicationDbName
subscription.PublicationName = publicationName
subscription.SubscriptionDBName = subscriptionDbName
subscription.SubscriberName = subscriberName
' If the push subscription exists, start the synchronization.
If subscription.LoadProperties() Then
' Check that we have enough metadata to start the agent.
If Not subscription.SubscriberSecurity Is Nothing Then
' Synchronously start the Merge Agent for the subscription.
' Log agent messages to an output file.
subscription.SynchronizationAgent.Output = "mergeagent.log"
subscription.SynchronizationAgent.OutputVerboseLevel = 2
subscription.SynchronizationAgent.Synchronize()
Else
Throw New ApplicationException("There is insufficent metadata to " + _
"synchronize the subscription. Recreate the subscription with " + _
"the agent job or supply the required agent properties at run time.")
End If
Else
' Do something here if the push subscription does not exist.
Throw New ApplicationException(String.Format( _
"The subscription to '{0}' does not exist on {1}", _
publicationName, subscriberName))
End If
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("The subscription could not be synchronized.", ex)
Finally
conn.Disconnect()
End Try
İlgili içerik
- Çoğaltma Yönetimi Nesneleri Kavramları
- Verileri Eşitle
- Çoğaltma Güvenliği en iyi yöntemleri