就地升级数据库主要版本

本页面介绍了如何通过就地升级 Cloud SQL 实例而不是通过迁移数据来升级数据库主要版本。

简介

数据库软件提供商会定期发布包含新功能、性能改进和安全增强功能的新主要版本。Cloud SQL 会在新版本发布后进行提取。Cloud SQL 为新的主要版本提供支持后,您可以升级实例以使数据库保持最新。

您可以就地升级实例的数据库版本,也可以通过迁移数据。就地升级是较简单的升级实例主要版本的方法。您无需迁移数据或更改应用连接字符串。通过就地升级,您可以在升级后保留当前实例的名称、IP 地址和其他设置。就地升级不需要移动数据文件,可以更快地完成。在某些情况下,停机时间比迁移数据所需的短。

Cloud SQL for SQL Server 就地升级操作使用 SQL Server 就地升级实用程序

规划主要版本升级

  1. 选择目标主要版本。

    gcloud

    如需了解如何安装和开始使用 gcloud CLI,请参阅安装 gcloud CLI。如需了解如何启动 Cloud Shell,请参阅使用 Cloud Shell

    如需检查可进行就地升级的目标数据库版本,请执行以下操作:

    1. 运行以下命令:
    2. gcloud sql instances describe INSTANCE_NAME
         

      INSTANCE_NAME 替换为实例名称。

    3. 在命令的输出中,找到标记为 upgradableDatabaseVersions 的部分。
    4. 每个子部分都会返回一个可升级的数据库版本。在每个子部分中,请查看以下字段。
      • majorVersion:可进行就地升级的目标主要版本。
      • name:包含主要版本的数据库版本字符串。
      • displayName:数据库版本的显示名称。

    REST v1

    如需检查哪些目标数据库版本可进行主要版本就地升级,请使用 Cloud SQL Admin API 的 instances.get 方法。

    在使用任何请求数据之前,请先进行以下替换:

    • INSTANCE_NAME:实例名称。

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    
    upgradableDatabaseVersions:
    
    {
      major_version: "SQLSERVER_2022_STANDARD"
      name: "SQLSERVER_2022_STANDARD"
      display_name: "SQL Server 2022 Standard"
    }
    
    

    REST v1beta4

    如需检查哪些目标数据库版本可进行实例的主要版本就地升级,请使用 Cloud SQL Admin API 的 instances.get 方法。

    在使用任何请求数据之前,请先进行以下替换:

    • INSTANCE_NAME:实例名称。

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_NAME

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    
    upgradableDatabaseVersions:
    
    {
      major_version: "SQLSERVER_2022_STANDARD"
      name: "SQLSERVER_2022_STANDARD"
      display_name: "SQL Server 2022 Standard"
    }
    
    

    如需查看 Cloud SQL 支持的数据库版本的完整列表,请参阅数据库版本和版本政策

  2. 请考虑每个数据库主要版本中提供的功能并解决不兼容问题。

    请参阅 SQL Server 已停用的功能重大更改

    新的主要版本引入了不兼容的更改,可能需要您修改应用代码、架构或数据库设置。在升级数据库实例之前,请先查看目标主要版本的版本说明,以确定您必须解决的不兼容问题。

  3. 通过试运行测试升级。

    在升级生产数据库之前,请先在测试环境中执行端到端升级流程的试运行。您可以克隆实例,创建用于测试升级过程的数据的相同副本。

    除了验证升级是否成功完成之外,运行测试还可以确保应用在升级后的数据库上按预期运行。

  4. 确定升级时间。

    升级要求实例在一段时间内不可用。计划在数据库活动较少的时间段内升级。

就地升级数据库主要版本

启动升级操作时,Cloud SQL 首先会检查实例的配置,以确保实例与升级兼容。验证配置后,Cloud SQL 会将实例设为不可用,进行升级前备份,执行升级,使实例可用,然后在升级后进行备份。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 点击修改
  4. 实例信息部分中,点击升级按钮并确认您想要进入升级页面。
  5. 选择数据库版本页面上,点击要升级到的数据库版本列表,然后选择一个可用的数据库主要版本。
  6. 点击继续
  7. 实例 ID 框中,输入实例的名称,然后点击开始升级按钮。
此操作需要几分钟才能完成。

验证升级后的数据库主要版本是否显示在实例概览页面上的实例名称下方。

gcloud

  1. 开始升级。

    使用带有 --database-version 标志的 gcloud sql instances patch 命令。

    在运行该命令之前,请替换以下项:

    • INSTANCE_NAME:实例的名称。
    • DATABASE_VERSION:数据库主要版本的枚举(必须高于当前版本)。为主要版本指定一个可用作实例升级目标的数据库版本。您可以将此枚举作为规划升级的第一步来获取。如果您需要完整的数据库版本枚举列表,请参阅 SqlDatabaseEnums
    gcloud sql instances patch INSTANCE_NAME \
    --database-version=DATABASE_VERSION

    主要版本升级需要几分钟才能完成。您可能会看到一条消息,指示操作所花的时间超出了预期。您可以忽略此消息,也可以运行 gcloud sql operations wait 命令来关闭该消息。

  2. 获取升级操作名称。

    使用带有 --instance 标志的 gcloud sql operations list 命令。

    在运行命令之前,请将 INSTANCE_NAME 变量替换为实例名称。

    gcloud sql operations list --instance=INSTANCE_NAME
  3. 监控升级的状态。

    使用 gcloud sql operations describe 命令。

    在运行该命令之前,请将 OPERATION 变量替换为上一步中检索到的升级操作名称。

    gcloud sql operations describe OPERATION

REST v1

  1. 开始就地升级。

    将 PATCH 请求与 instances:patch 方法搭配使用。

    在使用任何请求数据之前,请先替换以下变量:

    • PROJECT_ID:项目的 ID。
    • INSTANCE_NAME:实例的名称。

    HTTP 方法和网址:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

    请求 JSON 正文:

    {
      "databaseVersion": DATABASE_VERSION
    }

    DATABASE_VERSION 替换为数据库主要版本的枚举(必须高于当前版本)。为主要版本指定一个可用作实例升级目标的数据库版本。您可以将此枚举作为规划升级的第一步来获取。如果您需要完整的数据库版本枚举列表,请参阅 SqlDatabaseVersion

  2. 获取升级操作名称。

    PROJECT_ID 替换为项目的 ID 后,使用 GET 请求和 operations.list 方法。

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations
  3. 监控升级的状态。

    替换以下变量后,使用带有 operations.get 方法的 GET 请求:

    • PROJECT_ID:项目的 ID。
    • OPERATION_NAME:上一步中检索的升级操作名称。

    HTTP 方法和网址:

    GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operation/OPERATION_NAME

Terraform

如需更新数据库版本,请使用 Terraform 资源和适用于 Google Cloud 的 Terraform 提供程序 4.34.0 版或更高版本

