使用 Microsoft SQL Server 备份在 Compute Engine 上进行时间点恢复

Last reviewed 2023-06-27 UTC

在本教程中,您将在 Compute Engine SQL Server 实例上执行备份。本教程将向您展示如何管理这些备份并将其存储到 Cloud Storage 中,以及如何将数据库恢复到某个时间点。

如果您是系统管理员、开发者、工程师、数据库管理员,或者希望备份 SQL Server 数据的开发运营工程师,那么本教程非常适合您。

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

目标

  • 启动 SQL Server 实例并创建数据库。
  • 执行完整备份、差分备份和事务日志备份。
  • 将备份上传到 Cloud Storage。
  • 从 Cloud Storage 备份恢复数据库。

费用

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

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

准备工作

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

    转到“项目选择器”

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

  4. 启用 Compute Engine API。

    启用 API

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

    转到“项目选择器”

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

  7. 启用 Compute Engine API。

    启用 API

  8. 安装您选择的远程桌面协议 (RDP) 客户端。如需了解详情,请参阅 Microsoft 远程桌面客户端。如果您已安装 RDP 客户端,则可以跳过此任务。

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

准备 SQL Server 实例

在本部分中,您将启动 SQL Server 实例,准备数据库并配置加密密钥。

启动 SQL Server 实例

第一项任务是启动 SQL Server 实例并创建备份文件夹。

  1. 打开 Cloud Shell:

    转到 Cloud Shell

  2. 启动 SQL Server 实例:

    gcloud compute instances create sqlserver \
        --zone=us-central1-c \
        --machine-type=n1-standard-1 \
        --image-family=sql-std-2019-win-2019 \
        --image-project=windows-sql-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        --tags=sqlserver \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    
  3. 转到 Google Cloud 控制台中的虚拟机实例页面,然后找到您要连接的 Windows 实例:

    转到“虚拟机实例”页面

  4. 设置实例的初始密码。将密码保存在安全的位置。

  5. 在 Google Cloud 控制台的 Compute Engine 部分,点击 RDP 下拉列表,然后选择 下载 RDP 文件选项以下载实例的 RDP 文件。使用此文件通过 RDP 客户端连接到实例。如需了解详情,请参阅 Microsoft 远程桌面客户端

安装 SQL Server Management Studio

通过执行以下操作安装 Microsoft SQL Server Management Studio (SSMS)

  1. 在 RDP 会话中,最小化所有窗口,然后启动 Windows PowerShell ISE 应用。

  2. 在 PowerShell 提示符中,下载并执行 SSMS 安装程序:

    Start-BitsTransfer `
        -Source "https://aka.ms/ssmsfullsetup" `
        -Destination "$env:Temp\ssms-setup.exe"
    & $env:Temp\ssms-setup.exe
    
  3. 接受提示以允许进行更改。

  4. 在 SSMS 安装程序中,点击 Install

  5. 安装完成后,点击 Restart 来重启远程机器。此操作会关闭此 RDP 会话。

  6. 如需再次连接,请在 RDP 窗口中点击 Connect。如果远程机器未完成重启,请等待一会,然后再次尝试连接。

  7. 输入您的用户名和之前保存的密码(将 Domain 字段留空),然后点击 OK 重新连接。

准备备份和恢复文件夹

  1. 在 RDP 会话中,最小化所有窗口,然后在 Windows 桌面上打开 Google Cloud SDK Shell(与 Cloud Shell 不同)。

  2. 创建备份文件夹:

    mkdir c:\backup
    
  3. 创建恢复文件夹:

    mkdir c:\restore
    

准备数据库

  1. 在 Cloud Shell 中,在实例上创建一个测试数据库:

    osql -E -Q "create database testdb"
    
  2. 创建一个测试表:

    osql -E -Q "create table testdb.dbo.testtable(status varchar(255))"
    

配置加密密钥

  1. 在 Cloud Shell 中,创建一个主数据库密钥:

    osql -E -Q "USE master;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyPassword!';"
    
  2. 创建备份证书:

    osql -E -Q "USE master; CREATE CERTIFICATE testdbcert WITH SUBJECT = 'testdb certificate';"
    

执行备份

SQL Server 2019 及更早版本

在本部分中,您将创建完整备份、差分备份和事务日志备份,同时在每次备份之间更改数据库。

  1. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  2. 在 Cloud Shell 中,执行完整备份:

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb.bak' WITH INIT,
        COMPRESSION,
        ENCRYPTION
        (
            ALGORITHM = AES_256,
            SERVER CERTIFICATE = testdbcert
        )  "
    
  3. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  4. 执行差分备份:

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb-diff.bak' WITH DIFFERENTIAL,
    COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  5. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  6. 执行事务日志备份:

    osql  -E -Q "BACKUP LOG testdb TO DISK='c:\backup\testdb-log.bak' WITH COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  7. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  8. 验证表中的行:

    osql -E -Q "select * from testdb.dbo.testtable"
    

    输出类似以下内容:

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

