ALTER DATABASE (Transact-SQL)

修改数据库的某些配置选项。

本文提供所选任何 SQL 产品的语法、参数、注解、权限和示例。

有关语法约定的详细信息,请参阅 Transact-SQL 语法约定

选择一个产品

在下面的行中,选择你感兴趣的产品名称,系统将只显示该产品的信息。

* SQL Server *  

 

概述:SQL Server

在 SQL Server 中,此语句修改一个数据库或与该数据库关联的文件和文件组。 ALTER DATABASE 可在数据库中添加或移除文件和文件组、更改数据库或其文件和文件组的属性、更改数据库排序规则和设置数据库选项。 无法修改数据库快照。 若要修改与复制相关的数据库选项,请使用 sp_replicationdboption

由于 ALTER DATABASE 语法的篇幅较长,因此分为多篇文章。

项目 说明
ALTER DATABASE 本文介绍的是用于更改数据库的名称和排序规则的语法和相关信息。
ALTER DATABASE 文件和文件组选项 介绍了用于从数据库中添加和删除文件和文件组以及更改文件和文件组的属性的语法和相关信息。
ALTER DATABA标准版 标准版T 选项 介绍了使用 ALTER DATABASE 的 SET 选项来更改数据库属性的语法和相关信息。
ALTER DATABASE 数据库镜像 介绍了 ALTER DATABASE 与数据库镜像相关的 SET 选项的语法和相关信息。
ALTER DATABASE SET HADR 提供 ALTER DATABASE 的 Always On 可用性组 选项的语法和相关信息,该语法用来在 AlwaysOn 可用性组的辅助副本上配置辅助数据库。
ALTER DATABA标准版兼容性级别 介绍了 ALTER DATABASE 与数据库兼容级别相关的 SET 选项的语法和相关信息。
ALTER DATABASE SCOPED CONFIGURATION 提供与用于单个数据库级别设置(例如查询优化和查询执行相关行为)的数据库范围配置相关的语法。

语法

-- SQL Server Syntax
ALTER DATABASE { database_name | CURRENT }
{
    MODIFY NAME = new_database_name
  | COLLATE collation_name
  | <file_and_filegroup_options>
  | SET <option_spec> [ ,...n ] [ WITH <termination> ]
}
[;]

<file_and_filegroup_options>::=
  <add_or_modify_files>::=
  <filespec>::=
  <add_or_modify_filegroups>::=
  <filegroup_updatability_option>::=

<option_spec>::=
{
  | <auto_option>
  | <change_tracking_option>
  | <cursor_option>
  | <database_mirroring_option>
  | <date_correlation_optimization_option>
  | <db_encryption_option>
  | <db_state_option>
  | <db_update_option>
  | <db_user_access_option>
  | <delayed_durability_option>
  | <external_access_option>
  | <FILESTREAM_options>
  | <HADR_options>
  | <parameterization_option>
  | <query_store_options>
  | <recovery_option>
  | <service_broker_option>
  | <snapshot_option>
  | <sql_option>
  | <termination>
  | <temporal_history_retention>
  | <data_retention_policy>
  | <compatibility_level>
      { 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 }
}

参数

database_name

要修改的数据库的名称。

注意

此选项在包含数据库中不可用。

CURRENT
适用于:SQL Server 2012 (11.x) 及更高版本。

指定应更改当前使用的数据库。

MODIFY NAME = new_database_name

使用指定的名称 new_database_name 重命名数据库

COLLATE collation_name

指定数据库的排序规则。 collation_name 既可以是 Windows 排序规则名称,也可以是 SQL 排序规则名称。 如果不指定排序规则,则将 SQL Server 实例的排序规则指定为数据库的排序规则。

注意

在Azure SQL 数据库上创建数据库后,无法更改排序规则。

在创建使用非默认排序规则的数据库时,数据库中的数据将始终遵循指定的排序规则。 对于 SQL Server,创建包含的数据库时,使用 SQL Server 默认排序规则 Latin1_General_100_CI_AS_WS_KS_SC 来维护内部目录信息。

有关 Windows 和 SQL 排序规则名称的详细信息,请参阅 COLLATE

<delayed_durability_option> ::=

适用于:SQL Server 2014 (12.x) 及更高版本。

有关详细信息,请参阅 ALTER DATABA标准版 标准版T 选项和控制事务持续性

<file_and_filegroup_options>::=

有关详细信息,请参阅 ALTER DATABASE 文件和文件组选项

备注

若要删除数据库,请使用 DROP DATABASE

若要减小数据库的大小,请使用 DBCC SHRINKDATABASE

ALTER DATABASE 语句必须以自动提交模式(默认事务管理模式)运行,并且不允许在显式或隐式事务中运行。

对数据库文件状态(例如,联机或脱机)的维护是独立于数据库状态的。 有关详细信息,请参阅文件状态。 文件组中文件的状态决定整个文件组的可用性。 文件组中的所有文件都必须联机,文件组才可用。 如果文件组处于脱机状态,则 SQL 语句访问文件组的任何尝试都失败,并出现错误。 在为 SELECT 语句生成查询计划时,查询优化器会避免驻留在脱机文件组中的非聚集索引和索引视图。 这样,这些语句就会成功。 但是,如果脱机文件组包含目标表的堆或聚集索引,SELECT 语句将失败。 此外,修改脱机文件组中任何索引的表的任何INSERTUPDATEDELETE语句都失败。

当数据库处于 RESTORING 状态时,大多数 ALTER DATABASE 语句都会失败。 设置数据库镜像选项除外。 在活动还原操作期间或数据库或日志文件的还原操作因备份文件损坏而失败时,数据库可能处于 RESTOREING 状态。

通过设置以下选项之一来清除 SQL Server 实例的计划缓存。

  • COLLATE
  • MODIFY FILEGROUP DEFAULT
  • MODIFY FILEGROUP READ_ONLY
  • MODIFY FILEGROUP READ_WRITE
  • MODIFY_NAME
  • OFFLINE
  • ONLINE
  • PAGE_VERIFY
  • READ_ONLY
  • READ_WRITE

清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。 对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to some database maintenance or reconfigure operations。 每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。

在下列情况下,也会刷新计划缓存:

  • 数据库的 AUTO_CLOSE 数据库选项设置为 ON。 在没有用户连接引用或使用该数据库时,后台任务将尝试关闭并自动关闭数据库。
  • 针对具有默认选项的数据库运行多个查询。 然后,删除数据库。
  • 删除源数据库的数据库快照。
  • 您已成功重新生成数据库的事务日志。
  • 还原数据库备份。
  • 分离数据库。

更改数据库排序规则

在对数据库应用不同排序规则之前,请确保已满足下列条件:

  • 您是当前数据库的唯一用户。
  • 没有依赖数据库排序规则的架构绑定对象。

如果数据库中存在以下依赖于数据库排序规则的对象,则 ALTER DATABASE database_name COLLATE 语句将失败。 SQL Server 返回阻止 ALTER 操作的每个对象的错误消息:

  • 通过 SCHEMABINDING 创建的用户定义函数和视图
  • 计算列
  • CHECK 约束
  • 表值函数返回包含字符列的表,这些列继承了默认的数据库排序规则

数据库排序规则更改时,非绑定到架构的实体的依赖关系信息将自动更新。

改变数据库的排序规则不会在任何数据对象的系统名称中产生重复名称。 如果更改的排序规则导致重复的名称,则以下命名空间可能会导致数据库排序规则更改失败:

  • 对象名,如过程、表、触发器或视图
  • 架构名称
  • 主体,例如组、角色或用户
  • 标量类型名,如系统和用户定义类型
  • 全文目录名称
  • 对象内的列名或参数名
  • 表范围内的索引名

新排序规则生成的重复名称会导致更改操作失败,SQL Server 返回一条错误消息,指定找到重复项的命名空间。

查看数据库信息

可以使用目录视图、系统函数和系统存储过程返回有关数据库、文件和文件组的信息。

权限

需要对数据库拥有 ALTER 权限。

示例

A. 更改数据库名称

以下示例将 AdventureWorks2022 数据库的名称更改为 Northwind

USE master;
GO
ALTER DATABASE AdventureWorks2022
Modify Name = Northwind ;
GO

B. 更改数据库的排序规则

以下示例创建了一个名为 testdb、排序规则为 SQL_Latin1_General_CP1_CI_AS 的数据库,然后将 testdb 数据库的排序规则更改为 COLLATE French_CI_AI

适用于:SQL Server 2008 (10.0.x) 及更高版本。

USE master;
GO

CREATE DATABASE testdb
COLLATE SQL_Latin1_General_CP1_CI_AS ;
GO

ALTER DATABASE testDB
COLLATE French_CI_AI ;
GO

* SQL 数据库 *  

 

概述:SQL 数据库

在 Azure SQL 数据库中,使用此语句来修改数据库。 使用此语句更改数据库的名称、更改数据库的版本和服务目标、将数据库加入到弹性池或将其从弹性池中删除、设置数据库选项、添加或删除数据库作为异地复制关系中的辅助,以及设置数据库兼容级别。

由于 ALTER DATABASE 语法的篇幅较长,因此分为多篇文章。

ALTER DATABASE
当前文章介绍了用于更改数据库名称和其他设置的语法和相关信息。

ALTER DATABASE SET 选项
介绍了使用 ALTER DATABASE 的 SET 选项来更改数据库属性的语法和相关信息。

ALTER DATABASE 兼容级别
介绍了 ALTER DATABASE 与数据库兼容级别相关的 SET 选项的语法和相关信息。

语法

-- Azure SQL Database Syntax
ALTER DATABASE { database_name | CURRENT }
{
    MODIFY NAME = new_database_name
  | MODIFY ( <edition_options> [, ... n] )
  | MODIFY BACKUP_STORAGE_REDUNDANCY = { 'LOCAL' | 'ZONE' | 'GEO' }
  | SET { <option_spec> [ ,... n ] WITH <termination>}
  | ADD SECONDARY ON SERVER <partner_server_name>
    [WITH ( <add-secondary-option>::=[, ... n] ) ]
  | REMOVE SECONDARY ON SERVER <partner_server_name>
  | FAILOVER
  | FORCE_FAILOVER_ALLOW_DATA_LOSS
}
[;]

<edition_options> ::=
{

  MAXSIZE = { 100 MB | 250 MB | 500 MB | 1 ... 1024 ... 4096 GB }
  | EDITION = { 'Basic' | 'Standard' | 'Premium' | 'GeneralPurpose' | 'BusinessCritical' | 'Hyperscale'}
  | SERVICE_OBJECTIVE =
       { <service-objective>
       | { ELASTIC_POOL (name = <elastic_pool_name>) }
       }
}

<add-secondary-option> ::=
   {
      ALLOW_CONNECTIONS = { ALL | NO }
     | BACKUP_STORAGE_REDUNDANCY = { 'LOCAL' | 'ZONE' | 'GEO' }
     | SERVICE_OBJECTIVE =
       { <service-objective>
       | { ELASTIC_POOL ( name = <elastic_pool_name>) }
       | DATABASE_NAME = <target_database_name>
       | SECONDARY_TYPE = { GEO | NAMED }
       }
   }

<service-objective> ::={ 'Basic' |'S0' | 'S1' | 'S2' | 'S3'| 'S4'| 'S6'| 'S7'| 'S9'| 'S12'
      | 'P1' | 'P2' | 'P4'| 'P6' | 'P11' | 'P15'
      | 'BC_DC_n'
      | 'BC_Gen5_n' 
      | 'BC_M_n' 
      | 'GP_DC_n'
      | 'GP_Fsv2_n' 
      | 'GP_Gen5_n' 
      | 'GP_S_Gen5_n' 
      | 'HS_DC_n'
      | 'HS_Gen5_n'
      | 'HS_MOPRMS_n' 
      | 'HS_PRMS_n' 
      | { ELASTIC_POOL(name = <elastic_pool_name>) }
      }

<option_spec> ::=
{
    <auto_option>
  | <change_tracking_option>
  | <cursor_option>
  | <db_encryption_option>
  | <db_update_option>
  | <db_user_access_option>
  | <delayed_durability_option>
  | <parameterization_option>
  | <query_store_options>
  | <snapshot_option>
  | <sql_option>
  | <target_recovery_time_option>
  | <termination>
  | <temporal_history_retention>
  | <compatibility_level>
    { 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 }

}

参数

database_name

要修改的数据库的名称。

CURRENT
指定应更改当前使用的数据库。

MODIFY NAME = new_database_name

使用指定的名称 new_database_name 重命名数据库。 以下示例将 db1 数据库的名称更改为 db2

ALTER DATABASE db1
    MODIFY Name = db2 ;

MODIFY (EDITION = ['Basic' | 'Standard' | 'Premium' |'GeneralPurpose' | 'BusinessCritical' | 'Hyperscale'])

更改数据库的服务层。

以下示例将版本更改为 Premium

ALTER DATABASE current
    MODIFY (EDITION = 'Premium');

重要

如果数据库的 MAXSIZE 属性设置为该版本支持的有效范围之外的值,则 EDITION 更改会失败。

MODIFY (BACKUP_STORAGE_REDUNDANCY = ['LOCAL' | 'ZONE' | 'GEO'])

更改数据库的时间点还原备份和长期保留备份(若已配置)的存储冗余。 所做的更改将应用于将来进行的所有备份。 现有备份继续使用以前的设置。

若要在使用 T-SQL 创建数据库时强制实施数据驻留,请使用 LOCALZONE 作为 BACKUP_STORAGE_REDUNDANCY 参数的输入。

MODIFY (MAXSIZE = [100 MB | 500 MB | 1 | 1024...4096] GB)

指定数据库的最大大小。 该最大大小必须符合针对数据库的 EDITION 属性的有效值集。 更改数据库的最大大小可能会导致数据库 EDITION 发生更改。

注意

MAXSIZE 参数不适用于超大规模服务层中的单一数据库。 超大规模服务层数据库根据需要而增长,最大 100 TB。 SQL 数据库服务会自动添加存储空间,而无需设置最大大小。

DTU 模型

MAXSIZE 基本 S0-S2 S3-S12 P1-P6 P11-P15
100 MB
250 MB
500 MB
1GB
2 GB 是(D)
5 GB 空值
10 GB 空值
20 GB 空值
30 GB 空值
40 GB 空值
50 GB 空值
100 GB 空值
150 GB 空值
200 GB 空值
250 GB 空值 是(D) 是(D)
300 GB 空值
400 GB 空值
500 GB 空值 是(D)
750 GB 空值
1024 GB 空值 是(D)
从 1024 GB 到 4096 GB,增量为 256 GB 1 空值 不可用 不可用 空值

1 P11 和 P15 允许 MAXSIZE 最大为 4 TB,1024 GB 是默认大小。 P11 和 P15 可以使用最大 4 TB 的内含存储,且无需额外费用。 在高级层中,目前在以下区域提供大于 1 TB 的 MAXSIZE:美国东部 2、美国西部、US Gov 弗吉尼亚州、西欧、德国中部、东南亚、日本东部、澳大利亚东部、加拿大中部和加拿大东部。 有关 DTU 模型资源限制的更多详细信息,请参阅 DTU 资源限制

DTU 模型的 MAXSIZE 值(如果指定)必须为之前的表中所示的指定服务层的有效值。

有关 vCore 购买模型中的最大数据大小和 tempdb 大小等限制,请参阅有关单一数据库的资源限制弹性池的资源限制的文章。

如果使用 vCore 模型时未设置 MAXSIZE 值,则默认为 32 GB。 有关 vCore 模型资源限制的更多详细信息,请参阅 vCore 资源限制

以下规则适用于 MAXSIZE 和 EDITION 参数:

  • 如果指定 EDITION 但未指定 MAXSIZE,则使用版本的默认值。 例如,EDITION 设置为“标准”,并且未指定 MAXSIZE,则 MAXSIZE 会自动设置为 250 MB。
  • 如果 MAXSIZE 和 EDITION 均未指定,EDITION 设置为“常规用途”,MAXSIZE 设置为“32GB”。

MODIFY (SERVICE_OBJECTIVE = <service-objective>)

指定计算大小和服务目标。

SERVICE_OBJECTIVE

指定计算大小(也称为服务级别目标或 SLO)。

  • 对于 DTU 购买模型:S0S1S2S3S4S6S7S9S12P1P2P4P6P11P15。 请参阅 DTU 单一数据库的资源限制DTU 弹性池的资源限制,以查找分配给每个计算大小的 DTU 数。
  • 对于 vCore 购买模型,请选择层级并从预设的值列表中提供 vCore 数量,其中 vCore 的数量为 n。 请参阅 vCore 单一数据库的资源限制vCore 弹性池的资源限制
    • 例如:
    • GP_Gen5_8 适用于常规用途标准系列 (Gen5) 计算,8 个 vCore。
    • GP_S_Gen5_8 用于常规用途无服务器标准系列 (Gen5) 计算,8 个 vCore。
    • HS_Gen5_8 用于超大规模 - 预配的计算 - 标准系列 (Gen5),8 个 vCore。

例如,以下示例将 DTU 购买模型中高级层数据库的服务目标更改为 P6

ALTER DATABASE <database_name>
    MODIFY (SERVICE_OBJECTIVE = 'P6');

例如,以下示例将 vCore 购买模型中预配计算数据库的服务目标更改为 GP_Gen5_8

ALTER DATABASE <database_name>
    MODIFY (SERVICE_OBJECTIVE = 'GP_Gen5_8');

Database_Name

仅用于 Azure SQL 数据库超大规模。 将要创建的数据库名称。 仅在 SECONDARY_TYPE = NAMED 的情况下供命名的 Azure SQL 数据库超大规模副本使用。 有关详细信息,请参阅“超大规模辅助副本 (replica)”。

SECONDARY_TYPE

仅用于 Azure SQL 数据库超大规模。 “GEO”指定异地副本,“NAMED”指定命名的副本。 默认值为“GEO”。 有关详细信息,请参阅“超大规模辅助副本 (replica)”。

有关服务目标说明以及有关大小、版本和服务目标组合的详细信息,请参阅比较基于 vCore 和基于 DTU 的Azure SQL 数据库DTU 资源限制vCore 资源限制的购买模型。 删除了对 PRS 服务目标的支持。

如果未指定标准版RVICE_OBJECTIVE,则会在与主数据库相同的服务级别创建辅助数据库。 指定了 SERVICE_OBJECTIVE 时,会在指定级别上创建辅助数据库。 指定的 SERVICE_OBJECTIVE 必须处于与源相同的版本中。 例如,如果版本是高级版本,则无法指定 S0。

MODIFY (SERVICE_OBJECTIVE = ELASTIC_POOL (name = <elastic_pool_name>)

若要向弹性池中添加现有数据库,请将数据库的 SERVICE_OBJECTIVE 设置为 ELASTIC_POOL,并提供弹性池的名称。 还可以使用此选项将数据库更改为相同服务器中的不同弹性池。 有关详细信息,请参阅弹性池有助于管理和缩放Azure SQL 数据库中的多个数据库。 若要从弹性池中删除数据库,请使用 ALTER DATABASE 将 SERVICE_OBJECTIVE 设置为单个数据库计算大小(服务目标)。

注意

“超大规模”服务层级中的数据库无法添加到弹性池。

ADD SECONDARY ON SERVER <partner_server_name>

在伙伴服务器上创建具有相同名称的异地复制辅助数据库(使本地数据库进入异地复制主数据库),并开始将数据从主数据库异步复制到新的辅助数据库。 如果辅助数据库上已存在同名的数据库,则命令会失败。 对托管成为主数据库的本地数据库的服务器上的 master 数据库执行此命令。

重要

默认使用与主数据库或源数据库相同的备份存储冗余创建辅助数据库。 不支持通过 T-SQL 更改备份存储冗余。创建辅助数据库时不支持更改备份存储冗余。

WITH ALLOW_CONNECTIONS { ALL | NO }

如果未指定ALLOW_CONNECTIONS,则默认将其设置为 ALL。 如果它设置为 ALL,则是允许拥有适当权限的所有登录名进行连接的只读数据库。

ELASTIC_POOL (name = <elastic_pool_name>)

如果未指定ELASTIC_POOL,则不会在弹性池中创建辅助数据库。 指定了 ELASTIC_POOL 时,会在指定池中创建辅助数据库。

重要

执行 ADD SECONDARY 命令的用户必须是主服务器上的 DBManager,在本地数据库中拥有 db_owner 成员身份,以及是辅助服务器上的 DBManager。 必须将客户端 IP 地址添加到主服务器和辅助服务器的防火墙规则下的允许列表中。 如果存在不同的客户端 IP 地址,则还必须将已在主服务器上添加的完全相同的客户端 IP 地址添加到辅助服务器。 这是在运行 ADD SECONDARY 命令以启动异地复制之前需要执行的步骤。

REMOVE SECONDARY ON SERVER <partner_server_name>

删除指定服务器上的指定异地复制辅助数据库。 对托管主数据库的服务器上的 master 数据库执行此命令。

重要

执行 REMOVE SECONDARY 命令的用户必须是主服务器上的 DBManager。

FAILOVER

将异地复制合作关系中对其执行命令的辅助数据库提升为主数据库,并将当前主数据库降级为新的辅助数据库。 作为此过程的一部分,异地复制模式会暂时从异步模式切换为同步模式。 在故障转移过程中:

  1. 主数据库停止接收新事务。
  2. 所有未完成的事务都刷新到辅助数据库。
  3. 辅助数据库成为主数据库,并开始与旧的主数据库(即新的辅助数据库)进行异步异地复制。

此顺序可确保不会丢失任何数据。 切换角色期间两个数据库都不可用的时间段大约为 0-25 秒。 总操作所需时间不应超过大约一分钟。 如果发出此命令时主数据库不可用,该命令将失败,并显示一条错误消息,指示主数据库不可用。 如果故障转移过程未完成,并且显示为停滞,则可以使用强制故障转移命令并接受数据丢失 — 随后,如果需要恢复丢失的数据,请调用 devops (CSS) 以恢复丢失的数据。

重要

执行 FAILOVER 命令的用户必须是主服务器和辅助服务器上的 DBManager。

FORCE_FAILOVER_ALLOW_DATA_LOSS

将异地复制合作关系中对其执行命令的辅助数据库提升为主数据库,并将当前主数据库降级为新的辅助数据库。 仅当当前主数据库不再可用时,才使用此命令。 它仅在还原可用性十分关键,并且可接受丢失一些数据时用于进行灾难恢复。

在强制故障转移过程中:

  1. 指定的辅助数据库立即成为主数据库,并开始接受新事务。
  2. 当原始的主数据库可以与新的主数据库重新连接时,在原始的主数据库上创建增量分布,并且原始的主数据库成为新的辅助数据库。
  3. 若要从旧的主数据库上的此增量备份恢复数据,用户可利用 devops/CSS。
  4. 如果存在其他辅助数据库,则它们会自动重新配置以成为新的主数据库的辅助数据库。 此过程是异步的,在此过程完成之前可能会有延迟。 在重新配置之前,辅助数据库会继续是旧的主数据库的辅助数据库。

重要

执行 FORCE_FAILOVER_ALLOW_DATA_LOSS 命令的用户必须属于主服务器和辅助服务器上的 dbmanager 角色。

备注

若要删除数据库,请使用 DROP DATABASE。 若要减小数据库的大小,请使用 DBCC SHRINKDATABASE

ALTER DATABASE 语句必须以自动提交模式(默认事务管理模式)运行,并且不允许在显式或隐式事务中运行。

清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。 对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to some database maintenance or reconfigure operations。 每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。

在下列情况下,也会刷新过程缓存:针对具有默认选项的数据库运行多个查询。 然后,删除数据库。

查看数据库信息

可以使用目录视图、系统函数和系统存储过程返回有关数据库、文件和文件组的信息。

权限

若要更改数据库,登录名必须是服务器管理员登录名(在预配Azure SQL 数据库逻辑服务器时创建)、服务器的 Microsoft Entra 管理员、dbmanager 数据库角色的成员master、当前数据库中db_owner数据库角色的成员或dbo数据库的成员。 Microsoft Entra ID 为 (以前为 Azure Active Directory)。

要通过 T-SQL 缩放数据库,需要 ALTER DATABASE 权限。 若要通过 Azure 门户、PowerShell、Azure CLI 或 REST API 缩放数据库,需要 Azure RBAC 权限,特别是参与者、SQL DB 参与者角色或 SQL Server 参与者 Azure RBAC 角色。 有关详细信息,请访问 Azure 内置角色

示例

A. 检查版本选项并更改它们

设置数据库 db1 的版本和最大大小:

SELECT Edition = DATABASEPROPERTYEX('db1', 'EDITION'),
        ServiceObjective = DATABASEPROPERTYEX('db1', 'ServiceObjective'),
        MaxSizeInBytes =  DATABASEPROPERTYEX('db1', 'MaxSizeInBytes');

ALTER DATABASE [db1] MODIFY (EDITION = 'Premium', MAXSIZE = 1024 GB, SERVICE_OBJECTIVE = 'P15');

B. 将数据库移动到不同的弹性池

将现有数据库移动到名为 pool1 的池中:

ALTER DATABASE db1
MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = pool1 ) ) ;

C. 添加异地复制辅助数据库

在服务器 secondaryserver 上创建本地服务器上的 db1 的可读服务数据库 db1

ALTER DATABASE db1
ADD SECONDARY ON SERVER secondaryserver
WITH ( ALLOW_CONNECTIONS = ALL )

D. 删除异地复制辅助数据库

删除服务器 secondaryserver 上的辅助数据库 db1

ALTER DATABASE db1
REMOVE SECONDARY ON SERVER testsecondaryserver

E. 故障转移到异地复制辅助数据库

在服务器 secondaryserver 上执行时,将服务器 secondaryserver 上的辅助数据库 db1 提升为新的主数据库。

ALTER DATABASE db1 FAILOVER

F. 强制故障转移到异地复制辅助数据库会造成丢失数据

当主服务器不可用时,强制使服务器 secondaryserver 上的辅助数据库 db1 在服务器 secondaryserver 上执行时成为新的主数据库。 此选项可能会导致数据丢失。

ALTER DATABASE db1 FORCE_FAILOVER_ALLOW_DATA_LOSS

G. 将单一数据库更新为服务层 S0(标准版、性能级别为 0)

将单个数据库更新为标准版(服务层),其计算大小(服务目标)为 S0,最大大小为 250 GB。

ALTER DATABASE [db1] MODIFY (EDITION = 'Standard', MAXSIZE = 250 GB, SERVICE_OBJECTIVE = 'S0');

H. 更新数据库的备份存储冗余

将数据库的备份存储冗余更新为区域冗余。 此数据库的所有将来备份都使用新设置。 包括时间点还原备份和长期保留备份(如果已配置)。

ALTER DATABASE db1 MODIFY BACKUP_STORAGE_REDUNDANCY = 'ZONE'

* SQL 托管实例 *  

 

概述:Azure SQL 托管实例

在 Azure SQL 托管实例 中,使用此语句设置数据库选项。

由于 ALTER DATABASE 语法的篇幅较长,因此分为多篇文章。

项目 说明
ALTER DATABASE
本文提供有关设置文件和文件组选项、设置数据库选项和设置数据库兼容级别的语法和相关信息。
ALTER DATABASE 文件和文件组选项
介绍了用于从数据库中添加和删除文件和文件组以及更改文件和文件组的属性的语法和相关信息。
ALTER DATABASE SET 选项
介绍了使用 ALTER DATABASE 的 SET 选项来更改数据库属性的语法和相关信息。
ALTER DATABASE 兼容级别
介绍了 ALTER DATABASE 与数据库兼容级别相关的 SET 选项的语法和相关信息。

语法

-- Azure SQL Managed Instance syntax  
ALTER DATABASE { database_name | CURRENT }  
{
    MODIFY NAME = new_database_name
  | COLLATE collation_name
  | <file_and_filegroup_options>  
  | SET <option_spec> [ ,...n ]  
}  
[;]

<file_and_filegroup_options>::=  
  <add_or_modify_files>::=  
  <filespec>::=
  <add_or_modify_filegroups>::=  
  <filegroup_updatability_option>::=  

<option_spec> ::=
{
    <auto_option>
  | <change_tracking_option>
  | <cursor_option>
  | <db_encryption_option>  
  | <db_update_option>
  | <db_user_access_option>
  | <delayed_durability_option>
  | <parameterization_option>
  | <query_store_options>
  | <snapshot_option>
  | <sql_option>
  | <target_recovery_time_option>
  | <temporal_history_retention>
  | <compatibility_level>
      { 160 | 150 | 140 | 130 | 120 | 110 | 100 | 90 }

}  

参数

database_name

要修改的数据库的名称。

CURRENT
指定应更改当前使用的数据库。

备注

  • 若要删除数据库,请使用 DROP DATABASE

  • 若要减小数据库的大小,请使用 DBCC SHRINKDATABASE

  • ALTER DATABASE 语句必须以自动提交模式(默认事务管理模式)运行,并且不允许在显式或隐式事务中运行。

  • 通过设置以下选项之一来清除 Azure SQL 托管实例的计划缓存。

    • COLLATE

    • MODIFY FILEGROUP DEFAULT

    • MODIFY FILEGROUP READ_ONLY

    • MODIFY FILEGROUP READ_WRITE

    • MODIFY NAME

      清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。 对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to some database maintenance or reconfigure operations。 每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。 针对具有默认选项的数据库执行多个查询时,也会刷新计划缓存。 然后,删除数据库。

  • 某些 ALTER DATABASE 语句需要对要执行的数据库使用排他锁。 这就是当另一个活动进程锁定数据库时,它们可能会失败的原因。 这种情况下报告的错误为 Msg 5061, Level 16, State 1, Line 38,并显示消息 ALTER DATABASE failed because a lock could not be placed on database '<database name>'. Try again later。 这通常是暂时性故障,若要解决该问题,请在释放数据库上的所有锁后,重试失败的 ALTER DATABASE 语句。 系统视图 sys.dm_tran_locks 保存有关活动锁的信息。 若要检查数据库中是否存在共享或排他锁,请使用以下查询。

    SELECT
        resource_type, resource_database_id, request_mode, request_type, request_status, request_session_id 
    FROM 
        sys.dm_tran_locks
    WHERE
        resource_database_id = DB_ID('testdb');
    

查看数据库信息

可以使用目录视图、系统函数和系统存储过程返回有关数据库、文件和文件组的信息。

权限

只有服务器级主体登录名(由设置过程创建)或 dbcreator 数据库角色的成员可以更改数据库。

重要

除非数据库是角色的成员 dbcreator ,否则数据库的所有者无法更改数据库。

示例

以下示例显示了如何设置自动优化以及如何在 Azure SQL 托管实例中向数据库添加文件。

ALTER DATABASE WideWorldImporters
  SET AUTOMATIC_TUNING ( FORCE_LAST_GOOD_PLAN = ON);

ALTER DATABASE WideWorldImporters
  ADD FILE (NAME = 'data_17');

* Azure Synapse
Analytics *  

 

概述:Azure Synapse Analytics

在 Azure Synapse 中,ALTER DATABASE 会修改专用 SQL 池的某些配置选项。

由于 ALTER DATABASE 语法的篇幅较长,因此分为多篇文章。

ALTER DATABA标准版 标准版T 选项提供了使用 标准版T 选项ALTER DATABASE更改数据库属性的语法和相关信息。

语法

ALTER DATABASE { database_name | CURRENT }
{
  MODIFY NAME = new_database_name
| MODIFY ( <edition_option> [, ... n] )
| SET <option_spec> [ ,...n ] [ WITH <termination> ]
}
[;]

<edition_option> ::=
      MAXSIZE = {
            250 | 500 | 750 | 1024 | 5120 | 10240 | 20480
          | 30720 | 40960 | 51200 | 61440 | 71680 | 81920
          | 92160 | 102400 | 153600 | 204800 | 245760
      } GB
      | SERVICE_OBJECTIVE = {
            'DW100' | 'DW200' | 'DW300' | 'DW400' | 'DW500'
          | 'DW600' | 'DW1000' | 'DW1200' | 'DW1500' | 'DW2000'
          | 'DW3000' | 'DW6000' | 'DW500c' | 'DW1000c' | 'DW1500c'
          | 'DW2000c' | 'DW2500c' | 'DW3000c' | 'DW5000c' | 'DW6000c'
          | 'DW7500c' | 'DW10000c' | 'DW15000c' | 'DW30000c'
      }

参数

database_name

指定要修改的数据库的名称。

MODIFY NAME = new_database_name

使用指定的名称 new_database_name 重命名数据库

“MODIFY NAME”选项在 Azure Synapse 中存在一些支持限制:

  • 不受 Azure Synapse 无服务器池支持
  • 不受 Azure Synapse 工作区中创建的专用 SQL 池支持
  • 受通过 Azure 门户创建的专用 SQL 池(以前称为 SQL DW)支持(包括具有已连接工作区的专用 SQL 池)

MAXSIZE

默认为 245,760 GB (240 TB)。

适用于: 已针对计算代系 1 进行优化

允许的最大数据库大小。 数据库不能超过 MAXSIZE。

适用于: 已针对计算代系 2 进行优化

数据库中允许的最大行存储数据大小。 存储在行存储表中的数据、列存储索引的增量存储或聚集列存储索引上的非聚集索引不能超出 MAXSIZE。 压缩为列存储格式的数据没有大小限制,并且不受 MAXSIZE 的限制。

SERVICE_OBJECTIVE

指定计算大小(服务目标)。 有关 Azure Synapse 服务目标的详细信息,请参阅数据仓库单位 (DWU)

权限

需要以下权限:

  • 服务器级别主体登录名(由预配进程创建),或者
  • dbmanager 数据库角色的成员。

除非所有者是角色的成员 dbmanager ,否则数据库的所有者无法更改数据库。

注解

当前数据库必须不同于你正在更改的数据库,因此连接到 master 数据库之后必须运行 ALTER。

默认情况下,SQL Analytics 中的COMPATIBILITY_LEVEL设置为 130,无法更改。 有关详细信息,请参阅 ALTER DATABA标准版兼容性级别

注意

COMPATIBILITY_LEVEL 仅适用于预配的资源(池)。

限制

若要运行 ALTER DATABASE,数据库必须处于联机状态,并且不能处于暂停状态。

必须在自动提交模式(默认事务管理模式)下运行 ALTER DATABASE 语句。 此操作在连接设置中进行设置。

ALTER DATABASE 语句不能是用户定义的事务的一部分。

无法更改数据库排序规则。

示例

运行这些示例之前,请确保要更改的数据库不是当前数据库。 当前数据库必须不同于你正在更改的数据库,因此连接到 master 数据库之后必须运行 ALTER。

A. 更改数据库的名称

ALTER DATABASE AdventureWorks2022
MODIFY NAME = Northwind;

B. 更改数据库的最大大小

ALTER DATABASE dw1 MODIFY ( MAXSIZE=10240 GB );

C. 更改计算大小(服务目标)

ALTER DATABASE dw1 MODIFY ( SERVICE_OBJECTIVE= 'DW1200' );

D. 更改最大大小和计算大小(服务目标)

ALTER DATABASE dw1 MODIFY ( MAXSIZE=10240 GB, SERVICE_OBJECTIVE= 'DW1200' );

* Analytics
Platform System (PDW) *
 

 

概述:分析平台系统

在分析平台系统 (PDW) 中,ALTER DATABASE 课修改复制表、分布式表和事务日志的最大数据库大小选项。 使用此语句可在数据库大小增长或收缩时管理数据库的磁盘空间分配。 本文还介绍了与在分析平台系统 (PDW) 中设置数据库选项相关的语法。

语法

-- Analytics Platform System
ALTER DATABASE database_name
    SET ( <set_database_options> | <db_encryption_option> )
[;]

<set_database_options> ::=
{
    AUTOGROW = { ON | OFF }
    | REPLICATED_SIZE = size [GB]
    | DISTRIBUTED_SIZE = size [GB]
    | LOG_SIZE = size [GB]
    | SET AUTO_CREATE_STATISTICS { ON | OFF }
    | SET AUTO_UPDATE_STATISTICS { ON | OFF }
    | SET AUTO_UPDATE_STATISTICS_ASYNC { ON | OFF }
}

<db_encryption_option> ::=
    ENCRYPTION { ON | OFF }

参数

database_name

要修改的数据库的名称。 要在设备上显示数据库列表,请使用 sys.databases

AUTOGROW = { ON | OFF }

更新 AUTOGROW 选项。 当 AUTOGROW 为 ON 时,Analytics Platform System (PDW) 根据需要自动为复制表、分布式表和事务日志增大分配空间,以适应存储需求的增长。 当 AUTOGROW 为 OFF 时,如果复制表、分布式表或事务日志超出最大大小设置,Analytics Platform System (PDW) 会返回一个错误。

REPLICATED_SIZE = size [GB]

指定每个计算节点的新最大 GB 数,以便存储要更改的数据库中的所有复制表。 如果计划使用设备存储空间,则需要将REPLICATED_SIZE乘以设备中的计算节点数。

DISTRIBUTED_SIZE = size [GB]

指定每个数据库的新的最大 GB 数,以便存储要更改的数据库中的所有分布式表。 该大小分布到设备的所有计算节点中。

LOG_SIZE = size [GB]

指定每个数据库的新的最大 GB 数,以便存储要更改的数据库中的所有事务日志。 该大小分布到设备的所有计算节点中。

ENCRYPTION { ON | OFF }

将数据库设置为加密的 (ON) 或未加密的 (OFF)。 只能在 sp_pdw_database_encryption 已设置为 1 时为 Analytics Platform System (PDW) 配置加密。 必须先创建数据库加密密钥,然后才能配置透明数据加密。 有关数据库加密的详细信息,请参阅透明数据加密(TDE)。

SET AUTO_CREATE_STATISTICS { ON | OFF }

在自动创建统计信息选项 AUTO_CREATE_STATISTICS 为 ON 时,查询优化器将根据需要在查询谓词中的单独列上创建统计信息,以便改进查询计划的基数估计。 这些单列统计信息在现有统计信息对象中尚未具有直方图的列上创建。

升级到 AU7 后创建的新数据库的默认值为 ON。 升级前创建的数据库的默认值为 OFF。

有关统计信息的详细信息,请参阅统计信息

SET AUTO_UPDATE_STATISTICS { ON | OFF }

在自动更新统计信息选项 AUTO_UPDATE_STATISTICS 为 ON 时,查询优化器将确定统计信息何时可能过期,然后在查询使用这些统计信息时更新它们。 统计信息将在插入、更新、删除或合并操作更改表或索引视图中的数据分布后过期。 查询优化器通过计算自最后统计信息更新后数据修改的次数并且将这一修改次数与某一阈值进行比较,确定统计信息何时可能过期。 该阈值基于表中或索引视图中的行数。

升级到 AU7 后创建的新数据库的默认值为 ON。 升级前创建的数据库的默认值为 OFF。

有关统计信息的详细信息,请参阅统计信息

SET AUTO_UPDATE_STATISTICS_ASYNC { ON | OFF }

异步统计信息更新选项 AUTO_UPDATE_STATISTICS_ASYNC 将确定查询优化器是使用同步统计信息更新还是异步统计信息更新。 AUTO_UPDATE_STATISTICS_ASYNC 选项适用于为索引创建的统计信息对象、查询谓词中的单列以及使用 CREATE STATISTICS 语句创建的统计信息。

升级到 AU7 后创建的新数据库的默认值为 ON。 升级前创建的数据库的默认值为 OFF。

有关统计信息的详细信息,请参阅统计信息

权限

需要对数据库具有 ALTER 权限。

错误消息

如果“自动统计信息”功能被禁用,而你尝试更改统计信息设置,则 PDW 会输出错误This option isn't supported in PDW。 系统管理员可通过启用功能开关 AutoStatsEnabled 来启用“自动统计信息”功能。

注解

REPLICATED_SIZEDISTRIBUTED_SIZELOG_SIZE 的值可以大于、等于或小于数据库的当前值。

限制

增长和收缩操作是近似的。 所得到的实际大小可能因大小参数而异。

Analytics Platform System (PDW) 不会将 ALTER DATABASE 语句作为原子操作执行。 如果在执行期间中止该语句,将保持已发生的更改。

统计信息设置只有在管理员已启用“自动统计信息”功能时才可工作。管理员可使用功能开关 AutoStatsEnabled 启用或禁用“自动统计信息”功能。

锁定行为

在 DATABASE 对象上采用共享锁。 不能更改其他用户用于读取或写入的数据库。 这包括已在数据库上发出 USE 语句的会话。

性能

收缩数据库可能需要大量时间和系统资源,具体取决于数据库中的实际数据大小和磁盘上的碎片量。 例如,收缩数据库可能需要几个小时或更长时间。

确定加密进度

可使用以下查询来确定数据库透明数据加密进度的百分比:

WITH
database_dek AS (
    SELECT ISNULL(db_map.database_id, dek.database_id) AS database_id,
        dek.encryption_state, dek.percent_complete,
        dek.key_algorithm, dek.key_length, dek.encryptor_thumbprint,
        type
    FROM sys.dm_pdw_nodes_database_encryption_keys AS dek
    INNER JOIN sys.pdw_nodes_pdw_physical_databases AS node_db_map
        ON dek.database_id = node_db_map.database_id
        AND dek.pdw_node_id = node_db_map.pdw_node_id
    LEFT JOIN sys.pdw_database_mappings AS db_map
        ON node_db_map .physical_name = db_map.physical_name
    INNER JOIN sys.dm_pdw_nodes nodes
        ON nodes.pdw_node_id = dek.pdw_node_id
    WHERE dek.encryptor_thumbprint <> 0x
),
dek_percent_complete AS (
    SELECT database_dek.database_id, AVG(database_dek.percent_complete) AS percent_complete
    FROM database_dek
    WHERE type = 'COMPUTE'
    GROUP BY database_dek.database_id
)
SELECT DB_NAME( database_dek.database_id ) AS name,
    database_dek.database_id,
    ISNULL(
       (SELECT TOP 1 dek_encryption_state.encryption_state
        FROM database_dek AS dek_encryption_state
        WHERE dek_encryption_state.database_id = database_dek.database_id
        ORDER BY (CASE encryption_state
            WHEN 3 THEN -1
            ELSE encryption_state
            END) DESC), 0)
        AS encryption_state,
dek_percent_complete.percent_complete,
database_dek.key_algorithm, database_dek.key_length, database_dek.encryptor_thumbprint
FROM database_dek
INNER JOIN dek_percent_complete
    ON dek_percent_complete.database_id = database_dek.database_id
WHERE type = 'CONTROL';

有关演示实现 TDE 的所有步骤的综合示例,请参阅透明数据加密(TDE)。

示例:Analytics Platform System (PDW)

A. 更改 AUTOGROW 设置

将数据库 CustomerSales 的 AUTOGROW 设置为 ON。

ALTER DATABASE CustomerSales
    SET ( AUTOGROW = ON );

B. 更改复制表的最大存储

下面的示例将数据库 CustomerSales 的复制表存储限制设置为 1 GB。 这是每个计算节点的存储限制。

ALTER DATABASE CustomerSales
    SET ( REPLICATED_SIZE = 1 GB );

C. 更改分布式表的最大存储

下面的示例将数据库 CustomerSales 的分布式表存储限制设置为 1000 GB (1 TB)。 这是设备上所有计算节点的组合存储限制,而不是每个计算节点的存储限制。

ALTER DATABASE CustomerSales
    SET ( DISTRIBUTED_SIZE = 1000 GB );

D. 更改事务日志的最大存储

下面的示例更新数据库 CustomerSales使设备的最大 SQL Server 事务日志大小为 10 GB。

ALTER DATABASE CustomerSales
    SET ( LOG_SIZE = 10 GB );

E. 检查当前的统计信息值

以下查询返回所有数据库的当前统计信息值。 值 1 表示功能处于开启状态,而 0 表示功能处于关闭状态。

SELECT NAME,
    is_auto_create_stats_on,
    is_auto_update_stats_on,
    is_auto_update_stats_async_on
FROM sys.databases;

F. 为数据库实现自动创建和自动更新统计信息

使用以下语句可为数据库 CustomerSales 自动且异步地创建和更新统计信息。 这将根据需要创建和更新单列统计信息,从而创建高质量的查询计划。

ALTER DATABASE CustomerSales
    SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE CustomerSales
    SET AUTO_UPDATE_STATISTICS ON;
ALTER DATABASE
    SET AUTO_UPDATE_STATISTICS_ASYNC ON;