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:
- SQL Server
- Microsoft PowerShell
- Compute Engine
- Cloud SQL for SQL Server (Cloud SQL para SQL Server)
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:
- Compute Engine
- Cloud SQL
- Cloud Storage
- SQL Server (premium with Compute Engine)
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Antes de comenzar
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin and Compute Engine API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud SQL Admin and Compute Engine API APIs.
-
In the Google Cloud console, 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.
- 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.
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.Genera una contraseña de Windows:
gcloud compute reset-windows-password sqlserver --zone=us-central1-f
En la consola de Google Cloud, ve a la página Instancias de VM.
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.
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.
Cuando se te solicite, acepta el certificado.
Si aceptas los términos, haz clic en Continuar.
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.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.
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
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"
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
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 essqlserver12@
. Además, toma nota de la dirección IP de SQL Server.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
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
Crea una base de datos de destino:
gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
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.
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.Verifica que el nombre de la instancia ahora sea
"sqlserver"
:osql -E -Q "select @@servername;"
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"
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' "
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.
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
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"
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"
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
yCustomerAddress
.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' "
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.
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' "
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
¿Qué sigue?
- Aprende a migrar datos de SQL Server 2017 a Cloud SQL para SQL Server con archivos de respaldo.
- Obtén información sobre cómo migrar datos de SQL Server 2008 a Cloud SQL para SQL Server mediante archivos de copia de seguridad.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.