Migra datos de SQL Server 2017 a Cloud SQL para SQL Server mediante la replicación de instantáneas


En este instructivo, se muestra cómo migrar datos de Microsoft SQL Server 2017 Enterprise que se ejecuta en Compute Engine a Cloud SQL para SQL Server 2017 Enterprise. Este instructivo te resultará útil si eres un administrador de sistemas, desarrollador, ingeniero, administrador de base de datos o ingeniero DevOps. En el instructivo, se muestra cómo configurar SQL Server Distributor, usa SQL Server Agent para la replicación de instantáneas en Cloud SQL para SQL Server 2017 y validar que los datos se importaron correctamente.

En este instructivo, usarás replicación de instantáneas para mantener sincronizados la fuente y el destino. La replicación de instantáneas envía a los suscriptores una copia completa de cada artículo, es decir, el objeto de la base de datos publicada. Cloud SQL también admite la replicación transaccional, que envía solo datos incrementales. Una limitación de la replicación transaccional es que las tablas deben tener claves primarias. Para obtener más información sobre los tipos de replicación de SQL Server, consulta la documentación de SQL Server.

Para simplificar, en el instructivo se usa SQL Server de origen a fin de alojar un distribuidor. En una situación de producción, si los datos se replican desde fuera de Google Cloud, es posible que prefieras alojar la distribución en el lado de Google Cloud en una instancia de Compute Engine.

En el instructivo, se da por sentado que estás familiarizado con lo siguiente:

Objetivos

  • Crear una instancia de máquina virtual (VM) de SQL Server en Compute Engine para alojar la base de datos de muestra
  • Propagar una base de datos de muestra
  • Crear una instancia de Cloud SQL para SQL Server
  • Crea un Distribuidor.
  • Configurar la publicación y la suscripción
  • Iniciar la replicación de SQL Server a Cloud SQL
  • Validar los datos importados

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud SQL Admin and Compute Engine API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud SQL Admin and Compute Engine API APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  9. Instala un cliente de protocolo de escritorio remoto (RDP) que prefieras Para obtener más información, consulta Clientes de escritorio remoto de Microsoft. Si ya tienes instalado un cliente de RDP, puedes omitir esta tarea.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Crea una VM de SQL Server

El primer paso es crear una instancia de SQL Server 2017 en una VM de Windows 2016 en Compute Engine y conectarse a ella mediante RDP.

  1. En Cloud Shell, crea una instancia de SQL Server 2017 Standard en Windows Server 2016. La base de datos de origen debe ser una base de datos SQL Server Standard o Enterprise porque los niveles inferiores no tienen la capacidad de publicador de la base de datos.

    gcloud compute instances create sqlserver --machine-type=n1-standard-4 \
        --boot-disk-size=100GB \
        --image-project=windows-sql-cloud \
        --image-family=sql-std-2017-win-2016 \
        --zone=us-central1-f  \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    

    En este instructivo, debes crear la instancia en la zona us-central1-f con un tamaño de disco de arranque de 100 GB. Para obtener más información, consulta Ubicaciones de Cloud.

  2. Genera una contraseña de Windows:

    gcloud compute reset-windows-password sqlserver --zone=us-central1-f
    
  3. En la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a Instancias de VM

  4. En la sección Compute Engine de la consola de Google Cloud, haz clic en el menú desplegable RDP y selecciona la opción Descargar el archivo RDP para descargar el archivo de RDP para su instancia.

    Usa este archivo para conectarte a la instancia mediante un cliente de RDP. Para obtener más información, consulta Clientes de escritorio remoto de Microsoft.

  5. En los campos nombre de usuario y contraseña, ingresa el nombre de usuario y la contraseña que creaste para la instancia de VM de SQL Server. Deja en blanco el campo Dominio y haz clic en Aceptar para conectarte a la VM de SQL Server.

    Captura de pantalla del cuadro de diálogo en el que ingresas el nombre de usuario y la contraseña

    Cuando se te solicite, acepta el certificado.

  6. Si aceptas los términos, haz clic en Continuar.

  7. En la instancia, minimiza todas las ventanas, haz clic en Iniciar en la barra de tareas de Windows, escribe PowerShell, haz clic derecho en la app de Windows PowerShell y selecciona Ejecutar como administrador.

  8. Cuando recibas el mensaje de PowerShell, crea una estructura de directorio para el almacenamiento de la base de datos:

    mkdir c:\sql-server-data\adventureworks
    

Crea y propaga una base de datos de muestra

