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:
- Publicador
- Distribuidor
- Suscriptor
- Publicación
- Articulo
- 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.
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 |









en
en
en
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!!!