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 dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

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.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Cloud SQL Admin and Compute Engine API APIs aktivieren.

    Aktivieren Sie die APIs

  5. Aktivieren Sie Cloud Shell in der Cloud Console.

    Cloud Shell aktivieren

    Unten in der Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Cloud SDK einschließlich des gcloud-Befehlszeilentools vorinstalliert ist. Die Werte sind bereits für Ihr aktuelles Projekt festgelegt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

Nach Abschluss dieser Anleitung 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 Remote Desktop Protocol (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. Installieren Sie die Erweiterung Chrome RDP for Google Cloud Platform.

  4. Gehen Sie in der Cloud Console zur Seite VM-Instanzen.

    Zu "VM-Instanzen"

  5. Öffnen Sie die Chrome RDP-Erweiterung, indem Sie für die VM-Instanz sqlserver, zu der Sie eine Verbindung herstellen möchten, auf die Schaltfläche RDP klicken.

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

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

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

  9. 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 in Google Cloud erstellten Ressourcen bereinigen, damit sie keine kostenpflichtigen Kontingente verbrauchen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen oder deaktivieren.

Projekt löschen

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte