Configurar réplicas externas

En esta página, se describe cómo configurar una instancia de Cloud SQL para publicar en un suscriptor externo a Cloud SQL o que está dentro de Cloud SQL. La replicación externa en Cloud SQL para SQL Server usa la replicación transaccional, en la que Cloud SQL actúa como publicador para un suscriptor.

La replicación transaccional admite la publicación de varios tipos de objetos, como lo documenta Microsoft. Además, en Cloud SQL, las limitaciones de esta función son similares a las documentadas por Microsoft.

Algunos de los objetos compatibles son los siguientes:

  • Tablas
  • Procedimientos almacenados
  • Vistas
  • Vistas de índice
  • Funciones definidas por el usuario

Si bien los ejemplos del proceso de publicación están en esta página, consulta Publica datos y objetos de base de datos en la documentación de Microsoft para obtener más detalles. Considera usar SQL Server Management Studio (SSMS) en tu proceso de publicación, ya que tus opciones disponibles pueden ser más evidentes en SSMS.

Consulta también Acerca de la replicación en Cloud SQL.

Implementa la replicación transaccional

Una instancia de Cloud SQL puede actuar como publicador y distribuidor para un suscriptor externo, a través de la replicación transaccional.

Para configurar la replicación transaccional, puedes hacer lo siguiente:

  • Usa los procedimientos almacenados que proporciona Cloud SQL. Estos tienen el prefijo gcloudsql_transrepl_
  • Define mejor la replicación mediante procedimientos almacenados que proporciona Microsoft

Limitaciones y requisitos previos

Revisa esta sección cuando planifiques la replicación transaccional.

Limitaciones

Las instancias que usan alta disponibilidad (HA) carecen de una dirección IP saliente y coherente. Estas instancias no pueden ser publicadores si usan la conectividad de IP pública. Por lo tanto, si una instancia usa alta disponibilidad, debe usar la conectividad de IP privada.

Si quieres definir un artículo, consulta Define un artículo en la documentación de Microsoft, incluidas las limitaciones y restricciones.

Los procedimientos almacenados que proporciona Cloud SQL solo admiten suscripciones de envío.

Requisitos previos

La conectividad de red bidireccional debe configurarse entre una instancia de Cloud SQL y la instancia del suscriptor. El suscriptor puede ser externo, como, por ejemplo, un suscriptor local o el suscriptor puede ser interno de Cloud SQL.

Para las instancias de Cloud SQL que usan IP públicas, Cloud SQL usa una dirección IP diferente en las rutas de entrada y salida. La réplica debe incluir la dirección IP saliente de la instancia principal en la lista de anunciantes permitidos, que puedes recuperar mediante el comando gcloud:

gcloud sql instances describe [PRIMARY_NAME] --format="default(ipAddresses)"

Para usar una IP privada de Cloud SQL con una instancia local, debes configurar el acceso privado a los servicios. Esto requiere un intercambio de tráfico entre la VPC de Cloud SQL y la VPC del cliente a través de un rango de IP personalizado que debe anunciarse.

Cuando se establece una conexión desde el entorno local, el firewall local debe permitir conexiones entrantes y salientes. En particular, el firewall local debe permitir esas conexiones en el puerto 1433 al rango de subred de acceso privado a los servicios que se usa para el servicio específico de Google Cloud (en este caso, para Cloud SQL). Considera permitir un rango de subred en lugar de una IP específica para cada instancia creada.

Para obtener información relacionada, consulta lo siguiente:

Permisos y roles

Permisos empaquetados

Los procedimientos almacenados que proporciona Cloud SQL incluyen los permisos necesarios para la replicación transaccional. Estos son procedimientos almacenados de wrapper que a veces llaman a uno o más procedimientos almacenados de Microsoft. Consulta la documentación de Microsoft para obtener información sobre los procedimientos almacenados de Microsoft.

Función requerida

Las cuentas que se usan (incluidas aquellas para el agente lector de registros) necesitan un rol db_owner, como en el caso del usuario sqlserver. Para obtener información necesaria, revisa el Modelo de seguridad de agentes de replicación.

Usa procedimientos almacenados para la publicación, la distribución y la suscripción

En esta sección, se incluyen los pasos sugeridos para configurar la replicación transaccional.

El usuario sqlserver tiene procedimientos almacenados para configurar tu instancia de Cloud SQL a fin de que actúe como publicador. Para obtener información de referencia, consulta Procedimientos almacenados de Cloud SQL.

