辅助服务器上的数据库更新

可以启用与辅助服务器相连的应用程序来更新数据库数据。如果在辅助服务器上启用写操作,那么会将 DELETE、INSERT、MERGE 和 UPDATE 操作传播到主服务器。

使用 UPDATABLE_SECONDARY 配置参数可控制辅助服务器是否可更新数据,并可配置更新操作使用的连接数。

辅助服务器上同时支持数据定义语言 (DDL) 语句和数据操作语言 (DML) 语句。

所有可更新的辅助服务器上都支持 dbimport 实用程序。

辅助服务器上不支持 dbimport 实用程序。

仅当满足以下条件时,远程独立 (RS) 辅助服务器上才支持 dbexport

USELASTCOMMITTED 会话环境设置可覆盖 USELASTCOMMITTED 配置参数设置。

如果配置了 UPDATABLE_SECONDARY 配置参数和 STOP_APPLY 配置参数,那么所有只读辅助服务器上都支持 dbschema 实用程序。

所有可更新的辅助服务器上都支持 dbschema 实用程序。

只读辅助服务器上也支持 dbschema 实用程序。但是,dbschema 实用程序在这些服务器上运行时,会显示一条警告消息。

使用 DDL 或 DML 的大多数应用程序可在高可用性集群中的任一辅助服务器上运行;但是,不支持以下 DDL 语句:

在集群环境中,可更新的辅助服务器上不支持 SET CONSTRAINTS、SET INDEXES 和 SET TRIGGERS 语句。 对于针对辅助服务器数据库中表对象的 UPDATE 操作,不会重定向 SET Database Object Mode 语句指定的任何会话层索引、触发器或约束方式。

仅当辅助服务器映像与主服务器映像匹配时,客户机应用程序才可以在辅助服务器上插入、更新和删除行。 支持以下数据类型:

不支持存储在 BLOB 空间中的 BYTE 和 TEXT 数据类型,因为不能复制 BLOB 空间数据。

如果下列数据类型不接收指向另一个分区的指针引用,那么也支持它们:

主服务器映像与辅助服务器映像之间的任何差异都会导致 SQL 错误并回滚所有更改。

您不能在 HDR 辅助服务器、远程独立 (RS) 辅助服务器或共享磁盘 (SD) 辅助服务器上使用以下实用程序:

此外,不能在 HDR 辅助服务器或共享磁盘 (SD) 辅助服务器上使用 dbexport 实用程序。在辅助服务器中,仅远程独立辅助 (RS) 服务器支持 dbexport 执行的写操作,并且只能与上述 STOP_APPLY、UPDATABLE_SECONDARY 和 USELASTCOMMITTED 配置参数设置一起使用。

为更新配置的辅助服务器不支持字节范围锁定。 辅助服务器上的字节范围锁不能提升为全对象锁。

复制智能大对象

使用可更新的辅助服务器时,可能会收到下面一条或多条错误消息:
  • 12014
  • 12015
  • 12233
这些错误通常表明智能大对象文件描述符存在问题。以下任一条件均可导致这些错误:
  • 落实事务之前,将智能大对象标识传递到其他事务或进程。因为所有对象(包括智能大对象)在落实事务之前都不会落实,所以不允许其他事务使用智能大对象。特别是脏读取可以访问锁定的智能大对象。
  • 智能大对象在打开之后未关闭。在事务结束时,必须关闭辅助服务器上的所有智能大对象,尤其是已创建并随后回滚了事务的智能大对象。如果将智能大对象文件描述符保持打开状态,将导致在终止会话之前,内存始终保持已分配状态。
  • 另一个进程删除了主服务器上的智能大对象。共享锁定不会自动从辅助服务器传播到主服务器,因此其他辅助服务器可能会访问主服务器上实际已删除的智能大对象。辅助服务器上重放包含该删除操作的日志记录或主服务器更新辅助服务器之前,这些访问将一直有效。
处理脏读取信息时,可能还会再返回三个错误代码:
  • -126 (ISAM error: bad row id)
  • -244 (SQL error: Could not do a physical-order read to fetch next row)
  • -937
如果收到以上任一代码,请重试查询。

辅助服务器上的 LOCK TABLE 语句行为

可以从高可用性集群中的可更新辅助服务器设置对表的互斥锁定。对于从辅助服务器请求的互斥方式锁定,会话可读取表,但不能更新表。 此行为类似辅助服务器上的共享访问方式;即,如果一个会话以给定表上具有互斥锁定,那么其他任何会话均不能获取该表上的共享或互斥锁定。

在只读辅助服务器上,发出 LOCK TABLE 语句的会话不会锁定表,并且数据库服务器不会向客户机返回错误。

集群中的共享方式锁定的行为与独立服务器的行为相同。LOCK TABLE 语句成功运行之后,用户即可读取表,但是释放锁定之前,不能修改该表。