resource "google_sql_database_instance" "instance" {
  name             = "sqlserver-instance"
  region           = "us-central1"
  database_version = "SQLSERVER_2019_STANDARD"
  root_password    = "INSERT-PASSWORD-HERE"
  settings {
    tier = "db-custom-2-7680"
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

应用更改

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

删除更改

如需删除更改,请执行以下操作:

  1. 如需停用删除防护,请在 Terraform 配置文件中将 deletion_protection 参数设置为 false
    deletion_protection =  "false"
  2. 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:
    terraform apply
  1. 通过运行以下命令并在提示符处输入 yes,移除之前使用 Terraform 配置应用的资源:

    terraform destroy

在您发出就地升级请求时,Cloud SQL 首先会执行升级前检查。如果 Cloud SQL 确定实例未准备好进行升级,则升级请求会失败,并显示一条消息来建议您如何解决问题。另请参阅排查主要版本升级问题

自动升级备份

执行主要版本升级时,Cloud SQL 会自动进行两个按需备份,称为升级备份:

  • 第一个升级备份是升级前备份,它在开始升级之前立即进行。您可以使用此备份将数据库实例恢复为先前版本的状态。
  • 第二个升级备份是升级后备份,该备份在允许对升级后的数据库实例执行新写入后立即创建。

查看备份列表时,系统会列出类型为 On-demand 的升级备份。升级备份会带有标签,以便您快速识别。例如,如果您要从 SQL Server Enterprise 2017 升级到 SQL Server Enterprise 2019,则升级前备份标记为 Pre-upgrade backup, SQLSERVER_2017_ENTERPRISE to SQLSERVER_2019_ENTERPRISE.,升级后备份标记为 Post-upgrade backup, SQLSERVER_2019_ENTERPRISE from SQLSERVER_2017_ENTERPRISE.

与其他按需备份一样,升级备份会一直保留,直到您删除它们或删除实例。

升级数据库兼容性级别

数据库兼容性级别决定了数据库相对于其所提供应用的行为。数据库兼容性级别设置可确保与早期版本的 SQL Server 的向后兼容性,并与 Transact-SQL 和 Query Optimizer 更改相关。当 SQL Server 实例的数据库版本升级时,系统会保留现有数据库的兼容性级别,以便应用可以在较新版本的 SQL Server 上继续运行。升级兼容性级别可帮助您受益于新功能、查询处理改进和其他更改。

升级实例的数据库引擎版本后,当数据库提供的应用准备就绪后,请升级实例中每个数据库的数据库兼容性级别。当兼容性级别设置为最新时,数据库将使用最新功能并提升性能。

如需升级数据库兼容性级别,请执行以下步骤:

  1. 确定数据库的当前兼容性级别

    例如,对于 SQL Server 2017,默认兼容性级别为 140。如需检查数据库的当前兼容性级别,请在将 DATABASE_NAME

    替换为 SQL Server 实例上的数据库的名称后,在 Transact-SQL 中运行以下命令。

    USE DATABASE_NAME
    GO
    SELECT compatibility_level
    FROM sys.databases WHERE name = 'DATABASE_NAME'
  2. 确定目标兼容性级别。

    确定升级的数据库版本的默认兼容性级别,以确定数据库的目标兼容性级别。例如,对于 SQL Server 2022,默认兼容性级别为 160。请参阅具有兼容性级别的新版 SQL Server 的表映射

  3. 评估当前和目标兼容性级别之间的差异。

    在升级兼容性级别之前,请研究当前兼容性级别与目标兼容性级别在系统行为上的差异。请参阅兼容性级别差异的完整列表

  4. 收集工作负载数据的基准。

    在升级兼容性级别之前,请使用 SQL Server 查询存储区收集工作负载数据的基准,以便稍后识别并解决回归查询。您可以使用查询存储区来捕获典型业务周期的查询和计划,以建立性能基准。对于指导的工作流,请使用 SQL Server Management Studio 中的查询微调助理功能。

  5. 升级兼容性级别。

    如需更改数据库的兼容性级别,请在将 DATABASE_NAME

    替换为 SQL Server 实例上的数据库名称并将 TARGET_COMPATIBILITY_LEVEL 替换为目标兼容性级别后,在 Transact-SQL 中运行以下命令。

    ALTER DATABASE DATABASE_NAME
    SET COMPATIBILITY_LEVEL = TARGET_COMPATIBILITY_LEVEL;
    GO
  6. 收集升级后的工作负载数据。

    使用查询存储区收集升级后的工作负载数据以进行比较和回归检测。

  7. 解决回归查询。

    在大多数情况下,查询优化器在升级的兼容性级别都会提升性能。但是,某些查询可能会不时的性能下降。查询存储区的回归查询功能可帮助您识别已回归的查询,并强制执行最后一个已知良好查询计划。SQL Server 还提供自动计划更正功能,以便在查询回归时自动切换到上一个已知良好计划。

完成主要版本升级

升级主实例后,执行验收测试以确保升级后的系统按预期运行。

排查主要版本升级问题

如果您尝试执行无效的升级命令(例如,如果实例包含新版本的无效数据库标志),则 Cloud SQL 会返回错误消息。

如果升级请求失败,请检查升级请求的语法。如果请求的结构有效,请尝试查看以下建议。

查看升级日志

如果有效升级请求出现任何问题,Cloud SQL 会将错误日志发布到 projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fsqlserver.err。 每个日志条目都包含标签,用于标识实例标识符,以帮助您识别升级错误的实例。 请查找此类升级错误并加以解决。

如需查看错误日志,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 如需打开实例的概览页面,请点击实例名称。
  3. 在实例的概览页面的操作和日志窗格中,点击查看 SQL Server 错误日志链接。

    日志浏览器页面随即会打开。

  4. 按以下方式查看日志:

    • 如需列出项目中的所有错误日志,请在日志名称日志过滤条件中选择日志名称。

    如需详细了解查询过滤条件,请参阅高级查询

    • 如需过滤单个实例的升级错误日志,请在搜索所有字段框中输入以下查询,将 DATABASE_ID

    替换为项目 ID,后跟实例名称,格式为 project_id:instance_name

    resource.type="cloudsql_database"
    resource.labels.database_id="DATABASE_ID"
    logName : "projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fsqlserver.err"

    例如,如需按项目 buylots 中运行的名为 shopping-db 的实例过滤升级错误日志,请使用以下查询过滤条件:

     resource.type="cloudsql_database"
     resource.labels.database_id="buylots:shopping-db"
     logName : "projects/buylots/logs/cloudsql.googleapis.com%2Fsqlserver.err"

恢复到先前的主要版本

如果升级后的数据库系统未按预期运行,您可能需要将实例恢复到先前版本。您可以通过将升级前备份恢复到 Cloud SQL 恢复实例来执行此操作,该实例是运行升级前版本的新实例。

如需恢复到先前的版本,请执行以下步骤:

  1. 确定升级前备份。

    请参阅自动升级备份

  2. 创建恢复实例。

    使用升级前备份时 Cloud SQL 运行的主要版本创建新的 Cloud SQL 实例。设置与原始实例相同的标志实例设置

  3. 恢复升级前备份。

    将升级前备份恢复到恢复实例。此命令可能需要几分钟才能完成。

  4. 添加读取副本。

    如果您使用的是读取副本,请单独添加。

  5. 连接您的应用。

    恢复数据库系统后,使用有关恢复实例及其读取副本的详细信息来更新应用。您可以继续在数据库的升级前版本上处理流量。

限制

本部分列出了就地主要版本升级的限制。

常见问题解答

升级数据库主要版本时,可能会出现以下问题。

实例在升级期间不可用吗?
可以。在 Cloud SQL 执行升级期间,您的实例在一段时间内不可用。
升级需要多长时间?

升级单个实例通常不到 10 分钟。如果您的实例配置使用少量 vCPU 或内存,则升级可能需要更多时间。

如果您的实例托管过多数据库或表,或者您的数据库非常大,则升级可能需要几个小时,甚至超时,因为升级时间与数据库中的对象数量相对应。如果您有多个实例需要升级,那么总升级时间会按比例增加。

我可以监控升级过程的每个步骤吗?
Cloud SQL 支持您监控升级操作是否仍在进行中,但您无法跟踪每次升级中的各个步骤。
升级后是否可以取消?
不可以,升级一旦开始就无法取消。如果升级失败,Cloud SQL 会自动恢复您在先前版本上的实例。
升级期间,我的设置会发生什么情况?

执行主要版本就地升级时,Cloud SQL 会保留您的数据库设置,包括实例名称、IP 地址、明确配置的标志值和用户数据。但是,系统变量的默认值可能会更改。

如需了解详情,请参阅配置数据库标志。如果目标版本中不再支持特定标志或值,则 Cloud SQL 会在升级期间自动移除该标志。

后续步骤