本页面介绍了如何通过就地升级 Cloud SQL 实例而不是通过迁移数据来升级数据库主要版本。
简介
数据库软件提供商会定期发布包含新功能、性能改进和安全增强功能的新主要版本。Cloud SQL 会在新版本发布后进行提取。Cloud SQL 为新的主要版本提供支持后,您可以升级实例以使数据库保持最新。
您可以就地升级实例的数据库版本,也可以通过迁移数据。 就地升级是较简单的升级实例主要版本的方法。您无需迁移数据或更改应用连接字符串。通过就地升级,您可以在升级后保留当前实例的名称、IP 地址和其他设置。就地升级不需要移动数据文件,可以更快地完成。在某些情况下,停机时间比迁移数据所需的短。
Cloud SQL for SQL Server 就地升级操作使用 SQL Server 就地升级实用程序。规划主要版本升级
- 确认您拥有执行主要版本升级所需的角色:Cloud SQL Owner 或 Cloud SQL Admin。
- 选择目标主要版本。 - gcloud- 如需了解如何安装和开始使用 gcloud CLI,请参阅安装 gcloud CLI。如需了解如何启动 Cloud Shell,请参阅使用 Cloud Shell。 - 如需检查可进行就地升级的目标数据库版本,请执行以下操作: - 运行以下命令:
- 在命令的输出中,找到标记为 upgradableDatabaseVersions的部分。
- 每个子部分都会返回一个可升级的数据库版本。在每个子部分中,请查看以下字段。
- majorVersion:可进行就地升级的目标主要版本。
- name:包含主要版本的数据库版本字符串。
- displayName:数据库版本的显示名称。
 - gcloud sql instances describe INSTANCE_NAME - 将 INSTANCE_NAME 替换为实例名称。 - 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 支持的数据库版本的完整列表,请参阅数据库版本和版本政策。 
- 请考虑每个数据库主要版本中提供的功能并解决不兼容问题。 - 新的主要版本引入了不兼容的更改,可能需要您修改应用代码、架构或数据库设置。在升级数据库实例之前,请先查看目标主要版本的版本说明,以确定您必须解决的不兼容问题。 
- 通过试运行测试升级。 - 在升级生产数据库之前,请先在测试环境中执行端到端升级流程的试运行。您可以克隆实例,创建用于测试升级过程的数据的相同副本。 - 除了验证升级是否成功完成之外,运行测试还可以确保应用在升级后的数据库上按预期运行。 
- 确定升级时间。 - 升级要求实例在一段时间内不可用。计划在数据库活动较少的时间段内升级。 
执行主要版本升级
您可以升级单个 Cloud SQL 实例的主要版本,也可以升级主实例的主要版本,并在升级过程中包含其所有副本(包括级联副本和跨区域副本)。
升级单个实例的主要版本
当您为单个实例启动升级操作时,Cloud SQL 会执行以下操作:
- 检查实例的配置,以确保实例与升级兼容。
- Cloud SQL 验证配置后,会将实例设为不可用。
- 进行升级前备份。
- 对实例执行升级。
- 将实例设为可用。
- 进行升级后备份。
控制台
- 
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。 
- 如需打开实例的概览页面,请点击实例名称。
- 点击修改。
- 在实例信息部分中,点击升级按钮并确认您想要进入升级页面。
- 在选择数据库版本页面上,点击要升级到的数据库版本列表,然后选择一个可用的数据库主要版本。
- 点击继续。
- 在实例 ID 框中,输入实例的名称,然后点击开始升级按钮。
验证升级后的数据库主要版本是否显示在实例概览页面上的实例名称下方。
gcloud
- 开始升级。 - 使用带有 - --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命令来关闭该消息。
- 获取升级操作名称。 - 使用带有 - --instance标志的- gcloud sql operations list命令。- 在运行命令之前,请将 INSTANCE_NAME 变量替换为实例名称。 - gcloud sql operations list --instance=INSTANCE_NAME 
- 监控升级的状态。 - 使用 - gcloud sql operations describe命令。- 在运行该命令之前,请将 OPERATION 变量替换为上一步中检索到的升级操作名称。 - gcloud sql operations describe OPERATION 
REST v1
- 开始就地升级。 - 将 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。 
- 获取升级操作名称。 - 将 PROJECT_ID 替换为项目的 ID 后,使用 GET 请求和 - operations.list方法。- HTTP 方法和网址: - GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations
- 监控升级的状态。 - 替换以下变量后,使用带有 - 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 版或更高版本。
应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
- 
    设置要应用 Terraform 配置的默认 Google Cloud 项目。 您只需为每个项目运行一次以下命令,即可在任何目录中运行它。 export GOOGLE_CLOUD_PROJECT=PROJECT_ID 如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。 
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
- 
    在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf扩展名,例如main.tf。在本教程中,该文件称为main.tf。mkdir DIRECTORY && cd DIRECTORY && touch main.tf 
