Μικρός οδηγός για SQL Server 2005 Merge Replication with Web synchronization

Μιας και τις τελευταίες μέρες ασχολήθηκα αρκετά με merge replication μέσω web synchronization για sql server 2005, θα παραθέσω εδώ μερικά απλά βηματάκια για να το υλοποιήσετε μέσω των GUIs του SQL Server Management Studio και να γίνει η ζωή σας πιο εύκοληBig Smile

Να αναφερθεί όλες οι εκδόσεις του sql server 2005 εκτός από την express, μπορούν να λειτουργήσουν ως publishers και distributors. 

Αρχικά, θα ήταν καλό να δημιουργήσουμε έναν νέο windows user στον publisher, ώστε με τα κατάλληλα permissions να χρησιμοποιηθεί για το replication, αλλά και ένα sql server login, το οποίο θα πρέπει να είναι συσχετισμένο με ένα database user ο οποίος να είναι dbowner στη βάση που θέλουμε να κάνουμε replicate.

 Αρχική Ρύθμιση του IIS

Το web synchronization μπορεί να παίξει είτε με IIS 5 ή 6. Αφού τον εγκαταστήσουμε στο σύστημά μας, θα πρέπει να του δώσουμε ένα SSL certificate, καθώς το web synchronization δουλεύει μέσω του https πρωτοκόλλου. Αν δεν έχουμε πιστοποιητικό από κάποιον παροχέα (π.χ. Verisign), μπορούμε να κατεβάσουμε το IIS 6 resource kit από εδώ, να το εγκαταστήσουμε και μετά να τρέξουμε το selfSSL.exe ώστε να εγκατασταθεί ένα πιστοποιητικό ασφαλείας για τον IIS μας. Κατόπιν, θα πρέπει να τρέξουμε μια management κονσόλα (Start->Run->mmc) και να κάνουμε add το snap-in για certificates. Αφού το κάνουμε αυτό, θα πρέπει να βρούμε το πιστοποιητικό που εγκαταστάθηκε, να του κάνουμε ένα export και μετά ένα import στο trusted root certificates store.

Ρύθμιση του publisher

Ανοίγουμε το  (SSMS) συνδεόμαστε στον database server μας ο οποίος θέλουμε να γίνει distributor. Πάμε στο σημείο που λέει replication, ανοίγουμε τα subnodes, επιλέγουμε αυτό με το όνομα ‘Local Publications’, δεξί κλικ και επιλέγουμε new publication. Αν δεν έχουμε ρυθμίσει τον sql server μας να είναι distributor, θα μας ζητηθεί να το κάνουμε. Καλό θα είναι το folder που θα αποθηκεύεται το snapshot να το έχουμε ρυθμίσει σαν UNC share, με τα κατάλληλα permissions. Στην επόμενη καρτέλα (replication type) επιλέγουμε merge publication, κατόπιν τα είδη sql server που πρόκειται να λειτουργήσουν σαν subscribers. Κατόπιν, επιλέγουμε ποια database objects θα είναι διαθέσιμα για replication, και αν αυτά θα είναι download only από το server ή αν αλλαγές σε αυτά από τους subscribers θα γίνονται apply στον Publisher. Στη συνέχεια, επιλέγουμε αν θέλουμε φίλτρα πάνω στα database objects που θα κάνουμε publish (π.χ. μέσω κάποιον sql queries). Τέλος, επιλέγουμε το πότε θα τρέχει ο snapshot agent και μετά τα security settings του, δηλαδή κάτω από ποια user permissions θα τρέχει (προφανώς θα πρέπει δικαιώματα εγγραφής στον UNC κατάλογο που περιγράψαμε παραπάνω) και πώς θα συνδέεται στον publisher. Το publication μας είναι πλέον έτοιμο, αφού του δώσουμε ένα όνομα.

Στη συνέχεια, κάνουμε δεξί κλικ στο publication που δημιουργήσαμε, και επιλέγουμε ‘Configure web synchronization’. Επιλέγουμε τον τύπο του sql server που θα χρησιμοποιήσει το virtual directory, και στην επόμενη καρτέλα επιλέγουμε το virtual directory που θα χρησιμοποιήσουμε. Θα αντιγραφεί εκεί πέρα το replisapi.dll, αρχείο απαραίτητο για το web synchronization. Επιλέγουμε ένα alias για το virtual directory και μετά επιλέγουμε τον τύπο του authentication που θα απαιτείται από το virtual directory, προκειμένου κάποιος subscriber να κάνει replication. Στη συνέχεια, επιλέγουμε έναν χρήστη που θα κάνει authentication, ώστε ο wizard να δώσει τα κατάλληλα permissions στο virtual directory. Τέλος, στην επόμενη καρτέλα, βάζουμε το UNC share για το snapshot folder.