Prepárate para la replicación transaccional con una base de datos de prueba

Antes de configurar la replicación transaccional para una base de datos de producción, puedes configurar tu instancia como publicador de objetos de base de datos de prueba. En esta página, la base de datos de prueba se llama base de datos pub_demo.

Conéctate a tu instancia de Cloud SQL con el usuario sqlserver y crea una base de datos para realizar pruebas. Por ejemplo:

Create Database pub_demo;
GO
USE pub_demo;
CREATE TABLE Employee(employeeId INT primary key);
INSERT INTO Employee([employeeId]) VALUES (1);
INSERT INTO Employee([employeeId]) VALUES (2);

-- Add procedure
CREATE OR ALTER PROCEDURE dbo.p_GetDate
AS
SELECT getdate()

-- Add view
CREATE OR ALTER VIEW dbo.v_GetDbs
AS
SELECT name from sys.databases

-- Function
CREATE OR ALTER FUNCTION dbo.fn_ListDbFiles(@id int)
RETURNS TABLE
AS
RETURN
(
select * from sys.master_files where database_id = @id
)

Configura la base de datos de distribución

Para la base de datos de distribución, puedes usar msdb.dbo.gcloudsql_transrepl_setup_distribution, que es un procedimiento almacenado de wrapper para estos procedimientos almacenados de Microsoft:

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_setup_distribution @login='sqlserver', @password='<password>'

Cómo habilitar una base de datos para la publicación

Para habilitar o inhabilitar la opción de publicación de una base de datos, puedes usar msdb.dbo.gcloudsql_transrepl_replicationdboption. Este procedimiento almacenado se aplica a la opción de publicación del publicador que usa sp_replicationdboption.

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption @db='pub_demo', @value='true'

Agrega un agente lector de registros

Puedes configurar un agente lector de registros para una base de datos que use sp_addlogreader_agent.

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_addlogreader_agent @db='pub_demo', @login='sqlserver', @password='<password>'

Crea la publicación para la base de datos

Puedes usar msdb.dbo.gcloudsql_transrepl_addpublication a fin de crear una publicación transaccional para la base de datos que especifiques. Este procedimiento almacenado une sp_addpublication.

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication @db='pub_demo', @publication='pub1'

Crea un agente de instantáneas para la publicación especificada

Si quieres crear un agente de instantáneas para la base de datos del publicador, puedes usar msdb.dbo.gcloudsql_transrepl_addpublication_snapshot, que une sp_addpublication_snapshot.

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_addpublication_snapshot @db='pub_demo',  @publication='pub1', @login='sqlserver', @password='<password>'

Crea un artículo y agrégalo a la publicación

Puedes crear un artículo desde la base de datos del publicador y agregarlo a la publicación. Como el usuario sqlserver, usa sp_addarticle.

También puedes agregar artículos mediante SSMS. Para obtener más información, consulta Agrega artículos a una publicación y quita artículos de una publicación.

Por ejemplo:

USE pub_demo;
GO

EXEC sp_addarticle @publication = 'pub1',
                   @article = 'csql_dbo.employee',
                   @source_owner = 'dbo',
                   @source_object = 'Employee',
                   @description = N'cloudsql_article_table',
                   @schema_option = 0x000000000903409D,
                   @identityrangemanagementoption = N'manual',
                   @destination_table = 'Employee',
                   @destination_owner = 'dbo';

-- add function
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'fn_ListDbFiles',
                   @source_owner = N'dbo',
                   @source_object = N'fn_ListDbFiles',
                   @type = N'func schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'fn_ListDbFiles',
                   @destination_owner = N'dbo',
                   @status = 16

-- add procedure
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'p_GetDate',
                   @source_owner = N'dbo',
                   @source_object = N'p_GetDate',
                   @type = N'proc schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'p_GetDate',
                   @destination_owner = N'dbo',
                   @status = 16

-- add view
use [pub_demo]
exec sp_addarticle  @publication = N'pub1',
                   @article = N'v_GetDbs',
                   @source_owner = N'dbo',
                   @source_object = N'v_GetDbs',
                   @type = N'view schema only',
                   @description = N'',
                   @creation_script = N'',
                   @pre_creation_cmd = N'drop',
                   @schema_option = 0x0000000008000001,
                   @destination_table = N'v_GetDbs',
                   @destination_owner = N'dbo',
                   @status = 16

Agrega la suscripción a la publicación

