问题描述
我们有一种情况,GoldenGate被用来将源数据复制到target (源和target都是oracle 12c)。在目标上,我们有一个列 (目标时间戳),主要是跟踪一行被复制的日期/时间。此时间戳字段在GoldenGate配置 (复制端) 内有一个映射来捕获日期/时间。目前这是用 @ DATENOW() 映射的。看来此函数不返回百万秒级别。因此,我们实际上是使用目标时间戳列进行数据排序,以确定行上的最新快照。但是由于数据复制得如此之快,它实际上需要数百万秒的精度。
我想知道,GoldenGate有没有可以提供毫秒精度的选择 (与 @ DATENOW() 相反)?
感谢您的帮助。
谢谢
我想知道,GoldenGate有没有可以提供毫秒精度的选择 (与 @ DATENOW() 相反)?
感谢您的帮助。
谢谢
专家解答
@ DATENOW() 函数正在从数据库返回SYSDATE的结果。对于许多类型的项目,这应该足以满足最终用户的需求。在这种情况下,您想要更深入地挖掘并获得时间戳的毫秒精度。做一个简单的测试,这是可以实现的。
我使用的用例如下:
源表:
名称为空?类型
---- ----- -------------
身份证号码
名称VARCHAR2(128)
目标表:
名称为空?类型
------------ ----- ---------------------------
身份证号码
名称VARCHAR2(128)
REC_DATE时间戳 (6)
带时区的REC_DATE_WTZ时间戳 (6)
这些表是同一个表; 只是在目标侧,我有两列记录记录日期 (@ DATENOW()) 和记录日期与时区。后者允许捕获到第6位的毫秒。
现在是黄GoldenGate设置。
提取参数文件 (源):
提取IEXTTEST
Useridialias SGGATE域OracleGoldenGate
exttrail za
来源目录pdb1;
表测试。test_date;
Replicat参数文件 (目标):
Reptest副本
用户别名TGGATE域OracleGoldenGate
映射pdb1.test.test_date,目标测试.test_date,
sqlexec (ID查找,查询 '从dual中选择系统stimestamp'),
colmap (使用默认值,
rec_date = @ DATENOW(),
记录日期wtz = 查找。系统标记
);
为了将时间戳捕获到毫秒,需要进行的更改需要使用SQLEXEC从数据库中调用系统时间戳 (SYSTIMESTAMP)。然后,目标表必须将SYSTIMESTAMP数据接受为支持捕获毫秒 (带有时区的时间戳) 的数据类型。
现在,当我从源到目标复制一些事务时,我可以看到 @ DATENOW() 函数调用SYSDATE和使用systimetramp获取应用记录时的毫秒之间的区别。
ID名称REC_DATE REC_DATE_WTZ
-
1 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。531189000 PM -05:00
2 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。703136000 PM -05:00
3 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。721737000 PM -05:00
此示例提供了更多有关时区详细信息的信息,但它应该提供足够的信息来显示如何使用SQLEXEC从数据库中获取其他信息。
我使用的用例如下:
源表:
名称为空?类型
---- ----- -------------
身份证号码
名称VARCHAR2(128)
目标表:
名称为空?类型
------------ ----- ---------------------------
身份证号码
名称VARCHAR2(128)
REC_DATE时间戳 (6)
带时区的REC_DATE_WTZ时间戳 (6)
这些表是同一个表; 只是在目标侧,我有两列记录记录日期 (@ DATENOW()) 和记录日期与时区。后者允许捕获到第6位的毫秒。
现在是黄GoldenGate设置。
提取参数文件 (源):
提取IEXTTEST
Useridialias SGGATE域OracleGoldenGate
exttrail za
来源目录pdb1;
表测试。test_date;
Replicat参数文件 (目标):
Reptest副本
用户别名TGGATE域OracleGoldenGate
映射pdb1.test.test_date,目标测试.test_date,
sqlexec (ID查找,查询 '从dual中选择系统stimestamp'),
colmap (使用默认值,
rec_date = @ DATENOW(),
记录日期wtz = 查找。系统标记
);
为了将时间戳捕获到毫秒,需要进行的更改需要使用SQLEXEC从数据库中调用系统时间戳 (SYSTIMESTAMP)。然后,目标表必须将SYSTIMESTAMP数据接受为支持捕获毫秒 (带有时区的时间戳) 的数据类型。
现在,当我从源到目标复制一些事务时,我可以看到 @ DATENOW() 函数调用SYSDATE和使用systimetramp获取应用记录时的毫秒之间的区别。
ID名称REC_DATE REC_DATE_WTZ
-
1 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。531189000 PM -05:00
2 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。703136000 PM -05:00
3 SysAdmin 18年1月22日09.44.46.000000000 PM 18年1月22日09.44.46。721737000 PM -05:00
此示例提供了更多有关时区详细信息的信息,但它应该提供足够的信息来显示如何使用SQLEXEC从数据库中获取其他信息。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




