post icon

Tutorial de configuración de Servidores de Replicación en SQL Server

Es muy típico hoy día necesitar de una alta disponibilidad de los datos de nuestros sistemas informáticos, o distribuirlos a lugares remotos constantemente. Normalmente no es una terea muy sencilla de manejar pero SQL Server en cierto modo nos facilita bastante la vida laboral ya que trae características para estos objetivos, nos ayudará a transaportar nuestros datos de manera integra y segura.

El ambiente necesario es de 2 o más servidores para crear la replicación. Los objetos o conceptos que debemos manejar son seis:

  1. Publicador
  2. Distribuidor
  3. Suscriptor
  4. Publicación
  5. Articulo
  6. Suscripción

El publicador se encuentra alojado en un servidor y se encarga de poner a disposición los datos, es pocas palabras, publica lo que se necesita replicar, en sus publicaciones pueden existir varios articulos, pero no precisamente publica para un suscriptor, sino primero debe pasar por un distribuidor, quién tendrá una copia de la base de datos a replicarse y se encargará de gestionar el histórico, las transacciones e incluso los metadatos. Una vez que los datos se encuentren disponibles en el distribuidor, los suscriptores pueden consumir los datos de allí.

Podemos hacer una analogía con la vida real. El caso de las imprentas que venden el periódico, un ejemplo mundial, el New York Times, ellos tomarían el papel de los publicadores de la información, quienes en cada publicación del periódico escriben muchos artículos. Y nosotros los mortales cumpliendo el rol de suscriptor, con sed de estar actualizados con la ultima info, queremos leer el periódico del día, pero para eso no precisamente vamos a la imprenta a comprar nuestro periódico, existe un intermedio, el distribuidor, el se encarga de acercarnos el periódico a nuestro lugar, previa suscripción.

Existen 3 maneras de configurar los servidores para que funcionen, en la siguiente imagen se puede apreciar, hoy nos enfocaremos en el primer modelo.

Modelos de Replicacion

Modelos de Replicacion

El script para crear el servidor que se encargará de ser publicado y distribuir al mismo tiempo es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use [DevTroce]
exec sp_replicationdboption @dbname = N'DevTroce', @optname = N'merge publish', @value = N'true'
GO
 
-- Agregando la publicación de "Merge"
use [DevTroce]
exec sp_addmergepublication @publication = N'Devtroce_Publish',
@description = N'Publicación de mezcla de la base de datos ''DevTroce'' del publicador ''NABUCODONOSOR''.',
@sync_mode = N'native',
@retention = 14,
@allow_push = N'true',
@allow_pull = N'true',
@allow_anonymous = N'true',
@enabled_for_internet = N'false',
@snapshot_in_defaultfolder = N'true',
@compress_snapshot = N'false',
@ftp_port = 21,
@ftp_subdirectory = N'ftp',
@ftp_login = N'anonymous',
@allow_subscription_copy = N'false',
@add_to_active_directory = N'false',
@dynamic_filters = N'false',
@conflict_retention = 14,
@keep_partition_changes = N'false',
@allow_synctoalternate = N'false',
@max_concurrent_merge = 0,
@max_concurrent_dynamic_snapshots = 0,
@use_partition_groups = null,
@publication_compatibility_level = N'100RTM',
@replicate_ddl = 1,
@allow_subscriber_initiated_snapshot = N'false',
@allow_web_synchronization = N'false',
@allow_partition_realignment = N'true',
@retention_period_unit = N'days',
@conflict_logging = N'both',
@automatic_reinitialization_policy = 0
GO
 
exec sp_addpublication_snapshot @publication = N'Devtroce_Publish',
@frequency_type = 4,
@frequency_interval = 14,
@frequency_relative_interval = 1,
@frequency_recurrence_factor = 0,
@frequency_subday = 1,
@frequency_subday_interval = 5,
@active_start_time_of_day = 500,
@active_end_time_of_day = 235959,
@active_start_date = 0,
@active_end_date = 0,
@job_login = null,
@job_password = null,
@publisher_security_mode = 1
 
use [DevTroce]
exec sp_addmergearticle @publication = N'Devtroce_Publish',
@article = N'Factura',
@source_owner = N'dbo',
@source_object = N'Factura',
@type = N'table',
@description = null,
@creation_script = null,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000010C034FD1,
@identityrangemanagementoption = N'auto',
@pub_identity_range = 100000,
@identity_range = 10000,
@threshold = 80,
@destination_owner = N'dbo',
@force_reinit_subscription = 1,
@column_tracking = N'false',
@subset_filterclause = null,
@vertical_partition = N'false',
@verify_resolver_signature = 1,
@allow_interactive_resolver = N'false',
@fast_multicol_updateproc = N'true',
@check_permissions = 0,
@subscriber_upload_options = 0,
@delete_tracking = N'true',
@compensate_for_errors = N'false',
@stream_blob_columns = N'false',
@partition_options = 0
GO
 
use [DevTroce]
exec sp_addmergearticle @publication = N'Devtroce_Publish',
@article = N'Usuarios',
@source_owner = N'dbo',
@source_object = N'Usuarios',
@type = N'table',
@description = null,
@creation_script = null,
@pre_creation_cmd = N'drop',
@schema_option = 0x000000010C034FD1,
@identityrangemanagementoption = N'manual',
@destination_owner = N'dbo',
@force_reinit_subscription = 1,
@column_tracking = N'false',
@subset_filterclause = null,
@vertical_partition = N'false',
@verify_resolver_signature = 1,
@allow_interactive_resolver = N'false',
@fast_multicol_updateproc = N'true',
@check_permissions = 0,
@subscriber_upload_options = 0,
@delete_tracking = N'true',
@compensate_for_errors = N'false',
@stream_blob_columns = N'false',
@partition_options = 0
GO

Ahora bien queda por configurar el Suscriptor, para ello debemos ejecutar dos scripts más, uno en el servidor de publicación y otro en el suscriptor, aquí vemos el que agregamos primeramente en el publicador, como se puede apreciar, el publicador tendrá la prioridad en caso de encontrarse con conflictos por ende la transacción del suscriptor (Cliente) será anulada.

1
2
3
4
5
6
7
8
9
use [DevTroce]
exec sp_addmergesubscription @publication = N'Devtroce_Publish',
@subscriber = N'GEEKZERO-V',
@subscriber_db = N'DevTroce_Replica',
@subscription_type = N'pull',
@subscriber_type = N'global',
@subscription_priority = 75,
@sync_type = N'Automatic'
GO

Y por ultimo cremos la suscripción en el lado cliente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use [DevTroce_Replica]
exec sp_addmergepullsubscription @publisher = N'NABUCODONOSOR',
@publication = N'Devtroce_Publish',
@publisher_db = N'DevTroce',
@subscriber_type = N'Global',
@subscription_priority = 75,
@description = N'',
@sync_type = N'Automatic'
exec sp_addmergepullsubscription_agent @publisher = N'NABUCODONOSOR',
@publisher_db = N'DevTroce',
@publication = N'Devtroce_Publish',
@distributor = N'NABUCODONOSOR',
@distributor_security_mode = 1,
@distributor_login = N'',
@distributor_password = null,
@enabled_for_syncmgr = N'False',
@frequency_type = 64,
@frequency_interval = 0,
@frequency_relative_interval = 0,
@frequency_recurrence_factor = 0,
@frequency_subday = 0,
@frequency_subday_interval = 0,
@active_start_time_of_day = 0,
@active_end_time_of_day = 235959,
@active_start_date = 20100329,
@active_end_date = 99991231,
@alt_snapshot_folder = N'',
@working_directory = N'',
@use_ftp = N'False',
@job_login = null,
@job_password = null,
@publisher_security_mode = 1,
@publisher_login = null,
@publisher_password = null,
@use_interactive_resolver = N'False',
@dynamic_snapshot_location = null,
@use_web_sync = 0
GO

Comentarios desde Facebook:

  1. avatar
    ELVIN LANDETA DOMINICAN REPUBLIC Internet Explorer Windows
    19 Junio 2012 at 18:20 #

    TENGO UNA PREGUNTA?

    ¿QUE VERSION DE MS SQL SERVER 2008 TRAE SOPORTE PARA HACER REPLICA DE DATOS. ¿ES ESTO POSIBLE CON LA VERSION EXPRESS?

  2. avatar
    Yisus MEXICO Internet Explorer Windows
    29 Agosto 2011 at 17:12 #

    Generar todo ese chorizo es muy fácil con el Wizard de replicación de SQL Server R2!!!!

    La metáfora editorial no me gusta!!!

Responder