使用备份文件在 SQL Server 2017 和 Cloud SQL for SQL Server 之间迁移数据


在本教程中,您需要将数据从 Compute Engine 上运行的 SQL Server 2017 Enterprise 迁移到 Cloud SQL for SQL Server 2017 Enterprise。本教程介绍如何从 SQL Server 2017 导出数据、将这些数据导入 Cloud SQL for SQL Server 2017,并验证这些数据是否已成功导入。

如果您想要从 SQL Server 2008 迁移数据,请参阅使用备份文件在 SQL Server 2008 和 Cloud SQL for SQL Server 之间迁移数据

如果您是系统管理员、开发者、工程师、数据库管理员或 DevOps 工程师,并且希望将数据从 SQL Server 2017 迁移到 Cloud SQL for SQL Server,那么本教程非常适合您。

本教程假定您熟悉以下内容:

目标

  • 在 Compute Engine 上创建 SQL Server 虚拟机实例以托管示例数据库。
  • 创建 Cloud SQL for SQL Server 实例。
  • 创建 Cloud Storage 存储分区。
  • 备份示例数据库。
  • 将数据库导入 Cloud SQL for SQL Server。
  • 验证导入的数据。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  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 Storage, Cloud SQL Admin, and Compute Engine 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 Storage, Cloud SQL Admin, and Compute Engine 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.

为示例数据库创建脚本

在本部分,您需要创建一个脚本来填充预先加载的示例数据库。 然后,在使用此数据库的 Compute Engine 上创建 SQL Server 2017 实例。

  1. 在 Cloud Shell 中,创建一个要部署为启动脚本的 PowerShell 脚本:

    cat << 'EOF' > startup.ps1
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    $dataseturl = "https://opendata.maryland.gov/api/views/ryxx-aeaf/rows.csv?accessType=DOWNLOAD"
    Invoke-WebRequest -Uri $dataseturl -OutFile c:\dataset.csv
    Invoke-Sqlcmd -Query "CREATE DATABASE testdb;"
    Invoke-Sqlcmd -Query "CREATE TABLE testdb.dbo.MarylandZipCodes ( zipcode int NOT NULL PRIMARY KEY,  city varchar(255), county varchar(255))"
    Invoke-Sqlcmd -Query "BULK INSERT testdb.dbo.MarylandZipCodes FROM 'c:\dataset.csv' WITH (DATAFILETYPE='char',FIELDTERMINATOR=',' ,ROWTERMINATOR = '0x0a',  FIRSTROW=2);"
    EOF
    

    此启动脚本会创建一个名为 testdb 的本地数据库,其中包含名为 MarylandZipCodes 的表。然后,脚本会下载马里兰州公开邮政编码注册表,并将注册表导入表中。

  2. 创建适用于 Windows Server 2016 的 SQL Server 2017 Enterprise 实例:

    gcloud compute instances create sql-server --machine-type n1-highmem-4 \
        --boot-disk-size 50GB \
      --image-project windows-sql-cloud --image-family sql-ent-2017-win-2016 \
      --zone us-central1-f  \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --metadata-from-file windows-startup-script-ps1=startup.ps1
    

    在本教程中,您将在 us-central1-f 地区创建启动磁盘大小为 50 GB 的实例。如需详细了解地区,请参阅 Cloud 位置--metadata-from-file 标志将 PowerShell 脚本设置为实例的启动脚本。

创建 Cloud SQL 实例和 Cloud Storage 存储分区

  1. 在 Cloud Shell 中,创建以后要将数据库迁移到的 Cloud SQL for SQL Server 2017 Enterprise 实例:

    gcloud beta sql instances create target  \
        --database-version=SQLSERVER_2017_ENTERPRISE \
        --cpu=2 \
        --memory=5GB \
        --root-password=sqlserver12@ \
        --zone=us-central1-f
    

    该实例可能需要几分钟才能创建完成。默认根用户名为 sqlserver,默认密码为 sqlserver12@。在本教程中,您将在 us-central1-f 地区创建该实例。如需详细了解地区,请参阅 Cloud 位置

  2. 在将数据导入 Cloud SQL 之前,创建一个用于存储备份文件的 Cloud Storage 存储桶:

    gcloud storage buckets create "gs://${DEVSHELL_PROJECT_ID}-sql-backups" --location=US
    

备份示例数据库

在本部分中,您将连接到 SQL Server 虚拟机、创建数据库备份,并将备份数据库上传到 Cloud Storage。

  1. 在 Cloud Shell 中,重置 SQL Server 虚拟机实例的密码:

    gcloud compute reset-windows-password sql-server --zone=us-central1-f
    

    记下用户的新密码。

  2. 安装远程桌面协议 (RDP) 客户端。如需了解详情,请参阅 Microsoft 远程桌面客户端

  3. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  4. 在 Google Cloud 控制台的 Compute Engine 部分,点击 RDP 下拉列表,然后选择 RDP选项以下载 SQL Server 虚拟机实例的 RDP 文件。

    使用此文件通过 RDP 客户端连接到实例。如需了解详情,请参阅 Microsoft 远程桌面客户端

  5. 在浏览器中,最小化所有窗口,然后启动 PowerShell 命令行工具。

  6. 创建备份文件夹:

    mkdir c:\backup
    
  7. 在浏览器中,在备份文件夹中创建数据库备份:

    osql -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb.bak'"
    
  8. 在实例的 shell 中,将备份文件复制到 Cloud Storage 存储桶:

    $PROJECT_ID=(gcloud config get-value core/project)
    
    gcloud storage cp c:\backup\testdb.bak gs://$PROJECT_ID-sql-backups --no-clobber
    

将备份文件导入 Cloud SQL

  1. 在 Cloud Shell 中,检索与 Cloud SQL 实例相关联的服务账号,并将其保存到变量中:

    SVC_EMAIL_ADDRESS=$(gcloud sql instances describe target \
        --format='value(serviceAccountEmailAddress)')
    echo $SVC_EMAIL_ADDRESS
    

    当您创建 Cloud SQL 实例时,Google Cloud 会创建一个服务账号。您可以使用该服务账号授予 Cloud SQL 实例访问其所需资源的权限。

  2. 为服务账号授予将文件写入 Cloud Storage 存储桶的权限:

    gcloud storage buckets add-iam-policy-binding gs://${DEVSHELL_PROJECT_ID}-sql-backups \
        --member=serviceAccount:${SVC_EMAIL_ADDRESS} \
        --role=roles/storage.legacyBucketWriter
    
  3. 为服务账号授予读取 Cloud Storage 存储桶中的文件的权限:

    gcloud storage buckets add-iam-policy-binding gs://${DEVSHELL_PROJECT_ID}-sql-backups/testdb.bak \
        --member=serviceAccount:${SVC_EMAIL_ADDRESS} \
        --role=roles/storage.legacyObjectReader
    
  4. 将备份文件导入 Cloud SQL 数据库:

    gcloud beta sql import bak target \
        gs://${DEVSHELL_PROJECT_ID}-sql-backups/testdb.bak --database testdb
    

验证数据导入

在本部分中,您将检查示例数据是否已成功导入。

  1. 在 Cloud Shell 中,安装 SQL Server 工具包

    sudo apt-get install -y mssql-tools
    

    如果您接受许可条款,请在出现提示时输入 yes

  2. 要安全访问您的 Cloud SQL 实例,请下载 Cloud SQL 代理

    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  3. 启动 Cloud SQL 代理:

    CONNECTION_NAME=$(gcloud sql instances describe target --format='value(connectionName)')
    ./cloud_sql_proxy -instances=${CONNECTION_NAME}=tcp:1433 &
    
  4. 读取 Cloud SQL 表中的行数:

    /opt/mssql-tools/bin/sqlcmd -U sqlserver -S 127.0.0.1 -Q "select count(*)
    from testdb.dbo.MarylandZipCodes"
    

    出现提示时,输入密码 sqlserver12@。在输出中,确保结果为 619

清理

若要避免产生费用,最简单的方法是删除您为本教程创建的 Google Cloud 项目。

删除项目

  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.

后续步骤