7

我想为 TIBCO DB 适配器不断更新的 Oracle 数据库拍摄一致的快照。

通常,TIBCO 一次更新一堆表,然后提交。如果我遍历所有表,每天拍摄一次快照,那么我可以在提交之前从表 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

(今天的语法可能不正确,不重要!)

或者有什么更好的我可以做的吗?

4

6 回答 6

7

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

如果您使用 RMAN 进行备份和恢复,则有一个带有时间子句的“DUPLICATE DATABASE”命令可以使这相对轻松。

另一方面,如果您只是想以一致的模式提取几个表,我可以想到两个选项:

  • 使用(旧)exp 实用程序的一致=y 选项导出表组
  • 将较新的 expdp 实用程序与 flashback_time 选项一起使用
于 2010-10-30T11:32:44.403 回答
4

使用称为Flashback的 Oracle 特性很容易做到这一点。只要你知道上一个版本是什么时候(time or scn)并且在闪回窗口内,你就可以简单地查询它。

于 2010-10-31T10:11:26.957 回答
1

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

于 2010-10-30T14:18:18.993 回答
0

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

于 2010-11-04T00:09:18.127 回答
0

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

于 2013-01-30T19:58:47.527 回答
0

首先,正如其他人所说,Oracle 中有用于“快照”的特殊工具,最好将它用于我的任务。但是如果我们特别关注这个问题,我们会发现这是一个不可重复读取和幻读 问题 [1],所以这都是关于事务隔离级别的。我们SERIALISABLE在 Oracle中的水平可以避免(但这并不意味着它在一般情况下对您的任务有好处)这些问题 [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
于 2015-12-28T12:19:05.917 回答