Ahora debes descargar el archivo de copia de seguridad de la base de datos de AdventureWorks de Microsoft y restaurarlo en tu instancia de SQL Server. Esta base de datos simula la base de datos de producción que deseas migrar.

  1. Desde la línea de comandos de PowerShell, descarga el archivo de copia de seguridad AdventureWorksLT2017.bak en la unidad C:

    bitsadmin /transfer sampledb /dynamic /download /priority FOREGROUND "https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorksLT2017.bak " C:\sql-server-data\AdventureWorksLT2017.bak
    
  2. Restablece la base de datos:

    osql -E -Q "USE [master]
    RESTORE DATABASE [AdventureWorksLT2017]
    FROM  DISK = N'C:\sql-server-data\AdventureWorksLT2017.bak' WITH  FILE = 1,
    MOVE N'AdventureWorksLT2012_Data' TO N'C:\sql-server-data\adventureworks\AdventureWorksLT2012.mdf',
    MOVE N'AdventureWorksLT2012_Log' TO N'C:\sql-server-data\adventureworks\AdventureWorksLT2012_log.ldf',
    NOUNLOAD,  STATS = 5"
    
  3. Consulta la cantidad de filas en la tabla Customer para validar la base de datos recién restaurada. El resultado es 847 filas.

    osql -E -Q "select count(*) from AdventureWorksLT2017.SalesLT.Customer"
    

Prepara la instancia de Cloud SQL

  1. En Cloud Shell, crea la instancia de Cloud SQL para SQL Server 2017 Enterprise:

    gcloud sql instances create target-sqlserver  \
        --database-version=SQLSERVER_2017_STANDARD \
        --cpu=4 \
        --memory=15 \
        --storage-size=100 \
        --root-password=sqlserver12@ \
        --zone=us-central1-f
    

    El usuario raíz es sqlserver y la contraseña es sqlserver12@. Además, toma nota de la dirección IP de SQL Server.

  2. Almacena la dirección IP de la VM de SQL Server de origen en una variable de entorno:

    sql_source_ip=$(gcloud compute instances describe sqlserver \
        --zone=us-central1-f | grep natIP | awk '{print $2}')
    echo $sql_source_ip
    
  3. Agrega la dirección IP de la VM de SQL Server con la instancia de Cloud SQL a la lista de permitidos (lista blanca):

    gcloud sql instances patch target-sqlserver --authorized-networks=$sql_source_ip
    
  4. Crea una base de datos de destino:

    gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
    
  5. En la línea de comandos de PowerShell que lanzaste como administrador, verifica la conectividad a Cloud SQL para SQL Server:

    $cloud_sql_server_ip=gcloud sql instances describe target-sqlserver --format='value(ipAddresses.ipAddress)'
    osql -S $cloud_sql_server_ip -U sqlserver -P sqlserver12@ -Q "select 'test'"
    

    El comando imprime 'test'.

Inicia una replicación desde la VM a Cloud SQL

Mediante la replicación de instantáneas de SQL Server, debes crear un trabajo para replicar las instantáneas de la base de datos en Cloud SQL.

Configura el distribuidor

Ahora configura la VM de SQL Server para que sea un distribuidor de SQL Server. En la práctica, un distribuidor puede ejecutarse en una máquina distinta, pero, en este instructivo, lo ejecutas en la misma VM.

  1. En la línea de comandos de PowerShell que iniciaste como administrador, actualiza el nombre de la instancia local de SQL Server para que coincida con el nombre de host de la VM:

    $servername=hostname
    osql -E -Q "sp_dropserver 'INST-INSTALL-SQ';"
    osql -E -Q "sp_addserver '$servername', local;"
    Restart-Service -F MSSQLServer
    mkdir c:\sql-server-data\repldata
    

    Si recibes el error Cannot open MSSQLServer service on computer '.'., es probable que no hayas ejecutado como administrador la línea de comandos de PowerShell.

  2. Verifica que el nombre de la instancia ahora sea "sqlserver":

    osql -E -Q "select @@servername;"
    
  3. Especifica la base de datos de distribución:

    $servername=hostname
    osql -E -Q "use master; exec sp_adddistributor @distributor = N'$servername', @password = N'';"
    osql -E -Q "exec sp_adddistributiondb @database = N'distribution', @data_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Data', @log_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\Data', @log_file_size = 2, @min_distretention = 0, @max_distretention = 72, @history_retention = 48, @deletebatchsize_xact = 5000, @deletebatchsize_cmd = 2000, @security_mode = 1"
    
  4. Configura la base de datos de distribución:

    osql -E -Q "
    use [distribution]
    if (not exists (select * from sysobjects where name = 'UIProperties' and type = 'U '))
        create table UIProperties(id int)
    if (exists (select * from ::fn_listextendedproperty('SnapshotFolder', 'user', 'dbo', 'table', 'UIProperties', null, null)))
        exec sp_updateextendedproperty N'SnapshotFolder', N'c:\sql-server-data\repldata', 'user', dbo, 'table', 'UIProperties'
    else
        exec sp_addextendedproperty N'SnapshotFolder', N'c:\sql-server-data\repldata', 'user', dbo, 'table', 'UIProperties'
    "
    
  5. Registra el nombre de la VM de SQL Server con el distribuidor como publicador:

    osql -E -Q "exec sp_adddistpublisher @publisher = N'$servername',
    @distribution_db = N'distribution', @security_mode = 1, @working_directory
    = N'c:\sql-server-data\repldata', @trusted = N'false', @thirdparty_flag =
    0, @publisher_type = N'MSSQLSERVER'"
    

