Database mirroring si replicare

Atat database mirroring, cat si replicarea, pot fi folosite pe aceeasi baza de date – dar exista unele limitari in aceasta privinta:

Sa consideram urmatorul scenariu: pe o baza de date SQL 2008 configurez database mirroring pe un alt server SQL. Se poate publica aceasta baza de date? Raspunsul este da, iar in cazul in care baza de date face failover, agentul de replicare (de distributie sau merge) poate detecta ca baza de date publicata este acum pe alt server. Acest lucru este posibil doar daca se adauga printre parametrii agentului si –PublisherFailoverPartner.

Acest parametru se adauga fie folosind interfata Management Studio (properties pentru agentul de replicare -> Steps -> Edit pentru "Run agent" -> in lista de parametrii se adauga –PublisherFailoverPartner si apoi numele serverului mirror), fie folosing procedura sp_add_agent_parameter pe baza de Distributie.

Atunci cand se creaza publicatia, baza de date trebuie sa fie Principal pe server, altfel nu putem avea acces la ea.

Ce se intampla daca se doreste punerea in mirroring si a bazei abonate? Acest lucru este posibil (replicarea functioneaza corect), dar nu este suportat (conform https://msdn.microsoft.com/en-us/library/ms151799.aspx)

Deci database mirroring si replicarea pot fi folosite pe aceeasi baza de date, dar doar daca baza de date respectiva este baza publicata (Publisher); mirroring pentru baza de Distributie sau pentru baza abonata (Subscriber) nu este suportat.

Totusi, se poate face mirroing si pe baza abonata, dar in cazul in care se failover, agentul de replicare (de distributie sau merge) nu detecteaza acest lucru si replicarea se opreste.

Mesajul de eroare in acest caz este destul de vag („Execution of job ... failed. See the history log for details”). In cazul in care atasam agentului de replicare un logging detaliat (https://support.microsoft.com/kb/312292 ) vom gasi urmatoarele mesaje in log:

--------------------------------------

2009-12-31 12:19:07.137 Connecting to Subscriber <nume server Subscriber>

2009-12-31 12:19:07.137 Repl Agent Status: 3
2009-12-31 12:19:07.138 Connecting to OLE DB Subscriber at datasource: <nume server Subscriber>, location: '', catalog: 'test_mirroring_repl', providerstring: '' using provider 'SQLNCLI10'
2009-12-31 12:19:07.156 Percent Complete: 0
2009-12-31 12:19:07.157 Category:AGENT

2009-12-31 12:19:07.138 Connecting to OLE DB Subscriber at datasource: <nume server Subscriber>, location: '', catalog: 'test_mirroring_repl', providerstring: '' using provider 'SQLNCLI10'

2009-12-31 12:19:07.156 Percent Complete: 0

2009-12-31 12:19:07.157 Category:AGENT

Source: <nume server Subscriber>

Number: 20052

Message: The process could not access database 'test_mirroring_repl' on server <nume server Subscriber>

2009-12-31 12:19:07.158 Repl Agent Status: 3

2009-12-31 12:19:07.158 Percent Complete: 0

2009-12-31 12:19:07.159 Category:SQLSERVER

Source: <nume server Subscriber>

Number: 4060

Message: Cannot open database "test_mirroring_repl" requested by the login. The login failed.

2009-12-31 12:19:07.159 Repl Agent Status: 3

2009-12-31 12:19:07.160 Percent Complete: 0

2009-12-31 12:19:07.160 Category:SQLSERVER

Source: <nume server Subscriber>

Number: 18456

Message: Login failed for user <nume login>

2009-12-31 12:19:07.161 Repl Agent Status: 3

2009-12-31 12:19:07.162 Disconnecting from OLE DB Subscriber <nume server Subscriber>

--------------------------------------

Evident, din moment de baza de date nu mai este accesibila pe serverul abonat (este in starea de "restoring"), agentul nu se mai poate conecta la ea si deci replicarea datelor nu este posibila.

Imediat dupa ce sa face failover din nou, replicarea se reia, deci nu este necesara reinitializarea.