获取不断更新的Oracle数据库的“快照”的最佳方法是什么?

时间:2010-10-30 10:55:38

标签: oracle snapshot

我想获取一个由TIBCO数据库适配器不断更新的Oracle数据库的一致快照。

典型地,TIBCO一次更新一堆表,然后是COMMIT。 如果我遍历所有表,每天拍摄一次快照,那么我可以在提交之前从表A获取数据,并在提交之后从表B获取数据 - 但如果A和B有关系,那么它们将不再匹配正常。

“SET TRANSACTION READ ONLY”是否可以使用?
例如

COMMIT
SET TRANSACTION READ ONLY
SELECT * FROM A WHERE A.ADB_UPDATEDDATE > TODAY()-1 
SELECT * FROM B WHERE B.ADB_UPDATEDDATE > TODAY()-1 
etc.
COMMIT

(TODAY语法可能不正确,不重要!)

或者我能做些什么更好的事情?

6 个答案:

答案 0 :(得分:7)

如果“快照”是指一致模式下数据库的完整副本,那么我将从备份中恢复数据库并将其恢复到所需的时间点。 Oracle恢复过程将处理一致性(由系统变更编号或SCN跟踪)。

如果您使用RMAN进行备份和恢复,则会出现一个“DUPLICATE DATABASE”命令,其中包含一个时间子句,使其相对无痛。

另一方面,如果您只想在一致模式中提取几个表格,我可以考虑两个选项:

  • 用表格导出表格组 一致=(较旧)exp的y选项 效用
  • 将较新的expdp实用程序与flashback_time选项一起使用

答案 1 :(得分:4)

使用名为Flashback的Oracle功能非常容易。只要你知道以前的版本是什么时候(时间或scn)并且它在闪回窗口内,你就可以简单地查询它。

答案 2 :(得分:1)

除了dpbradley的建议之外,如果只有少数不太大的表并且您有可用的闪回查询,则可以使用闪回查询创建表的副本,具有相同的时间戳。

答案 3 :(得分:0)

也许以一致模式进行导出会有所帮助。看看http://www.dba-oracle.com/tips_oracle_export_utility.htm

答案 4 :(得分:0)

你也可以使用基于“存储级别”的快照,虽然oracle似乎认为使用RMAN是一种更好的方法:http://www.oracle.com/technetwork/database/features/availability/rman-fra-snapshot-322251.html

答案 5 :(得分:0)

首先,正如其他人所说,在Oracle中有" snapshotting" 的特殊工具,并且最好将它用于我的任务。但是,如果我们特别关注这个问题,我们会发现它是一个不可重复的读取&幻影读 问题[1],所以关于交易隔离级别。我们在Oracle 中有SERIALISABLE级别以避免(但它并不意味着它在一般情况下对您的任务有利)这些问题[2],所以如果您不想获得某些意外并希望在特定时刻(您的交易开始时间点)让数据库保持一致状态,您应该这样做:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

链接:

  1. https://en.wikipedia.org/wiki/Isolation_(database_systems)
  2. http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10005.htm#SQLRF01705