Migrazione dei dati da SQL Server 2017 a Cloud SQL per SQL Server utilizzando la replica degli snapshot


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 per amministratori di sistema, sviluppatori, ingegneri, amministratore di database o 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 utilizzi replica snapshot per mantenere sincronizzate 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 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 conosca i seguenti concetti:

Obiettivi

  • Crea un'istanza di una macchina virtuale (VM) SQL Server in Compute Engine per ospitare il database di esempio.
  • Compila un database di esempio.
  • Creare 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:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

  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. Installa un client Remote Desktop Protocol (RDP) a tua scelta. Per ulteriori informazioni, consulta l'articolo sui 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.

  1. In Cloud Shell, crea un'istanza SQL Server 2017 Standard Windows Server 2016. Il database di origine deve essere SQL Server Standard o Database aziendale perché nei livelli inferiori non è presente il publisher del database funzionalità.

    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, creerai l'istanza nella zona us-central1-f con una dimensione del disco di avvio di 100 GB. Per ulteriori informazioni, vedi Località cloud.

  2. Genera una password di Windows:

    gcloud compute reset-windows-password sqlserver --zone=us-central1-f
    
  3. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  4. 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.

  5. Nei campi username e password, inserisci il nome utente e che hai creato per l'istanza VM SQL Server. Lascia vuoto il campo Dominio e fai clic su Ok per connetterti alla VM SQL Server.

    Screenshot della finestra di dialogo in cui inserisci il nome utente e la password.

    Quando richiesto, accetta il certificato.

  6. Se accetti i termini, fai clic su Continua.

  7. 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'icona PowerShell e seleziona Esegui come amministratore.

  8. Al prompt di PowerShell, crea una struttura di directory per il database spazio di archiviazione:

    mkdir c:\sql-server-data\adventureworks
    

Creazione e compilazione di un database di esempio

Ora scarichi Microsoft Database AdventureWorks il file di backup e ripristinarlo nella tua istanza SQL Server. Questo database simula il database di produzione di cui vuoi eseguire la migrazione.

  1. 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
    
  2. 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"
    
  3. Convalida il database appena ripristinato eseguendo una query sul numero di righe in la tabella Customer. L'output è 847 righe.

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

Preparazione dell'istanza Cloud SQL

  1. In Cloud Shell, crea Cloud SQL per SQL Server 2017 Istanza 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 sqlserver12@. Fai anche nota dell'indirizzo IP di SQL Server.

  2. 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
    
  3. 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
    
  4. Crea un database di destinazione:

    gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
    
  5. Nella riga di comando di 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 configuri 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 eseguirai la stessa VM.

  1. 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 di PowerShell come amministratore.

  2. Verifica che ora il nome dell'istanza sia "sqlserver":

    osql -E -Q "select @@servername;"
    
  3. 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"
    
  4. 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'
    "
    
  5. 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 configurare le tabelle da pubblicare.

  1. Dalla riga di comando PowerShell, abilita e avvia l'agente SQL Server:

    Set-Service -Name SQLServerAgent -StartupType Automatic
    Start-Service -Name SQLServerAgent
    
  2. 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"
    
  3. Configura la pubblicazione in modo che invii uno snapshot dell'origine a Cloud SQL 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"
    
  4. Aggiungi articoli (tabelle) alla pubblicazione. Anche se AdventureWorksLT2017 contiene molte tabelle. Per semplicità in questo tutorial, replichi tre tabelle: Address, Customer e 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'istantanea 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 puoi creare una sottoscrizione che invia i dati pubblicati a in Cloud SQL.

  1. 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' "
    
  1. 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 sezioni seguenti descrivono come eliminare o disattivare queste risorse.

Elimina il progetto

  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.

Passaggi successivi