Daten mithilfe von Snapshot-Replikation von SQL Server 2017 zu Cloud SQL for SQL Server migrieren


In dieser Anleitung erfahren Sie, wie Sie Daten von Microsoft SQL Server 2017 Enterprise, die auf Compute Engine ausgeführt werden, zu Cloud SQL for SQL Server 2017 Enterprise migrieren. Diese Anleitung ist nützlich, wenn Sie Systemadministrator, Entwickler, Datenbankadministrator oder DevOps-Entwickler sind. In der Anleitung wird gezeigt, wie Sie SQL Server Distribution einrichten, den SQL Server-Agent zur Snapshot-Replikation in Cloud SQL for SQL Server 2017 verwenden prüfen, ob die Daten erfolgreich importiert wurden.

In dieser Anleitung verwenden Sie die Snapshot-Replikation, um die Quelle und das Ziel synchron zu halten. Bei der Snapshot-Replikation werden Abonnenten eine vollständige Kopie jedes Artikels, also ein veröffentlichtes Datenbankobjekt, gesendet. Cloud SQL unterstützt auch die Transaktionsreplikation, bei der nur inkrementelle Daten gesendet werden. Eine Einschränkung der Transaktionsreplikation besteht darin, dass Tabellen Primärschlüssel haben müssen. Weitere Informationen zu SQL Server-Replikationstypen finden Sie in der SQL Server-Dokumentation.

Der Einfachheit halber wird in dieser Anleitung der SQL Server-Quellserver zum Hosten eines Collectors verwendet. Wenn in einem Produktionsszenario Daten von außerhalb der Google Cloud repliziert werden, könnte es sinnvoll sein, die Verteilung auf der Google Cloud-Seite auf einer Compute Engine-Instanz zu hosten.

In dieser Anleitung wird vorausgesetzt, dass Sie mit Folgendem vertraut sind.

Ziele

  • SQL Server-VM-Instanz in Compute Engine erstellen, um die Beispieldatenbank zu hosten.
  • Beispieldatenbank ausfüllen
  • Cloud SQL for SQL Server-Instanz erstellen
  • Distributor erstellen
  • Publikation und Abo einrichten
  • Replikation von SQL Server zu Cloud SQL initiieren
  • Importierte Daten validieren

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

  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. Installieren Sie einen RDP-Client (Remote Desktop Protocol) Ihrer Wahl. Weitere Informationen finden Sie unter Microsoft Remote Desktop-Clients. Wenn Sie bereits einen RDP-Client installiert haben, können Sie diese Aufgabe überspringen.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

SQL Server-VM erstellen

Im ersten Schritt erstellen Sie eine SQL Server 2017-Instanz auf einer Windows 2016-VM in Compute Engine und stellen mithilfe von RDP eine Verbindung zu ihr her.

  1. Erstellen Sie in Cloud Shell eine SQL Server 2017-Standardinstanz unter Windows Server 2016. Die Quelldatenbank muss eine SQL Server-Standard- oder Enterprise-Datenbank sein, da niedrigere Ebenen nicht die Funktionen der Datenbank-Publisher haben.

    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
    

    Für diese Anleitung erstellen Sie die Instanz in der Zone us-central1-f mit einem 100 GB großen Bootlaufwerk. Weitere Informationen finden Sie unter Cloudstandorte.

  2. Generieren Sie ein Windows-Passwort:

    gcloud compute reset-windows-password sqlserver --zone=us-central1-f
    
  3. Rufen Sie in der Google Cloud Console die Seite VM-Instanzen auf.

    Zu "VM-Instanzen"

  4. Klicken Sie im Bereich Compute Engine der Google Cloud Console auf das Drop-down-Menü RDP und wählen Sie die Option RDP-Datei herunterladen aus, um die RDP-Datei für die Instanz herunterzuladen.

    Stellen Sie mithilfe dieser Datei die Verbindung zur Instanz mithilfe eines RDP-Clients her. Weitere Informationen finden Sie unter Microsoft Remote Desktop-Clients.

  5. Geben Sie in die Felder username und password den Nutzernamen und das Passwort ein, die Sie für die SQL Server-VM-Instanz erstellt haben. Lassen Sie das Feld Domain leer und klicken Sie auf OK, um eine Verbindung zur SQL Server-VM herzustellen.

    Screenshot des Dialogfelds, in dem Sie den Nutzernamen und das Passwort eingeben.

    Akzeptieren Sie das Zertifikat, wenn Sie dazu aufgefordert werden.

  6. Wenn Sie den Bedingungen zustimmen, klicken Sie auf Weiter.

  7. Minimieren Sie in der Instanz alle Fenster, klicken Sie in der Windows-Taskleiste auf Start, geben Sie PowerShell ein, klicken Sie mit der rechten Maustaste auf die Windows PowerShell App und wählen Sie Als Administrator ausführen aus.

  8. Erstellen Sie in der PowerShell-Eingabeaufforderung eine Verzeichnisstruktur für den Datenbankspeicher:

    mkdir c:\sql-server-data\adventureworks
    

