SQL Server:支持的数据类型、对象和操作
了解有关 SQL Server 数据库上 Oracle GoldenGate 的支持信息。
Oracle GoldenGate for SQL Server 支持捕获和交付受支持的 SQL Server 数据库版本的初始加载和事务数据。
除非本文档另有说明,否则 Oracle GoldenGate for SQL Server 支持对源数据进行映射、筛选和转换,以及将数据从 Oracle GoldenGate 支持的其他源数据库派生到 SQL Server 数据库。
实例要求
-
SQL Server 服务器名称 (
@@SERVERNAME) 不能为NULL。 -
(提取)要使 Oracle GoldenGate 捕获事务处理数据,SQL Server Agent 必须在源 SQL Server 实例上运行,并且 SQL Server 更改数据捕获作业必须针对数据库运行。如果还为数据库启用了 SQL Server Transactional Replication,则必须运行 SQL Server 日志读取器代理。
-
如果
TEXT, NTEXT, IMAGE,或VARCHAR(MAX), NVARCHAR(MAX)和VARBINARY(MAX)列的数据将超过为max text repl size选项设置的 SQL Server 默认大小,则扩展该大小。使用sp_configure可查看或调整max text repl size的当前值。注:对于适用于 SQL Server 的 Amazon RDS,要调整实例设置,您需要使用参数组而不是sp_configure。
- 建议为 SQL Server 实例安装最新的 Service Pack 或累积更新,以确保正确功能。对于 SQL Server 2012、2014、2016 和 2017,Microsoft 发现并修复了直接影响 SQL Server 更改数据捕获功能的几个重要问题。这种情况会影响 Oracle GoldenGate 正确捕获数据的能力。需要 Microsoft 修补程序的当前已知问题包括 KB3030352、KB3166120 和 KB 4073684。
数据库需求
遵守支持 Oracle GoldenGate 的以下要求和限制:
-
仅支持用户数据库进行捕获和传送。
-
确保为数据库启用了
Auto Create Statistics和Auto Update Statistics。 -
数据库必须设置为 SQL Server 实例版本的兼容性级别。
-
Oracle GoldenGate 支持配置有透明数据加密 (Transparent Data Encryption,TDE) 的 SQL Server 数据库。
-
(提取)源数据库可以设置为支持 Microsoft SQL Server 中的更改数据捕获功能的任何恢复模型。
-
如果源数据库是通过从其他实例恢复备份而创建的,则必须将数据库所有者 SID 与新实例上的 SID 同步。或者,可以使用
sp_changedbowner将还原的数据库设置为当前登录。 -
支持从启用了内存中 OLTP(内存中优化)的 SQL Server 数据库(SQL Server 2017 CU15 和更高版本)捕获,Oracle GoldenGate 发行版 21.15 和 23.5 及更高版本。但是,仅支持从磁盘上表进行捕获,不支持从内存优化表中进行捕获。
-
(AlwaysOn) Extract 支持从主数据库捕获或以只读方式同步提交模式捕获。捕获不支持异步提交模式。
-
复制性能考虑:从 SQL Server 2016 开始,Microsoft 将数据库选项
TARGET_RECOVERY_TIME的默认设置从 0 秒更改为 60 秒。在内部测试中已经证明,这可以降低 Replicat 的吞吐量。如果出现复制吞吐量下降,请考虑将TARGET_RECOVERY_TIME设置调整为 0。
限制:
-
Oracle GoldenGate 不支持捕获或交付系统数据库。
-
Oracle GoldenGate 不支持从包含的数据库捕获。
-
源数据库名称不能超过 121 个字符。此限制是由于 SQL Server 存储过程用于启用补充日志记录。
-
如果要配置 Oracle GoldenGate 心跳功能,则 SQL Server 数据库名称不能超过 107 个字符。
-
(AlwaysOn) 不支持从在 AlwaysOn 可用性组的异步提交模式下配置的数据库捕获。
表要求
要包括在捕获和传送中的表必须仅包括支持的 SQL Server 数据类型中列出的数据类型。
-
Oracle GoldenGate 支持从用户表捕获事务性 DML,并将数据传送到用户表和可写视图。
-
不支持 DDL 操作。
-
Oracle GoldenGate 支持 SQL Server Change Data Capture 跟踪的表的最大允许表名和列长度。
-
要捕获的表的所有列长度之和不得超过 SQL Server 允许为表启用更改数据捕获的长度。如果所有列长度的总和超过了 SQL Server 过程
sys.sp.cdc_enable_table允许的长度,则无法为该表启用ADD TRANDATA。允许的最大记录长度随着存在更多列而减小,因此最大记录长度与表中的列数之间存在反向关系。
支持的 SQL Server 数据类型
捕获和交付支持以下数据类型,除非在以下限制中特别指出:
-
二进制数据类型
-
(binary, varbinary, varbinary (max)) -
(varbinary (max)与FILESTREAM)
-
-
字符数据类型
(char, nchar, nvarchar, nvarchar (max), varchar, varchar (max))
-
日期和时间数据类型
(date, datetime2, datetime, datetimeoffset, smalldatetime, time)
-
数字数据类型
(bigint, bit, decimal, float, int, money, numeric, real, smallint, smallmoney, tinyint)
-
业务部门
(image, ntext, text)
-
其他数据类型
(timestamp, uniqueidentifier, hierarchyid, geography, geometry, sql_variant (Delivery only), XML)
-
Oracle GoldenGate for SQL Server 可以复制包含
SPARSE设置的列数据。
限制:
-
Oracle GoldenGate 不支持过滤、列映射或处理大于 4KB 的大型对象。完整的 Oracle GoldenGate 功能可用于高达 4KB 的对象。
-
Oracle GoldenGate 将 XML 数据视为大型对象 (LOB),当 XML 不适合行时,SQL Server 也是如此。SQL Server 扩展 XML 增强功能(例如 lax 验证、
DATETIME和联合功能)不受支持。 -
系统分配的
TIMESTAMP列或非实体化计算列不能是键的一部分。包含TIMESTAMP列的表必须具有一个键,该键可以是主键或唯一约束条件,或者是使用TABLE或MAP语句中的KEYCOLS子句指定的替代键。有关更多信息,请参阅分配行标识符。 -
Oracle GoldenGate 支持存储在字符列中的多字节字符数据类型和多字节数据。多字节数据仅在类似 SQL Server 的配置中受支持。多字节字符数据不支持转换、过滤和其他类型的操作。
-
如果捕获
TEXT、NTEXT、IMAGE、VARCHAR (MAX)、NVARCHAR(MAX)和VARBINARY (MAX)列的数据将超过为max text repl size选项设置的 SQL Server 默认大小,则扩展该大小。使用sp_configure查看max text repl size的当前值并根据需要调整该选项。注:Amazon RDS for SQL Server 不允许max text repl size大于 64MB。{:.infoboxnote} -
IMAGE、NTEXT和TEXT数据类型的列将记录为NULL值,以供删除和映像更新操作之前使用。除非更新了列,否则VARBINARY(MAX)、VARCHAR(MAX)和NVARCHAR(MAX)的列将作为映像更新操作之前的NULL值记录。有关详细信息,请查看以下 Microsoft 文档中的“大型对象数据类型”内容:
-
Oracle GoldenGate 支持高达 2 GB 的 UDT 和 UDA 数据。支持除 SQL_Variant 以外的所有 UDT。
-
支持通用语言运行时 (CLR),包括 SQL Server 内置的 CLR 数据类型(例如,几何、地理位置和层次结构 ID)。CLR 数据类型仅在类似 SQL Server 配置中受支持。CLR 数据不支持转换、过滤和其他类型的处理。
-
支持具有
FILESTREAM属性的VARBINARY (MAX)列,最大大小为 4 GB。Extract 使用标准Win32文件函数读取FILESTREAM文件。 -
浮点数的范围和精度取决于主机。一般来说,精度精确到 16 位有效数字,但应查看数据库文档以确定预期的近似值。Oracle GoldenGate 舍入或截断超过支持精度的值。
-
Oracle GoldenGate 支持从 0001/01/03:00:00 到 9999/12/31:23:59:59 的时间戳数据。如果时间戳从 GMT 转换到本地时间,则这些限制也适用于生成的时间戳。根据时区,转换可能会增加或减去小时数,这可能会导致时间戳超过支持的下限或上限。
计算列的限制:
-
Microsoft 的更改数据捕获不支持计算列(持久性列或非持久性列)。因此,对于包含计算列的列,不会向线索写入任何数据。要复制非持久计算列的数据,请使用
TABLE参数的FETCHCOLS或FETCHMODCOLS选项从表中提取列数据。请记住,在数据库中更改列的时间与提取正在处理的事务处理记录的数据的时间之间,数据值存在差异可能会导致差异。
-
在
FETCHCOLS或FETCHMODCOLS选项中使用数据类型为sql_variant的列时,Extract 会异常终止,并出现以下错误:ERROR OGG-25230 Unsupported datatype '*column-name* (sql_variant)' used with 'FETCHCOLS/FETCHCOLSEXCEPT' in table '*table-name>*. -
复制不会将 DML 应用于任何计算的列,即使该列的数据位于线索中也是如此,因为数据库不允许对该类型的列执行 DML 操作。源持久性计算列或提取的非持久性列中的数据可以应用于非计算列的目标列。
-
在初始加载中,所有数据都直接从源表中选择,而不是从事务处理日志中选择。因此,在初始加载中,将所有列(包括非持久计算列)的数据值写入到线索中或发送到目标,具体取决于所使用的方法。但是,与应用更改数据时一样,Replicat 不会将初始加载数据应用于计算的列,因为数据库不允许对该类型的列执行 DML。
-
Oracle GoldenGate 不允许在
TABLE或MAP语句的KEYCOLS子句中使用非持久计算列。 -
如果唯一键包括非持久性计算列,并且 Oracle GoldenGate 必须使用该键,则忽略非持久性计算列。如果余下的列没有强制实现唯一性,可能会影响数据完整性。
-
如果在任何非持久计算列上定义了唯一索引,则不使用该索引。
-
如果唯一键或索引包含非持久计算列,并且是表中的唯一标识符,则 Oracle GoldenGate 必须使用所有列作为标识符来查找目标行。由于此标识符中不能使用非持久计算列,因此 Replicat 可能会将包含此标识符的操作应用于错误的目标行。
不支持的 SQL Server 数据类型和功能
-
捕获不支持
SQL_Variant数据类型。 -
包含不受支持的数据类型的表可能会导致提取异常终止。作为一种解决方法,必须从这些表中删除
TRANDATA并将其从提取的TABLE语句中删除,或者对表使用提取的TABLEEXCLUDE参数。
SQL Server 支持的对象和操作
支持以下对象和操作:
-
Oracle GoldenGate for SQL Server 支持并行复制。
-
Oracle GoldenGate 支持从用户表捕获事务性 DML,并将数据传送到用户表和可写视图。
-
对于 SQL Server Chang Data Capture 记录的操作,支持
TEXT, NTEXT, IMAGE, VARBINARY, VARBINARY (MAX) VARCHAR (MAX)和NVARCHAR (MAX)列的完整大小。例如,IMAGE、NTEXT和TEXT数据类型的列在删除操作中记录为 NULL 值。有关详细信息,请查看以下 Microsoft 文档中的“大型对象数据类型”内容: -
Oracle GoldenGate 支持为 SQL Server 更改数据捕获启用的表允许的最大行大小。
-
Oracle GoldenGate 支持从启用了
PAGE和ROW压缩的表捕获。对于使用压缩的分区表,必须使用相同的压缩类型启用所有分区。 -
如果分区表在所有分区中具有相同的物理布局,则 Oracle GoldenGate 支持捕获分区表。
-
要捕获的表的所有列长度之和不得超过 SQL Server 允许为表启用更改数据捕获的长度。如果所有列长度的总和超过了 SQL Server 过程
sys.sp.cdc_enable_table允许的长度,则无法为该表添加ADD TRANDATA。允许的最大记录长度随着存在更多列而减小,因此最大记录长度与表中的列数之间存在反向关系。
SQL Server 的不支持的对象和操作
不支持以下对象和操作:
-
考虑两个表之间的父子关系,其中父表中的主键由子表中的外键使用
ON UPDATE SET DEFAULT子句引用。父表上的延迟 PK 更新导致 DELETE 和 INSERT 对。无法可靠地标识对父表的相应 DELETE 和 INSERT 操作。对父表执行此类延迟更新时,Oracle GoldenGate Extract 可能无法可靠地捕获所有事件。 -
对于源数据库,SQL Server Change Data Capture 不支持的操作,例如
TRUNCATE语句。有关通过启用 SQL Server Change Data Capture 限制的操作完整列表,请参阅 Microsoft SQL Server Documentation。 -
Oracle GoldenGate for SQL Server 不支持捕获或交付 SQL Server 的 DDL 更改,并且源和目标上的 Oracle GoldenGate 进程需要执行额外的步骤来处理任何表级 DDL 更改,包括表索引重建操作。请参阅表级别 DDL 更改的要求。
-
不支持视图。
-
由
TextCopy实用程序以及WRITETEXT和UPDATETEXT语句执行的操作。这些功能执行数据库未记录或仅部分记录的操作,因此提取处理无法支持这些操作。 -
分区中具有多个物理布局的分区表。
-
对源表进行分区切换。SQL Server Change Data Capture 将分区交换机视为 DDL 操作,并且从一个分区移到另一个分区的数据不会记录在 CDC 表中,因此您必须按照 Requirements for Table Level DDL Changes 中的过程操作,在为表启用补充日志记录时手动实施分区切换。
-
由于 SQL Server 的更改数据捕获的限制,与数据库整理不同的列级整理可能导致将不正确的数据写入字符数据的 CDC 表,并且 Extract 将在写入 CDC 表时捕获它们。建议对包含非 ASCII 数据的列使用
NVARCHAR、NCHAR或NTEXT数据类型,或者对表列使用与数据库相同的整理。有关详细信息,请参阅关于更改数据捕获 (SQL Server) 。 -
由于 SQL Server 更改数据捕获的限制,SQL Server 更改数据捕获代理不会捕获
NOOPUPDATES,因此没有要捕获的用于即时更新操作的记录。 -
不支持启用更改数据捕获的时间表,因此无法为源实施的提取配置时间表。
表级 DDL 更改要求
Oracle GoldenGate for SQL Server 不支持捕获或交付 DDL 更改。但是,从 Oracle GoldenGate 21c 开始,对启用了 TRANDATA 的表所做的更改不会导致提取异常终止。提取将继续处理表的更改数据,就像启用 TRANDATA 时存在的数据一样。
认为是表级 DDL 更改的操作包括但不限于:ALTER TABLE、TRUNCATE TABLE、索引重建和分区交换机。
为了避免由于表级 DDL 更改而导致数据不一致,需要执行以下步骤。
-
来源:将应用程序数据暂停或停止到要修改的表。
-
来源:确保没有要修改的表的未结事务处理。
-
来源:确保 SQL Server CDC Capture 作业处理要修改的表的所有剩余事务。
-
来源:在进行任何 DDL 更改之前,请确保提取处理要修改的表的所有事务。
-
目标:在进行任何 DDL 更改之前,请确保复制处理要修改的表的所有事务。
-
(可选)实施“事件标记”表可用于确定已为要修改的表处理所有剩余事务处理的时间,以及处理何时正确停止提取和复制的协调。
-
来源:停止提取处理。
-
目标:停止复制进程。
-
源:为要通过运行
DELETE TRANDATA修改的表禁用补充日志记录。 -
源:对源表进行表 DDL 更改。
-
目标:对目标表进行表 DDL 更改。
-
来源:通过在执行修改后对表运行
ADD TRANDATA来重新启用补充日志记录。 -
来源:启动提取。
-
目标:启动复制。
-
来源:将应用程序数据恢复到已修改的表。
SQL Server 的系统方案
复制不支持以下系统方案:
-
sys -
cdc -
INFORMATION_SCHEMA
guest 方案不支持使用通配符映射,但在显式列出时受支持,例如 TABLE guest.employees。