使用备份文件在 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. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Storage, Cloud SQL Admin, and Compute Engine API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Cloud Storage, Cloud SQL Admin, and Compute Engine API。

    启用 API

  8. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

为示例数据库创建脚本

在本部分,您需要创建一个脚本来填充预先加载的示例数据库。 然后,在使用此数据库的 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 存储分区:

    gsutil mb -l US "gs://${DEVSHELL_PROJECT_ID}-sql-backups"
    

备份示例数据库

在本部分中,您将连接到 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)
    
    gsutil cp -n c:\backup\testdb.bak gs://$PROJECT_ID-sql-backups
    

将备份文件导入 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 存储分区的访问控制列表 (ACL) 中:

    gsutil acl ch -u ${SVC_EMAIL_ADDRESS}:W gs://${DEVSHELL_PROJECT_ID}-sql-backups
    
  3. 将服务账号添加到具有读取者权限的导入文件中:

    gsutil acl ch -u $SVC_EMAIL_ADDRESS:R gs://${DEVSHELL_PROJECT_ID}-sql-backups/testdb.bak
    
  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. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