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 amministratore di sistema, uno sviluppatore, un ingegnere, un amministratore di database o un ingegnere DevOps. Il tutorial mostra come configurare SQL Server Distributor, utilizzare SQL Server Agent per la replica degli snapshot in Cloud SQL per SQL Server 2017 e verificare che i dati siano stati importati correttamente.
In questo tutorial utilizzerai la replica snapshot per mantenere sincronizzati l'origine e la destinazione. La replica dello snapshot invia agli abbonati una copia completa di ogni articolo, ovvero dell'oggetto di 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 l'origine SQL Server per ospitare un server di distribuzione. In uno scenario di produzione, se i dati vengono replicati dall'esterno di Google Cloud, potresti preferire ospitare la distribuzione sul 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 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, 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 il client Remote Desktop Protocol (RDP) che preferisci. Per saperne di più, vedi Client Microsoft Remote Desktop. Se hai già installato un client RDP, puoi saltare questa attività.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per ulteriori informazioni, vedi 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 a questa istanza 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 pubblicazione 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, crei l'istanza nella zona
us-central1-f
con una dimensione del disco di avvio di 100 GB. Per maggiori informazioni, consulta la pagina 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 la tua istanza.
Utilizza questo file per connetterti all'istanza utilizzando un client RDP. Per saperne di più, vedi Client Microsoft Remote Desktop.
Nei campi nome utente e password, inserisci il nome utente e la password che hai creato per l'istanza VM SQL Server. Lascia vuoto il campo Domain, quindi 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 a icona tutte le finestre, fai clic su Start nella barra delle applicazioni di Windows, digita
PowerShell
, quindi fai clic con il tasto destro del mouse sull'app Windows PowerShell e seleziona Esegui come amministratore.Al prompt di PowerShell, crea una struttura di directory per l'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
nell'unità 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 è di 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 password disqlserver12@
. Prendi nota anche dell'indirizzo IP di SQL Server.Archivia 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 di PowerShell avviata 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 in modo che sia un 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 di PowerShell avviata 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 '.'.
, probabilmente non hai 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 con il distributore come publisher:
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 specificare le tabelle da pubblicare.
Dalla riga di comando di 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 all'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, vengono replicate 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, potrebbe trascorrere fino a un'ora prima che lo scheduler 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 invia i dati pubblicati a Cloud SQL.
Dalla riga di comando di 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 liberare spazio eliminando le risorse che hai creato in modo che non utilizzino più la quota e non generino 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.