Configura la publicación

Ahora que la distribución está configurada, configura las tablas que se publican.

  1. Desde la línea de comandos de PowerShell, habilita y, luego, inicia el agente de SQL Server:

    Set-Service -Name SQLServerAgent -StartupType Automatic
    Start-Service -Name SQLServerAgent
    
  2. Crea una publicación para la base de datos AdventureWorksLT2017:

    $servername=hostname
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_replicationdboption @dbname = N'AdventureWorksLT2017', @optname = N'publish', @value = N'true'"
    
    osql -E -Q "use [AdventureWorksLT2017]
    exec sp_addpublication @publication = N'advn-pub3', @description = N'Snapshot publication of database ''AdventureWorksLT2017'' from Publisher ''$servername''.', @sync_method = N'native', @retention = 0, @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_login = N'anonymous', @allow_subscription_copy = N'false', @add_to_active_directory = N'false', @repl_freq = N'snapshot', @status = N'active', @independent_agent = N'true', @immediate_sync = N'true', @allow_sync_tran = N'false', @autogen_sync_procs = N'false', @allow_queued_tran = N'false', @allow_dts = N'false', @replicate_ddl = 1"
    
  3. Configura la publicación para enviar una instantánea del origen a Cloud SQL una vez por hora:

    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addpublication_snapshot @publication = N'advn-pub3', @frequency_type = 4, @frequency_interval = 1, @frequency_relative_interval = 1, @frequency_recurrence_factor = 0, @frequency_subday = 8, @frequency_subday_interval = 1, @active_start_time_of_day = 0, @active_end_time_of_day = 235959, @active_start_date = 0, @active_end_date = 0, @job_login = null, @job_password = null, @publisher_security_mode = 1"
    
  4. Agrega artículos (tablas) a la publicación. Aunque la base de datos AdventureWorksLT2017 contiene muchas tablas, a fin de simplificar, en este instructivo, debes replicar tres tablas: Address, Customer y CustomerAddress.

    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'Address', @source_owner = N'SalesLT', @source_object = N'Address', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'Address', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'Customer', @source_owner = N'SalesLT', @source_object = N'Customer', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'Customer', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
    osql -E -Q "
    use [AdventureWorksLT2017]
    exec sp_addarticle @publication = N'advn-pub3', @article = N'CustomerAddress', @source_owner = N'SalesLT', @source_object = N'CustomerAddress', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509D, @identityrangemanagementoption = N'manual', @destination_table = N'CustomerAddress', @destination_owner = N'SalesLT', @vertical_partition = N'false'
    "
    
  5. Crea manualmente un resumen de los artículos. Si no lo haces, puede tomar hasta una hora antes de que el programador cree la instantánea inicial.

    osql -E -Q "use [AdventureWorksLT2017]
    exec sp_startpublication_snapshot @publication = N'advn-pub3'"
    

Configura una suscripción

Ahora, crearás una suscripción que envíe los datos publicados a Cloud SQL.

  1. Desde la línea de comandos de PowerShell, crea una suscripción para enviar la instantánea de publicación a Cloud SQL:

    $cloud_sql_server_ip=gcloud sql instances describe target-sqlserver --format='value(ipAddresses.ipAddress)'
    $cloud_sql_user="sqlserver"
    $cloud_sql_password="sqlserver12@"
    $target_db_name="AdventureWorksTarget"
    osql -E -Q " use [AdventureWorksLT2017] exec sp_addsubscription @publication = N'advn-pub3', @subscriber = N'$cloud_sql_server_ip', @destination_db = N'$target_db_name', @subscription_type = N'Push', @sync_type = N'automatic', @article = N'all', @update_mode = N'read only', @subscriber_type = 0
    
    exec sp_addpushsubscription_agent @publication = N'advn-pub3', @subscriber = N'$cloud_sql_server_ip', @subscriber_db = N'$target_db_name', @job_login = null, @job_password = null, @subscriber_security_mode = 0, @subscriber_login = N'$cloud_sql_user', @subscriber_password = N'$cloud_sql_password', @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 = 20200408, @active_end_date = 99991231, @enabled_for_syncmgr = N'False', @dts_package_location = N'Distributor' "
    
  1. Valida que los datos estén disponibles en la instancia de Cloud SQL:

    osql -S $cloud_sql_server_ip -U $cloud_sql_user -P $cloud_sql_password -Q "select count(*) from [AdventureWorksTarget].[SalesLT].[CustomerAddress] UNION
    select count(*) from [AdventureWorksTarget].[SalesLT].[Customer]
    UNION
    Select count(*) from [AdventureWorksTarget].[SalesLT].[Address]"
    

    El comando imprime 417, 450, 847.

Limpia

Una vez que completes el instructivo, puedes limpiar los recursos que creaste para que dejen de usar la cuota y generar cargos. En las siguientes secciones, se describe cómo borrar o desactivar estos recursos.

Borra el proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

¿Qué sigue?