2010-10-30 28 views
5

我想獲取由TIBCO數據庫適配器不斷更新的Oracle數據庫的一致快照。採取不斷更新的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語法可能是不正確的,並不重要!)

或者有更好的東西,我可以做什麼?

回答

4

使用名爲Flashback的Oracle功能很容易。只要您知道以前的版本(時間或scn)何時位於閃回窗口內,就可以簡單地查詢它。

7

如果通過「snapshot」表示完全拷貝的數據庫處於一致模式,那麼我會從備份中恢復數據庫並將其恢復到所需的時間點。 Oracle恢復過程將處理一致性(由系統更改號碼或SCN跟蹤)。

如果您正在使用RMAN進行備份和恢復,則有一個帶有time子句的「DUPLICATE DATABASE」命令,可以使此操作變得相對簡單。

在另一方面,如果你只是希望提取一致的模式幾桌我能想到的兩個選項:

  • 導出組表用的 一致= y選項的(舊的)EXP 實用
  • 使用新的expdp實用程序與FLASHBACK_TIME選項
+3

我總是很驚訝人們傾向於避免'RMAN'。在Oracle世界裏,這是自切片面包以來最好的事情。 – 2010-10-31 02:36:51

+0

+500在RMAN上... – REW 2010-10-31 06:59:22

1

除了dpbradley的建議,如果只是少數沒有太大的表,你有閃回查詢可用您可以使用同一時間戳的閃回查詢來創建表的副本。

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
相關問題