2010-05-14 212 views
2

我不得不承认,这让我在生产系统中感到意外。我最近在几张表中添加了补充日志记录,以便与Oracle Change Data Capture一起使用。在不相关的代码构建过程中进行例行检查发现,这显然是在“S”类型的数据库中创建了禁用的约束。我似乎无法在Oracle文档中找到任何关于此的参考信息,单个“S”使Google难以找到相关的内容。新的Oracle约束类型

我的问题:

  1. 的原因,任何事情,在 隐含的约束 补充日志的结果吗?
  2. 为什么创建DISABLED 状态?
  3. 有没有人有与 启用这些影响的经验?我们有 标准清理过程, 在部署完成后运行到完全 启用约束,可能有 已被禁用或启用novalidate 出于数据迁移的原因。

回答

3

约束类型进行了说明:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/statviews_1045.htm#REFRN20047

S代表“补充记录”,这进一步说明如下:http://download.oracle.com/docs/cd/E11882_01/server.112/e10704/strms_glossary.htm#CHDIHHGA这里:http://download.oracle.com/docs/cd/E11882_01/server.112/e10705/prep_rep.htm#STREP107

我没有任何与它的经验。这是在tahiti.oracle.com上搜索的结果。

Regards, Rob。

+0

谢谢 - 没有想到在字典中查看视图defs为约束类型。我仍然感兴趣的是为什么这会导致一个约束 - 我认为约束会阻止DML在表上,并且无法明白为什么补充日志会以这种方式影响表。 – dpbradley 2010-05-14 20:45:47

3

补充日志记录对于支持某些类型的异步数据捕获是必要的:例如AQ Streams和CDC(Oracle和第三方的实现)。这些机制通过读取重做日志并将这些更改应用于其他Oracle数据库来工作。补充日志的重点是增加重做日志中包含的数据量。

有两种启用补充记录的方法。在最近版本的数据库,我们可以在数据库级别

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; 

设置最小记录在另外我们可以添加指定补充日志组表和列。这一点的意义在于在变更表中包含未更改列的值,因为这样可以更轻松地将更改应用到目标数据库中。 Find out more

很明显,S型约束识别补充日志组中的列。我认为他们被禁用的原因是因为他们不强制数据完整性规则(不像主键或检查约束)。如果是这样,我认为这是不明智的,所以你应该重新写你的自动清理过滤器的限制类型S.

+0

是的,这些约束是补充日志记录体系结构的一部分,但对于我来说这个实现涉及到这个结构似乎很奇怪。我一直认为约束==数据限制,这不适合这种模式。当然,我遵循Rob的链接到x_CONSTRAINTS文档,并发现当我没有看到:-)时,还有一些类型已经潜入。时间来审查所有这些实用脚本... – dpbradley 2010-05-15 16:43:46

+0

也,我想我同意你不重新启用它们。虽然它在测试系统中似乎没有受到任何伤害,但不理解它们的原因使我对使用订阅配置的一些边缘案例保持警惕,这种配置会在生产中失败。 – dpbradley 2010-05-15 16:47:03