Desde la base de datos, puedes agregar la suscripción a la publicación. Como usuario sqlserver, establece el estado del suscriptor mediante sp_addsubscription.

Por ejemplo:

Use pub_demo;
GO
EXEC sp_addsubscription @publication ='pub1',
                        @subscriber = N'10.10.100.1,1433',
                        @destination_db = pub_demo,
                        @subscription_type = N'Push',
                        @sync_type = N'automatic',
                        @article = N'all',
                        @update_mode = N'read only',
                        @subscriber_type = 0

Conéctate al suscriptor y crea una base de datos de suscripción

Puedes conectarte al suscriptor y crear una base de datos de suscripción para que los datos replicados se propaguen.

Por ejemplo:

 Create Database pub_demo

Agrega un nuevo trabajo de agente programado para sincronizar la suscripción de envío

Puedes agregar un trabajo de agente programado nuevo para sincronizar la suscripción de envío con la publicación. Por ejemplo, en la base de datos del publicador, ejecuta un comando similar al siguiente. Este comando usa msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent, un procedimiento almacenado de wrapper para sp_addpushsubscription_agent:

EXEC msdb.dbo.gcloudsql_transrepl_addpushsubscription_agent
@db='pub_demo',
@publication = 'pub1',
@subscriber_db= 'pub_demo',
@subscriber_login='sqlserver',
@subscriber_password='<password>',
@subscriber='11.11.111.1,1433'

Inicia un trabajo de agente de instantáneas de publicación

Puedes iniciar un trabajo de agente de instantáneas de publicación de la siguiente manera:

USE pub_demo;
EXEC sp_startpublication_snapshot
@publication = 'pub1'

Otorga acceso a una cuenta para usar el monitor de replicación

Utiliza msdb.dbo.gcloudsql_transrepl_addmonitoraccess para:

  • Proporciona acceso al monitor de replicación en SSMS
  • Consulta tablas en la base de datos de distribución

Por lo tanto, este procedimiento almacenado te permite usar la declaración SELECT en las tablas relacionadas con la replicación de la base de datos de distribución, como la tabla MSrepl_errors:

EXEC msdb.dbo.gcloudsql_transrepl_addmonitoraccess
@login = 'sqlserver'

Cambia una propiedad de base de datos de distribución

Puedes cambiar el heartbeat_interval. Usa el procedimiento msdb.dbo.gcloudsql_transrepl_changedistributor_property, que une sp_changedistributor_property.

Para obtener más información, consulta la documentación de sp_changedistributor_property. Consulta también esa documentación para obtener más información sobre el valor heartbeat_interval.

Por ejemplo:

EXEC msdb.dbo.gcloudsql_transrepl_changedistributor_property
@property = N'heartbeat_interval',
@value = 90

Usa el monitor de replicación

Haz clic derecho en el nodo de replicación en SSMS y elige Iniciar el monitor de replicación.

Si haces clic en la pestaña Agentes, deberías ver una vista similar a la siguiente:

Carpetas en la pestaña Agentes

Usa procedimientos almacenados para quitar la replicación

En esta sección, se incluyen los pasos sugeridos para quitar la replicación transaccional.

Descarta la suscripción

Para descartar la suscripción, usa el procedimiento almacenado sp_dropsubscription.

Este es un ejemplo de los comandos para descartar la suscripción:

USE  pub_demo;
GO
EXEC sp_dropsubscription
          @publication = 'csql_pub_pub_demo',
          @article     = N'all',
          @subscriber  = N'11.11.111.1,1433'

Descarta el suscriptor

Para descartar el suscriptor, usa el procedimiento almacenado msdb.dbo.gcloudsql_transrepl_dropsubscriber:

EXEC msdb.dbo.gcloudsql_transrepl_dropsubscriber
 @subscriber  = N'11.11.111.1,1433'

Descarta la publicación

Para descartar la publicación, usa el procedimiento almacenado msdb.dbo.gcloudsql_transrepl_droppublication:

EXEC msdb.dbo.gcloudsql_transrepl_droppublication
  @db = 'pub_demo', @publication='pub1'

Inhabilita la base de datos de publicación

Para inhabilitar la base de datos de publicación, usa el procedimiento almacenado msdb.dbo.gcloudsql_transrepl_replicationdboption:

EXEC msdb.dbo.gcloudsql_transrepl_replicationdboption
@db='pub_demo',
@value=N'false'