- 
    如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。 将示例代码复制到新创建的 main.tf中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。 
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
- 
    初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade选项:terraform init -upgrade 
应用更改
- 
    查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:terraform plan 根据需要更正配置。 
- 
    通过运行以下命令并在提示符处输入 yes来应用 Terraform 配置:terraform apply 等待 Terraform 显示“应用完成!”消息。 
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用防删除保护,请在 Terraform 配置文件中将 deletion_protection参数设置为false。deletion_protection = "false" 
- 运行以下命令并在提示符处输入 yes,以应用更新后的 Terraform 配置:terraform apply 
- 
             通过运行以下命令并在提示符处输入 yes,移除之前使用 Terraform 配置应用的资源:terraform destroy 
在您发出就地升级请求时,Cloud SQL 首先会执行升级前检查。如果 Cloud SQL 确定实例未准备好进行升级,则升级请求会失败,并显示一条消息来建议您如何解决问题。另请参阅排查主要版本升级问题。
自动升级备份
执行主要版本升级时,Cloud SQL 会自动进行两个按需备份,称为升级备份:
- 第一个升级备份是升级前备份,它在开始升级之前立即进行。您可以使用此备份将数据库实例恢复为先前版本的状态。
- 第二个升级备份是升级后备份,该备份在允许对升级后的数据库实例执行新写入后立即创建。
查看备份列表时,系统会列出类型为 On-demand 的升级备份。升级备份会带有标签,以便您快速识别。例如,如果您要从 SQL Server Enterprise 2017 升级到 SQL Server Enterprise 2019 或 SQL Server Enterprise 2022,则升级前备份标记为 Pre-upgrade backup, SQLSERVER_2017_ENTERPRISE to SQLSERVER_2019_ENTERPRISE or SQLSERVER_2022_ENTERPRISE.,升级后备份标记为 Post-upgrade backup, SQLSERVER_2019_ENTERPRISE or SQLSERVER_2022_ENTERPRISE from SQLSERVER_2017_ENTERPRISE.
与其他按需备份一样,升级备份会一直保留,直到您删除它们或删除实例。
升级数据库兼容性级别
数据库兼容性级别决定了数据库相对于其所提供应用的行为。数据库兼容性级别设置可确保与早期版本的 SQL Server 的向后兼容性,并与 Transact-SQL 和 Query Optimizer 更改相关。当 SQL Server 实例的数据库版本升级时,系统会保留现有数据库的兼容性级别,以便应用可以在较新版本的 SQL Server 上继续运行。升级兼容性级别可帮助您受益于新功能、查询处理改进和其他更改。
升级实例的数据库引擎版本后,当数据库提供的应用准备就绪后,请升级实例中每个数据库的数据库兼容性级别。当兼容性级别设置为最新时,数据库将使用最新功能并提升性能。
如需升级数据库兼容性级别,请执行以下步骤:
- 确定数据库的当前兼容性级别。 - 例如,对于 SQL Server 2017,默认兼容性级别为 140。如需检查数据库的当前兼容性级别,请在将 - DATABASE_NAME- 替换为 SQL Server 实例上的数据库的名称后,在 Transact-SQL 中运行以下命令。 - USE DATABASE_NAME GO SELECT compatibility_level FROM sys.databases WHERE name = 'DATABASE_NAME' 
- 确定目标兼容性级别。 - 确定升级的数据库版本的默认兼容性级别,以确定数据库的目标兼容性级别。例如,对于 SQL Server 2022,默认兼容性级别为 160。请参阅具有兼容性级别的新版 SQL Server 的表映射。 
- 评估当前和目标兼容性级别之间的差异。 - 在升级兼容性级别之前,请研究当前兼容性级别与目标兼容性级别在系统行为上的差异。请参阅兼容性级别差异的完整列表。 
- 收集工作负载数据的基准。 - 在升级兼容性级别之前,请使用 SQL Server 查询存储区收集工作负载数据的基准,以便稍后识别并解决回归查询。您可以使用查询存储区来捕获典型业务周期的查询和计划,以建立性能基准。对于指导的工作流,请使用 SQL Server Management Studio 中的查询微调助理功能。 
- 升级兼容性级别。 - 如需更改数据库的兼容性级别,请在将 - DATABASE_NAME- 替换为 SQL Server 实例上的数据库名称并将 - TARGET_COMPATIBILITY_LEVEL替换为目标兼容性级别后,在 Transact-SQL 中运行以下命令。- ALTER DATABASE DATABASE_NAME SET COMPATIBILITY_LEVEL = TARGET_COMPATIBILITY_LEVEL; GO 
- 收集升级后的工作负载数据。 - 使用查询存储区收集升级后的工作负载数据以进行比较和回归检测。 
- 解决回归查询。 - 在大多数情况下,查询优化器在升级的兼容性级别都会提升性能。但是,某些查询可能会不时的性能下降。查询存储区的回归查询功能可帮助您识别已回归的查询,并强制执行最后一个已知良好查询计划。SQL Server 还提供自动计划更正功能,以便在查询回归时自动切换到上一个已知良好计划。 
完成主要版本升级
升级主实例后,执行验收测试以确保升级后的系统按预期运行。
排查主要版本升级问题
如果您尝试执行无效的升级命令(例如,如果实例包含新版本的无效数据库标志),则 Cloud SQL 会返回错误消息。
如果升级请求失败,请检查升级请求的语法。如果请求的结构有效,请尝试查看以下建议。
查看错误日志
如果有效升级请求出现任何问题,Cloud SQL 会将错误日志发布到 projects/PROJECT_ID/logs/cloudsql.googleapis.com%2Fsqlserver.err。每个日志条目都包含标签,用于标识实例标识符,以帮助您识别升级错误的实例。 请查找此类升级错误并加以解决。
如需查看错误日志,请使用 Google Cloud控制台:
- 
在 Google Cloud 控制台中,前往 Cloud SQL 实例页面。 
- 如需打开实例的概览页面,请点击实例名称。
- 在实例的概览页面的操作和日志窗格中,点击查看 SQL Server 错误日志链接。 - 日志浏览器页面随即会打开。 
- 按以下方式查看日志: - 如需列出项目中的所有错误日志,请在日志名称日志过滤条件中选择日志名称。
 - 如需详细了解查询过滤条件,请参阅高级查询。 - 如需过滤单个实例的升级错误日志,请在搜索所有字段框中输入以下查询,将 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 恢复实例来执行此操作,该实例是运行升级前版本的新实例。