SQL Server 2022

在本部分中,您将创建完整备份、差分备份和事务日志备份,同时在每次备份之间更改数据库。 您可以将内置的备份和恢复命令与 Cloud Storage 搭配使用。

SQL Server 2022 (16.x) 通过引入使用 REST API 连接到与 S3 兼容的对象存储的任何提供方的新连接器来支持扩展对象存储集成。您可以在 SQL Server 2022 中使用 BACKUP TO URLRESTORE FROM URL 命令,并将任何与 S3 兼容的存储目标位置作为网址。

SQL Server 使用凭据连接到其外部的资源。凭据是包含身份验证信息的记录。如需对 Cloud Storage S3 接口的访问进行身份验证和授权,您必须创建和使用访问密钥和密码。然后,将这些密钥存储在 SQL Server 凭据中。

  1. 为您的用户账号创建 Cloud Storage 存储桶的访问密钥和密码:

    1. 前往 Cloud Storage
    2. 转到设置
    3. 打开互操作性
    4. 打开您用户账号的访问密钥
    5. 向下滚动,然后点击创建密钥以创建新的访问密钥和密码。
  2. 在 SQL Server 2022 实例中创建凭据:

    运行以下代码示例以创建凭据。为您的凭据选择一个名称。将 ACCESS_KEYSECRET 字段替换为您在上一步中生成的值。

    osql -E -Q "
        CREATE CREDENTIAL [CREDENTIAL_NAME]
        WITH
            IDENTITY = 'S3 Access Key',
            SECRET = 'ACCESS_KEY:SECRET'
        "
    
  3. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  4. 执行到 Cloud Storage 存储桶的 BACKUP 操作:

    运行备份数据库命令,将 Cloud Storage 存储桶 URI 设置为 URL 参数值,并将之前定义的凭据名称设置为 WITH CREDENTIAL 选项的值。此命令将允许 SQL Server 创建备份文件并同时上传到 Cloud Storage 存储桶,不需要占用额外的本地磁盘空间。

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            FORMAT,
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    

以下列表介绍了 WITH 语句的参数:

  • FORMAT:覆盖任何现有备份并创建新的介质集。
  • STAT:告知 SQL Server 提供有关备份进度的信息。
  • COMPRESSION:告知 SQL Server 压缩备份文件,使其体积变小并更快地上传到 Cloud Storage。
  • MAXTRANSFERSIZE = 10485760BLOCKSIZE = 65536 选项可帮助避免备份文件较大时发生 I/O 设备错误。
  1. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  2. 执行差分备份:

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-diff.bak'
        WITH
            DIFFERENTIAL,
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  3. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  4. 执行事务日志备份:

    osql -E -Q "
        BACKUP LOG testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-log.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  5. 在测试表中添加一行:

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  6. 验证表中的行:

    osql -E -Q "select * from testdb.dbo.testtable"
    

    输出如下所示:

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

管理备份

在本部分中,您将在 Cloud Storage 中远程存储备份,配置 Cloud Storage 存储分区以自动删除旧备份,以及安排备份。如果您正在运行多个数据库服务器,请考虑在 Cloud Storage 存储分区中创建多个目录以表示不同的服务器。

将备份上传到 Cloud Storage

SQL Server 2019 及更早版本

现在您有了一些备份文件,您可以将其上传到 Cloud Storage:

  1. 在 Cloud Shell 中,创建一个 Cloud Storage 存储分区。存储分区名称在 Google Cloud 中必须是全局唯一的。如需确保您的存储分区名称是唯一的,请考虑使用项目名称为其指定命名空间,如下所示:

    gsutil mb "gs://${DEVSHELL_PROJECT_ID}-sql-backups"
    
  2. 在 RDP 会话的 shell 窗口中,将文件复制到 Cloud Storage 存储分区。在以下命令中,将 BUCKET_NAME 替换为您刚刚创建的存储分区的名称。

    gsutil cp -n c:\backup\testdb*.bak gs://BUCKET_NAME
    

    您可以使用 gsutil cp 命令创建整个目录结构,并一次性上传多个文件。

SQL Server 2022

备份文件已经在您的存储桶中,因为 SQL Server 2022 支持直接备份到 Cloud Storage。

在 Cloud Storage 中设置文件自动删减功能

备份有其生命周期,因此您需要移除过期的备份。 为了实现此流程的自动化,Cloud Storage 提供了一项生命周期管理机制,可用于管理备份文件的生命周期。