Ο publisher μας είναι πλέον έτοιμος. Μπορούμε να δούμε το status του και πιθανά error messages από το replication monitor (δεξί κλικ πάνω στο publication και ‘Launch Replication Monitor’).

 

Ρύθμιση του subscriber

Στο node Local subscriptions, κάνουμε δεξί κλικ και επιλέγουμε ‘New subscriptions’. Συνδεόμαστε με τον Publisher, επιλέγουμε το publication και κατόπιν επιλέγουμε pull subscription (μιας και, προφανώς, το web synchronization δεν δουλεύει με push). Επιλέγουμε τη βάση του subscriber που θα κάνουμε replicate, και κατόπιν φτιάχνουμε τα security settings του merge agent. Στη συνέχεια, επιλέγουμε πότε θα τρέχει ο merge agent, είτε συνέχεια, είτε on demand, είτε με ένα schedule που θα του ορίσουμε εμείς. Στην επόμενη καρτέλα, επιλέγουμε το πότε θα γίνει initialize το subscription, μετά κάνουμε tick στο checkbox για να ενεργοποιηθεί το web synchronization, και στη συνέχεια δίνουμε τα στοιχεία για τη σύνδεση με τον IIS (δηλ. το URL και τα στοιχεία του χρήστη που φτιάξαμε στον publisher). Τελικά, επιλέγουμε αν το subscription θα είναι client type ή server type. Το subscription μας είναι έτοιμο.

Force web synchronization

Παραθέτω και RMO κώδικα σε VB .NET για να κάνετε force web synchronization (από SQL Server Books Online)

Public Sub SynchronizeWebNow()

        Dim publisherInstance As String = publisherName

        Dim hostname As String = “hostname”
        Dim webSyncUrl As String = “https://” + publisherInstance + “/VirtualDirectory/replisapi.dll”

        ‘ Create a connection to the Subscriber.
        Dim conn As ServerConnection = New ServerConnection(subscriberName, “username”, “password”)

        Dim subscription As MergePullSubscription
        Dim agent As MergeSynchronizationAgent

        Try
            ‘ Connect to the Subscriber.
            conn.Connect()

            ‘ Define the pull subscription.
            subscription = New MergePullSubscription()
            subscription.ConnectionContext = conn
            subscription.DatabaseName = subscriptionDbName
            subscription.PublisherName = publisherName
            subscription.PublicationDBName = publicationDbName
            subscription.PublicationName = publicationName

            ‘ If the pull subscription exists, then start the synchronization.
            If subscription.LoadProperties() Then
                ‘ Get the agent for the subscription.
                agent = subscription.SynchronizationAgent

                ‘ Check that we have enough metadata to start the agent.
                ‘If agent.PublisherSecurityMode = Nothing Then
                ‘ Set the required properties that could not be returned
                ‘ from the MSsubscription_properties table.

                agent.PublisherSecurityMode = SecurityMode.Standard
                agent.PublisherPassword = “publisherpassword”
                agent.PublisherLogin = “publisherusername”
                agent.Distributor = publisherInstance
                agent.DistributorSecurityMode = SecurityMode.Standard
                agent.DistributorLogin = “distibutorusername”
                agent.DistributorPassword = “distibutorpassword”
                agent.SubscriberLogin = “subscriberusername”
                agent.SubscriberSecurityMode = SecurityMode.Standard
                agent.SubscriberPassword = “subscriberpassword”
         

                ‘ Set optional Web synchronization properties.
                agent.UseWebSynchronization = True
                agent.InternetUrl = webSyncUrl

                agent.InternetSecurityMode = SecurityMode.Standard
                agent.InternetLogin = “windowsusername”
                agent.InternetPassword = “windowsuserpassword”
    

                ‘ Enable agent logging to the console.
                agent.OutputVerboseLevel = 1
                agent.Output = “”

                ‘ Synchronously start the Merge Agent for the subscription.
                agent.Synchronize()
            Else
                ‘ Do something here if the pull subscription does not exist.
                Throw New ApplicationException(String.Format( _
                 “A 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. Verify that the subscription has ” + _
             “been defined correctly.”, ex)
        Finally
            conn.Disconnect()
        End Try
    End Sub

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s