如需将主实例恢复到先前版本,请执行以下步骤:
- 确定升级前备份。 - 请参阅自动升级备份。 
- 创建恢复实例。 - 使用升级前备份时 Cloud SQL 运行的主要版本创建新的 Cloud SQL 实例。设置与原始实例相同的标志和实例设置。 
- 恢复升级前备份。 - 将升级前备份恢复到恢复实例。此命令可能需要几分钟才能完成。 
- 添加读取副本。 - 如果您使用的是读取副本,请单独添加读取副本。 
- 连接您的应用。 - 恢复数据库系统后,使用有关恢复实例及其读取副本的详细信息来更新应用。您可以继续在数据库的升级前版本上处理流量。 
限制
本部分列出了就地主要版本升级的限制。
- 您不能对外部副本执行主要版本就地升级。
常见问题解答
升级数据库主要版本时,可能会出现以下问题。
- 可以。在 Cloud SQL 执行升级期间,您的实例在一段时间内不可用。
- 升级需要多长时间?
- 升级单个实例通常不到 10 分钟。 如果您的实例配置具有少量 vCPU 或内存,则升级可能需要更多时间。 - 如果您的实例托管过多数据库或表,或者您的数据库非常大,则升级可能需要几个小时,甚至超时,因为升级总时间与数据库中的对象数量相对应。如果您有多个实例需要升级,那么升级时间会按比例增加。 
- 我可以监控升级过程的每个步骤吗?
- Cloud SQL 可让您监控升级操作是否仍在进行中,但您无法跟踪每次升级中的各个步骤。
- 升级后是否可以取消?
- 不可以,升级一旦开始就无法取消。如果升级失败,Cloud SQL 会自动恢复您在先前版本上的实例。
- 升级期间,我的设置会发生什么情况?
- 执行主要版本就地升级时,Cloud SQL 会保留您的数据库设置,包括实例名称、IP 地址、明确配置的标志值和用户数据。但是,系统变量的默认值可能会更改。 - 如需了解详情,请参阅配置数据库标志。如果目标版本中不再支持特定标志或值,则 Cloud SQL 会在升级期间自动移除该标志。