如需为存储分区中的对象配置生命周期管理,请执行以下操作:

  1. 在 Cloud Shell 中,创建一个 JSON 生命周期配置文件。 此文件指示 Cloud Storage 在 30 天后删除文件:

    bash -c 'cat <<EOF >  lifecycle.json
    {
        "lifecycle": {
            "rule": [{
                "action": { "type": "Delete" },
                "condition": { "age": 30 }
            }]
        }
    }
    EOF'
    
  2. 设置 Cloud Storage 存储分区的生命周期配置。 将 BUCKET_NAME 替换为您的存储分区名称:

    gsutil lifecycle set lifecycle.json gs://BUCKET_NAME
    

安排备份

通常情况下,定期进行完整备份,并在下一次完整备份前执行差分备份是比较好的做法。在 Windows 上,安排备份的一种方法是使用计划任务。

如果您创建的备份脚本需要执行一系列备份,请确保在每个点包含一些逻辑验证步骤以验证是否成功完成了作业。如果验证失败,请确保脚本发出 Windows 警报。此外,为避免填满本地磁盘,请确保脚本在成功上传到 Cloud Storage 后删除本地备份文件。

使用备份进行恢复

在本部分中,您将使用存储在 Cloud Storage 中的备份文件恢复 SQL Server 数据库。

SQL Server 2019 及更早版本

  1. 在 RDP 会话的 Cloud Shell 中,从 Cloud Storage 下载备份文件。将 BUCKET_NAME 替换为 SQL Server 备份存储分区的名称:

    gsutil cp gs://BUCKET_NAME/testdb*.bak c:\restore
    
  2. 打开 SQL Server Management 控制台。

  3. 点击“Start”按钮,然后点击 Microsoft SQL Server Tools 18 > Microsoft SQL Server Management Studio 18

  4. 保持 Connection 字段不变,然后点击 Connect

  1. 在左侧窗格中,展开 Databases
  2. 右键点击 testdb,然后在弹出的菜单中点击 Tasks > Restore > Database
  3. 将备份文件导入控制台:
    1. 对于 Source,选择 Device
    2. 点击 按钮。
    3. 在打开的对话框中,点击 Add,选择 C:\restore 下的所有文件,然后点击 OK
    4. 点击 OK
  4. 要查看时间点恢复选项,请执行以下操作:

    1. 点击 Timeline
    2. Restore to 下,点击 Specific date and time
    3. 对于 Timeline Interval,选择 hour
    4. Transaction Log Backup 范围内选择一个时间。
    5. 点击 Cancel 退出时间轴屏幕。

  5. 在本教程中,您将数据库恢复到执行事务日志备份之前的状态。为此,请在备份列表中清除事务日志行:

    清除备份列表中的事务日志行

  6. 开始恢复过程:

    1. 点击 OK
    2. 等待数据库完成恢复过程,当您看到消息 Database 'testdb' restored successfully 时,点击 OK
  7. 列出测试表中的行:

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    输出将显示以下两行:

    "Initial
    "After Full Backup"
    

    在执行事务日志备份之前,您会看到插入表中的所有行。

SQL Server 2022

您可以执行 RESTORE 操作。将 Cloud Storage 文件路径设置为 URL 参数值。例如,此 T-SQL 脚本会直接从 Cloud Storage 恢复完整备份:

```
osql -E -Q "
RESTORE DATABASE testdb
FROM
    URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
WITH
    CREDENTIAL = 'CREDENTIAL_NAME';
    "
```
  1. 打开 SQL Server Management 控制台。
  2. 点击“Start”按钮,然后点击 Microsoft SQL Server Tools 19 > Microsoft SQL Server Management Studio 19
  1. 保持 Connection 字段不变,然后点击 Connect
  1. 在左侧窗格中,展开 Databases
  2. 右键点击 testdb,然后在弹出的菜单中点击 Tasks > Restore > Database
  3. 将备份文件导入控制台:

    1. 对于 Source,选择 Device
    2. 点击 按钮。
    3. 在打开的对话框中,点击 Backup media type,然后选择 S3 URL
    4. 在随即打开的对话框中,点击 Add。添加备份文件在 Cloud Storage 存储桶上的三个位置,以及您在创建凭据时提供的密码和访问密钥。

    5. 点击确定

  4. 要查看时间点恢复选项,请执行以下操作:

    1. 点击 Timeline
    2. Restore to 下,点击 Specific date and time
    3. 对于 Timeline Interval,选择 hour
    4. Transaction Log Backup 范围内选择一个时间。
    5. 点击 Cancel 退出时间轴屏幕。

  5. 在本教程中,您将数据库恢复到执行事务日志备份之前的状态。为此,请在备份列表中清除事务日志行:

    清除备份列表中的事务日志行

  6. 开始恢复过程:

    1. 点击 OK
    2. 等待数据库完成恢复过程,当您看到消息 Database 'testdb' restored successfully 时,点击 OK
  7. 列出测试表中的行:

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    输出将显示以下两行:

    "Initial
    "After Full Backup"
    

    在执行事务日志备份之前,您会看到插入表中的所有行。

清除数据

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

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

后续步骤