Quita la base de datos de distribución

Para quitar la base de datos de distribución, usa el procedimiento almacenado msdb.dbo.gcloudsql_transrepl_remove_distribution:

EXEC msdb.dbo.gcloudsql_transrepl_remove_distribution

Sugerencias y pasos para solucionar problemas

Ejecuta procedimientos almacenados desde la base de datos correcta

Es posible que recibas el siguiente error cuando ejecutes sp_addarticle, sp_addsubscription o sp_startpublication_snapshot:

Only members of the sysadmin fixed server role or db_owner fixed database role can perform this operation.

Además, es posible que recibas el siguiente error cuando ejecutes sp_dropsubscription:

This database is not enabled for publication.

Si se producen estos errores, ten en cuenta que debes ejecutar esos procedimientos almacenados desde la base de datos a la que se aplican. Puedes usar lo siguiente para confirmar que se ejecutan desde la base de datos correcta:

USE <database_name>;
GO
<Run stored proc>

Replicación

Los errores de replicación se proporcionan en los registros de errores de SQL y en otros lugares. Puedes consultar algunas tablas en la base de datos de distribución directamente para detectar errores de replicación. Por ejemplo:

select * from [cloudsql_distribution]..msrepl_errors
select * from [cloudsql_distribution]..MSreplication_monitordata

Microsoft tiene más ejemplos aquí para buscar errores mediante el monitor de replicación. Por ejemplo, es posible que el usuario sqlserver no tenga acceso a un comando.

Trabajos del agente de replicación

Después de configurar la replicación, los trabajos nuevos del agente de SQL no son visibles en SSMS para el usuario sqlserver. Sin embargo, puedes verlas con el siguiente comando:

USE msdb
select * from dbo.sysjobs

Publicadores faltantes en el monitor de replicación

Puedes usar el Monitor de replicación para ver el estado de la replicación y solucionar problemas de replicación.

Por ejemplo, cuando configuras la replicación y tu instancia de Cloud SQL del publicador usa una dirección IP, es posible que SSMS no pueda encontrar el publicador. Esto se debe a que no conoce la asignación entre el nombre de host y la dirección IP.

El monitor de replicación contiene una pestaña Publicaciones vacía:

No hay filas en la pestaña Publicaciones

Como solución alternativa, puedes crear alias en el Administrador de configuración de SQL Server entre el nombre de host del servidor de SQL Server del publicador y la dirección IP que se usa para conectarse desde SSMS:

  1. Inicia el Administrador de configuración de SQL Server.

    Administrador de configuración de SQL Server

  2. Busca el nodo Alias y selecciónalo.

    Se seleccionó el nodo de alias

  3. Haz clic con el botón derecho en la casilla debajo de Nombre de alias para crear un alias nuevo. El mismo procedimiento se aplica a un alias de 32 bits y a un alias de 64 bits:

    Cuadro desplegable debajo de Nombre de alias

  4. Recupera el nombre de host real de tu instancia de publicador con esta consulta:

    Consulta el nombre de host real de la instancia de publicador

  5. En la ventana de alias, ingresa estos campos antes de seleccionar OK:

    Nombre de alias: Proporciona el nombre del servidor a partir de la consulta en el paso 4.

    Puerto N.º: proporciona el puerto 1433.

    Protocolo: Deja el valor como el predeterminado de TCP/IP.

    Servidor: Proporciona la dirección IP de la instancia del publicador.

    Valores para el nombre de alias, el servidor, etcétera.

  6. Conéctate con el alias nuevo y, luego, inicia el monitor de replicación:

    Cuadro de diálogo Conectar al servidor

La información de publicación debe ser similar a la siguiente:

Ahora el monitor de replicación muestra una fila en la pestaña Publicaciones

Para obtener más información sobre la solución de problemas de replicación, consulta Solucionador de problemas: Encuentra errores con la replicación transaccional de SQL Server.

Estima el tamaño de los artículos necesarios para la replicación

Cuando usas una instancia de Cloud SQL como publicador, se necesita una instantánea inicial de los artículos que se generarán para comenzar la replicación. Esta instantánea se almacena de forma local. Los requisitos de almacenamiento pueden aumentar según la cantidad de artículos, su tamaño y el tipo de datos. El procedimiento de almacenamiento sp_spaceused proporciona solo una estimación aproximada del espacio en disco necesario para un artículo.

La instantánea incluye archivos que almacenan esquemas y datos.

¿Qué sigue?