我想获取一个由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语法可能不正确,不重要!)
或者我能做些什么更好的事情?
答案 0 :(得分:7)
如果“快照”是指一致模式下数据库的完整副本,那么我将从备份中恢复数据库并将其恢复到所需的时间点。 Oracle恢复过程将处理一致性(由系统变更编号或SCN跟踪)。
如果您使用RMAN进行备份和恢复,则会出现一个“DUPLICATE DATABASE”命令,其中包含一个时间子句,使其相对无痛。
另一方面,如果您只想在一致模式中提取几个表格,我可以考虑两个选项:
答案 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
链接: