ALTER DATABASE (Transact-SQL) 数据库镜像
适用范围:SQL Server
注意
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 Always On 可用性组。
控制数据库的数据库镜像。 使用数据库镜像选项指定的值适用于数据库的副本以及整个数据库镜像会话。 每个 ALTER DATABASE 语句只允许使用一个 <database_mirroring_option>。
注意
我们建议在非高峰时段配置数据库镜像,因为此配置会影响性能。
有关 ALTER DATABASE 选项,请参阅 ALTER DATABASE。 有关 ALTER DATABASE SET 选项,请参阅 ALTER DATABASE SET 选项。
语法
ALTER DATABASE database_name
SET { <partner_option> | <witness_option> }
<partner_option> ::=
PARTNER { = 'partner_server'
| FAILOVER
| FORCE_SERVICE_ALLOW_DATA_LOSS
| OFF
| RESUME
| SAFETY { FULL | OFF }
| SUSPEND
| TIMEOUT integer
}
<witness_option> ::=
WITNESS { = 'witness_server'
| OFF
}
参数
重要
SET PARTNER 或 SET WITNESS 命令在输入时可以成功完成,但随后失败。
注意
ALTER DATABASE 数据库镜像选项对于包含数据库不可用。
database_name 要修改的数据库的名称。
PARTNER <partner_option> 控制用于定义数据库镜像会话的故障转移伙伴及其行为的数据库属性。 有些 SET PARTNER 选项可对任一伙伴进行设置;而其他选项则仅限于对主体服务器或镜像服务器进行设置。 有关详细信息,请参阅下文所述的各个 PARTNER 选项。 无论在哪个伙伴上指定 SET PARTNER 子句,该子句都会影响数据库的两个副本。
若要执行 SET PARTNER 语句,必须将两个合作伙伴的端点的 STATE 都设置为 STARTED。 另请注意,必须将每个伙伴服务器实例的数据库镜像端点的 ROLE 设置为 PARTNER 或 ALL。 有关如何指定终结点的信息,请参阅为 Windows 身份验证创建数据库镜像终结点。 若要了解服务器实例的数据库镜像端点的角色和状态,请使用以下 Transact-SQL 语句:
SELECT role_desc, state_desc FROM sys.database_mirroring_endpoints
<partner_option> ::=
注意
每个 SET PARTNER 子句只允许使用一个 <partner_option>。
“partner_server”指定 SQL Server 实例的服务器网络地址,以充当新数据库镜像会话中的故障转移伙伴。 每个会话需要两个伙伴:一个作为主体服务器启动,另一个作为镜像服务器启动。 建议这两个伙伴驻留在不同的计算机上。
在每个伙伴上,为每个会话指定一次此选项。 启动数据库镜像会话需要两个 ALTER DATABASE database SET PARTNER ='partner_server' 语句。 这两个语句的顺序非常重要。 首先,连接到镜像服务器,并将主体服务器实例指定为 partner_server (SET PARTNER ='principal_server')。 然后,连接到主体服务器,并将镜像服务器实例指定为 partner_server (SET PARTNER ='mirror_server');此操作会在这两个伙伴之间启动数据库镜像会话。 有关详细信息,请参阅本主题后面的设置数据库镜像。
partner_server 的值为服务器网络地址。 其语法如下所示:
TCP**://<system-address>:**<port>
where
- <system-address> 是一个字符串,例如系统名称、完全限定的域名或 IP 地址,它们明确标识了目标计算机系统。
- <port> 是与伙伴服务器实例的镜像终结点关联的端口号。
有关详细信息,请参阅指定服务器网络地址。
以下示例阐释了 SET PARTNER ='partner_server' 子句:
'TCP://MYSERVER.mydomain.Adventure-Works.com:7777'
重要
如果会话是使用 ALTER DATABASE 语句而不是 SQL Server Management Studio 设置的,则默认情况下该会话将设置为完全事务安全(SAFETY 设置为 FULL),并在无自动故障转移功能的高安全模式下运行。 若要允许自动故障转移,请配置见证服务器;若要在高性能模式下运行,请关闭事务安全性 (SAFETY OFF)。
FAILOVER 手动将故障从主体服务器转移到镜像服务器。 只能在主体服务器上指定 FAILOVER。 此选项仅在 SAFETY 设置为 FULL(默认设置)时有效。
FAILOVER 选项需要以 master 作为数据库上下文。
FORCE_SERVICE_ALLOW_DATA_LOSS 未发生自动故障转移时,在数据库处于不同步状态或处于同步状态的情况下当主体服务器失败后,强制数据库服务转向镜像数据库。
强烈建议仅在主体服务器不再运行时强制运行该服务。 否则,某些客户端可能会继续访问原始主体数据库而不是新的主体数据库。 FORCE_SERVICE_ALLOW_DATA_LOSS 仅在镜像服务器上可用,且下列条件必须全部成立:
- 主体服务器已关闭。
- WITNESS 设置为 OFF,或者将见证服务器连接到镜像服务器。
仅当您愿意为立即还原数据库服务而承担部分数据丢失的风险时,才能强制服务运行。
强制服务会挂起会话,并暂时将所有数据保留在原始的主体数据库中。 一旦原始主体服务器进入服务状态并且能够与新的主体服务器通信时,数据库管理员就可以恢复服务。 如果会话恢复,则所有未发送的日志记录和对应的更新都会丢失。
OFF 删除数据库镜像会话,并从数据库中删除镜像。 可以在任一伙伴上指定 OFF。 有关删除镜像的影响的信息,请参阅删除数据库镜像。
RESUME 恢复挂起的数据库镜像会话。 只能在主体服务器上指定 RESUME。
SAFETY { FULL | OFF } 设置事务安全的级别。 只能在主体服务器上指定 SAFETY。
默认值为 FULL。 使用 Full 安全性的情况下,数据库镜像会话将同步运行(在“高安全模式”下)。 如果将 SAFETY 设置为 OFF,则数据库镜像会话将异步运行(在“高性能模式”下)。
高安全模式的行为部分取决于见证服务器,如下所示:
当安全性设置为 FULL 并且已为该会话设置了见证服务器时,会话将在高安全模式下运行,并且具有自动故障转移功能。 失去主体服务器时,如果数据库被同步并且镜像服务器实例和见证服务器仍然相互连接(即它们有仲裁),则会话将自动进行故障转移。 有关详细信息,请参阅仲裁:见证服务器如何影响数据库可用性 - 数据库镜像。
如果为会话设置了见证服务器,但是当前已断开见证服务器的连接,则镜像服务器的丢失会导致主体服务器出现故障。
当安全性设置为 FULL 并且已将见证服务器设置为 OFF 时,会话将在高安全模式下运行,但没有自动故障转移功能。 如果镜像服务器实例出现故障,则不会影响主体服务器实例。 如果主体服务器实例出现故障,则可以将服务(可能丢失数据)强制转到镜像服务器实例。
如果将 SAFETY 设置为 OFF,则会话将在高性能模式下运行,并且不支持自动故障转移和手动故障转移。 但是,镜像服务器的问题不会影响主体服务器,如果主体服务器实例出现故障,必要时可以将服务(可能丢失数据)强制转到镜像服务器实例(如果 WITNESS 设置为 OFF,或者见证服务器当前与镜像服务器连接)。 有关强制服务的详细信息,请参阅这一部分前面的 "FORCE_SERVICE_ALLOW_DATA_LOSS"。
重要
高性能模式并非旨在使用见证服务器。 但是,我们强烈建议您只要将 SAFETY 设置为 OFF,就应确保也将 WITNESS 设置为 OFF。
SUSPEND 暂停数据库镜像会话。
可以在任一伙伴上指定 SUSPEND。
TIMEOUT integer 以秒为单位指定超时期限。 超时期限是指镜像会话中一个服务器实例在考虑断开另一实例的连接之前,等待接收来自该实例的 PING 消息的最长时间。
只能在主体服务器上指定 TIMEOUT 选项。 如果不指定此选项,则在默认情况下,超时期限为 10 秒。 如果指定 5 或更高,则超时期限将设置为指定的秒数。 如果将超时值指定为 0 到 4 秒之间,则超时期限将自动设置为 5 秒。
重要
我们建议您将超时期限保持为 10 秒或更长。 如果将值设置为低于 10 秒,则可能使高负荷系统丢失 PING 并声明错误故障。
有关详细信息,请参阅 Possible Failures During Database Mirroring。
WITNESS <witness_option> 控制定义数据库镜像见证服务器的数据库属性。 SET WITNESS 子句会影响数据库的两个副本,但只能在主体服务器上指定 SET WITNESS。 如果为会话设置了见证,则无论安全设置如何,都需要仲裁来为数据库提供服务;有关更多信息,请参阅仲裁:见证服务器如何影响数据库可用性 - 数据库镜像。
建议使见证服务器和故障转移伙伴驻留在单独服务器上。 有关见证的信息,请参阅数据库镜像见证服务器。
若要执行 SET WITNESS 语句,必须将主体服务器和见证服务器实例端点的 STATE 都设置为 STARTED。 另请注意,必须将见证服务器实例的数据库镜像端点的 ROLE 设置为 WITNESS 或 ALL。 有关指定终结点的信息,请参阅数据库镜像终结点。
若要了解服务器实例的数据库镜像端点的角色和状态,请使用以下 Transact-SQL 语句:
SELECT role_desc, state_desc FROM sys.database_mirroring_endpoints
注意
不能在见证服务器上设置数据库属性。
<witness_option> ::=
注意
每个 SET WITNESS 子句只允许使用一个 <witness_option>。
“witness_server”指定要充当数据库镜像会话的见证服务器的数据库引擎实例。 只能在主体服务器上指定 SET WITNESS 语句。
在 SET WITNESS ='witness_server' 语句中,witness_server 的语法与 partner_server 的语法相同 。
OFF 从数据库镜像会话中删除见证服务器。 将见证服务器设置为 OFF 会禁用自动故障转移。 如果数据库设置为 FULL SAFETY 并且见证服务器设置为 OFF,则镜像服务器上的故障会导致主体服务器使该数据库不可用。
备注
示例
A. 创建具有见证服务器的数据库镜像会话
设置具有见证服务器的数据库镜像会话需要配置安全性并准备镜像数据库,还需要使用 ALTER DATABASE 设置伙伴。 有关完成设置过程的示例,请参阅设置数据库镜像。
B. 对数据库镜像会话进行手动故障转移
可从任一数据库镜像伙伴启动手动故障转移。 进行故障转移之前,应验证您认为是当前主体服务器的服务器是否确实是主体服务器。 例如,对于 AdventureWorks2022
数据库,请在您认为是当前主体服务器的服务器实例上执行以下查询:
SELECT db.name, m.mirroring_role_desc
FROM sys.database_mirroring m
JOIN sys.databases db
ON db.database_id = m.database_id
WHERE db.name = N'AdventureWorks2022';
GO
如果该服务器实例确实是主体,则 mirroring_role_desc
的值为 Principal
。 如果此服务器实例是镜像服务器,则 SELECT
语句将返回 Mirror
。
下面的示例假定该服务器是当前主体。
将故障手动转移到数据库镜像伙伴:
ALTER DATABASE AdventureWorks2022 SET PARTNER FAILOVER; GO
若要验证新镜像上的故障转移的结果,请执行以下查询:
SELECT db.name, m.mirroring_role_desc FROM sys.database_mirroring m JOIN sys.databases db ON db.database_id = m.database_id WHERE db.name = N'AdventureWorks2022'; GO
现在,mirroring_role_desc
的当前值为 Mirror
。