Questo tutorial mostra come eseguire la migrazione dei dati da Microsoft SQL Server 2017 Enterprise in esecuzione su Compute Engine a Cloud SQL per SQL Server 2017 Enterprise. Questo tutorial è utile se sei un sysadmin, uno sviluppatore, un ingegnere, un amministratore di database o un DevOps engineer. Il tutorial mostra come configurare il distributore SQL Server, utilizzare l'agente SQL Server per la replica degli snapshot in Cloud SQL per SQL Server 2017 e convalidare l'importazione dei dati.
In questo tutorial utilizzerai la replica degli snapshot per mantenere sincronizzati l'origine e la destinazione. La replica snapshot invia agli abbonati una copia completa di ogni articolo, ovvero dell'oggetto del database pubblicato. Cloud SQL supporta anche la replica transazionale, che invia solo dati incrementali. Un limite della replica transazionale è che le tabelle devono avere chiavi primarie. Per ulteriori informazioni sui tipi di replica di SQL Server, consulta la documentazione di SQL Server.
Per semplicità, il tutorial utilizza SQL Server di origine per ospitare un distributore. In uno scenario di produzione, se i dati vengono replicati dall'esterno di Google Cloud, potresti preferire ospitare la distribuzione lato Google Cloud su un'istanza Compute Engine.
Il tutorial presuppone che tu abbia familiarità con quanto segue:
- SQL Server
- Microsoft PowerShell
- Compute Engine
- Cloud SQL per SQL Server
Obiettivi
- Crea un'istanza di una macchina virtuale (VM) SQL Server su Compute Engine per ospitare il database di esempio.
- Compila un database di esempio.
- Crea un'istanza Cloud SQL per SQL Server.
- Crea un distributore.
- Configura la pubblicazione e l'abbonamento.
- Avvia la replica da SQL Server a Cloud SQL.
- Convalida i dati importati.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
- Compute Engine
- Cloud SQL
- Cloud Storage
- SQL Server (premium with Compute Engine)
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
- 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, 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.
- Installa un client Remote Desktop Protocol (RDP) a tua scelta. Per saperne di più, vedi Client di Microsoft Remote Desktop. Se hai già installato un client RDP, puoi saltare questa attività.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Creazione di una VM SQL Server
Il primo passaggio consiste nel creare un'istanza SQL Server 2017 su una VM Windows 2016 su Compute Engine e connettersi utilizzando RDP.
In Cloud Shell, crea un'istanza SQL Server 2017 Standard su Windows Server 2016. Il database di origine deve essere un database SQL Server Standard o Enterprise perché i livelli inferiori non dispongono della funzionalità di editore del database.
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
Per questo tutorial, crea l'istanza nella zona
us-central1-f
con una dimensione del disco di avvio di 100 GB. Per ulteriori informazioni, consulta Località cloud.Genera una password Windows:
gcloud compute reset-windows-password sqlserver --zone=us-central1-f
Nella console Google Cloud, vai alla pagina Istanze VM.
Nella sezione Compute Engine della console Google Cloud, fai clic sul menu a discesa RDP e seleziona l'opzione Scarica il file RDP per scaricare il file RDP per l'istanza.
Utilizza questo file per connetterti all'istanza utilizzando un client RDP. Per saperne di più, consulta Client di Microsoft Remote Desktop.
Nei campi nome utente e password, inserisci il nome utente e la password che hai creato per l'istanza VM di SQL Server. Lascia vuoto il campo Dominio e fai clic su Ok per connetterti alla VM SQL Server.
Quando richiesto, accetta il certificato.
Se accetti i termini, fai clic su Continua.
Nell'istanza, riduci tutte le finestre all'altezza minima, fai clic su Start sulla barra delle app di Windows, digita
PowerShell
, quindi fai clic con il tasto destro del mouse sull'app PowerShell di Windows e seleziona Esegui come amministratore.Al prompt di PowerShell, crea una struttura di directory per lo spazio di archiviazione del database:
mkdir c:\sql-server-data\adventureworks
Creazione e compilazione di un database di esempio
Ora scarica il file di backup del database AdventureWorks di Microsoft e ripristinalo nell'istanza SQL Server. Questo database simula il database di produzione di cui vuoi eseguire la migrazione.
Dalla riga di comando PowerShell, scarica il file di backup
AdventureWorksLT2017.bak
sul disco 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
Ripristina il database:
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"
Convalida il database appena ripristinato eseguendo una query sul numero di righe nella tabella
Customer
. L'output è costituito da 847 righe.osql -E -Q "select count(*) from AdventureWorksLT2017.SalesLT.Customer"
Preparazione dell'istanza Cloud SQL
In Cloud Shell, crea l'istanza Cloud SQL per 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
L'utente root è
sqlserver
con una passwordsqlserver12@
. Prendi anche nota dell'indirizzo IP di SQL Server.Memorizza l'indirizzo IP della VM SQL Server di origine in una variabile di ambiente:
sql_source_ip=$(gcloud compute instances describe sqlserver \ --zone=us-central1-f | grep natIP | awk '{print $2}') echo $sql_source_ip
Aggiungi l'indirizzo IP della VM SQL Server con l'istanza Cloud SQL alla lista consentita (whitelist):
gcloud sql instances patch target-sqlserver --authorized-networks=$sql_source_ip
Crea un database di destinazione:
gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
Nella riga di comando PowerShell che hai avviato come amministratore, controlla la connettività a Cloud SQL per 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'"
Il comando stampa
'test'
.
Avvio della replica dalla VM a Cloud SQL
Utilizzando la replica degli snapshot di SQL Server, crei un job per replicare gli snapshot del database in Cloud SQL.
Configurare il distributore
Ora configura la VM SQL Server come distributore SQL Server. In pratica, un distributore può essere eseguito su una macchina separata, ma in questo tutorial lo esegui sulla stessa VM.
Dalla riga di comando PowerShell che hai avviato come amministratore, aggiorna il nome dell'istanza locale di SQL Server in modo che corrisponda al nome host della 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
Se ricevi l'errore
Cannot open MSSQLServer service on computer '.'.
, è probabile che tu non abbia eseguito la riga di comando PowerShell come amministratore.Verifica che il nome dell'istanza sia ora
"sqlserver"
:osql -E -Q "select @@servername;"
Specifica il database di distribuzione:
$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 il database di distribuzione:
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 il nome della VM SQL Server come publisher presso il distributore:
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'"
Configurare la pubblicazione
Ora che la distribuzione è configurata, puoi configurare le tabelle da pubblicare.
Dalla riga di comando PowerShell, abilita e avvia l'agente SQL Server:
Set-Service -Name SQLServerAgent -StartupType Automatic Start-Service -Name SQLServerAgent
Crea una pubblicazione per il database
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 pubblicazione in modo che invii uno snapshot dell'origine a Cloud SQL una volta ogni ora:
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"
Aggiungi articoli (tabelle) alla pubblicazione. Sebbene il database
AdventureWorksLT2017
contenga molte tabelle, per semplicità in questo tutorial replichi tre tabelle:Address
,Customer
eCustomerAddress
.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 uno snapshot degli articoli. In caso contrario, può essere necessaria fino a un'ora prima che il programmatore crei lo snapshot iniziale.
osql -E -Q "use [AdventureWorksLT2017] exec sp_startpublication_snapshot @publication = N'advn-pub3'"
Configurare un abbonamento
Ora crea una sottoscrizione che invii i dati pubblicati a Cloud SQL.
Dalla riga di comando PowerShell, crea un abbonamento per inviare lo snapshot della pubblicazione 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' "
Verifica che i dati siano disponibili nell'istanza 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]"
Il comando stampa
417
,450
,847
Esegui la pulizia
Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che smettano di utilizzare la quota e di generare addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.
Elimina il progetto
- 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.
Passaggi successivi
- Scopri come eseguire la migrazione dei dati da SQL Server 2017 a Cloud SQL per SQL Server utilizzando i file di backup.
- Scopri come eseguire la migrazione dei dati da SQL Server 2008 a Cloud SQL per SQL Server utilizzando i file di backup.
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.