Beispieldatenbank erstellen und ausfüllen

Sie laden jetzt die Sicherungsdatei von AdventureWorks database von Microsoft herunter und stellen sie in Ihrer SQL Server-Instanz wieder her. Diese Datenbank simuliert die Produktionsdatenbank, die Sie migrieren möchten.

  1. Laden Sie in der PowerShell-Befehlszeile die Sicherungsdatei AdventureWorksLT2017.bak herunter, um C zu starten:

    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. Stellen Sie die Datenbank wieder her:

    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. Die neu wiederhergestellte Datenbank validieren. Dazu wird die Anzahl der Zeilen in der Tabelle Customer abgefragt. Die Ausgabe hat 847 Zeilen.

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

Cloud SQL-Instanz vorbereiten

  1. Erstellen Sie in Cloud Shell die Cloud SQL for SQL Server 2017 Enterprise-Instanz:

    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
    

    Der Root-Nutzer ist sqlserver mit dem Passwort sqlserver12@. Notieren Sie sich auch die SQL Server-IP-Adresse.

  2. Speichern Sie die IP-Adresse der SQL Server-Quell-VM in einer Umgebungsvariablen:

    sql_source_ip=$(gcloud compute instances describe sqlserver \
        --zone=us-central1-f | grep natIP | awk '{print $2}')
    echo $sql_source_ip
    
  3. Fügen Sie die SQL Server-VM-IP-Adresse mit der Cloud SQL-Instanz der zugelassenen Liste (weiße Liste) hinzu:

    gcloud sql instances patch target-sqlserver --authorized-networks=$sql_source_ip
    
  4. Erstellen Sie eine Zieldatenbank:

    gcloud sql databases create AdventureWorksTarget --instance=target-sqlserver
    
  5. Überprüfen Sie in der PowerShell-Befehlszeile, die Sie als Administrator gestartet haben, die Verbindung zu Cloud SQL für 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'"
    

    Der Befehl gibt 'test' aus.

Replikation von der VM zu Cloud SQL initiieren

Mithilfe der SQL Server-Snapshot-Replikation erstellen Sie einen Job, um Datenbank-Snapshots in Cloud SQL zu replizieren.

Distributor einrichten

Konfigurieren Sie nun die SQL Server-VM als SQL Server-Collector. In der Praxis kann ein Distributor auf einer separaten Maschine ausgeführt werden, aber in dieser Anleitung wird er auf derselben VM ausgeführt.

  1. Aktualisieren Sie in der PowerShell-Befehlszeile, die Sie als Administrator gestartet haben, den Namen der lokalen SQL Server-Instanz mit dem Namen der VM-Host:

    $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
    

    Wenn Sie den Fehler Cannot open MSSQLServer service on computer '.'. erhalten, haben Sie die PowerShell-Befehlszeile wahrscheinlich nicht als Administrator ausgeführt.

  2. Prüfen Sie, ob der Name der Instanz jetzt "sqlserver" lautet:

    osql -E -Q "select @@servername;"
    
  3. Geben Sie die Distributionsdatenbank an:

    $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. Konfigurieren Sie die Distributionsdatenbank:

    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. Registrieren Sie den SQL Server-VM-Namen als Publisher beim Distribution:

    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'"
    

Publikation einrichten

Nachdem die Verteilung eingerichtet ist, konfigurieren Sie, welche Tabellen veröffentlicht werden.

  1. Aktivieren und starten Sie in der PowerShell-Befehlszeile den SQL Server-Agent:

    Set-Service -Name SQLServerAgent -StartupType Automatic
    Start-Service -Name SQLServerAgent
    
  2. Erstellen Sie eine Publikation für die Datenbank 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. Konfigurieren Sie die Publikation so, dass einmal pro Stunde ein Snapshot der Quelle an Cloud SQL gesendet wird:

    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. Artikel (Tabellen) zur Publikation hinzufügen Obwohl die AdventureWorksLT2017-Datenbank viele Tabellen enthält, sollten Sie der Einfachheit halber drei Tabellen replizieren: Address, Customer und 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. Erstellen Sie manuell einen Snapshot der Artikel. Andernfalls kann es bis zu einer Stunde dauern, bis der Planer den ersten Snapshot erstellt.

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

Abo einrichten

Sie erstellen jetzt ein Abo, das die veröffentlichten Daten an Cloud SQL sendet.

  1. Erstellen Sie über die PowerShell-Befehlszeile ein Abo, um den Veröffentlichungs-Snapshot an Cloud SQL zu senden:

    $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. Validieren Sie, ob die Daten in der Cloud SQL-Instanz verfügbar sind:

    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]"
    

    Der Befehl gibt 417, 450, 847 aus

Bereinigen

Nachdem Sie die Anleitung abgeschlossen haben, können Sie die erstellten Ressourcen bereinigen, damit sie keine Kontingente mehr nutzen und keine Gebühren mehr anfallen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen oder deaktivieren.

Projekt löschen

  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.

Nächste Schritte