問題場(chǎng)景:
Oracle數(shù)據(jù)庫使用dblink進(jìn)行跨庫關(guān)聯(lián)查詢,遇到ORA-01555錯(cuò)誤
此行為的示例如下所示:
DBLINK Local DBLINK Remote
--------------------------------- --------------------------
SCN SCN
10 SELECT * FROM R1@<DBLINK>,L1 ------> 30 (Before image at SCN:10 is available)
WHERE R1.C1 = L1.C1 SCN:10
:
30 Succeed (Sync with DBLINK Remote)
30 30
30 (No update operations) : Multiple updates
30 100
30 SELECT * FROM R1@<DBLINK>,L1 ------> 100 (No before image at SCN:30)
WHERE R1.C1 = L1.C1 SCN:30
:
30 ORA-1555 (Failed to sync DBLINK) 100
* R1 is a table located on the DBLINK Remote side, and L1 is a table located on the DBLINK Remote side.
1. 從本地端執(zhí)行連接本地表和遠(yuǎn)程表的 SELECT 語句。用于此查詢的 SCN 是本地端的 SCN:10。遠(yuǎn)程端位于 SCN:30,但由于它仍然具有 SCN:10 的 before 映像,因此查詢成功。(注:返回的數(shù)據(jù)反映了 SCN:10 的狀態(tài))
2. 在遠(yuǎn)程端執(zhí)行多次更新,將 SCN 增加到 SCN:100。同時(shí),本地不進(jìn)行任何作,其 SCN 保持在 SCN:30。如果本地的 SCN 高于遠(yuǎn)程,則在同步期間將相應(yīng)地提高遠(yuǎn)程的 SCN。
3. 在 DBLINK Local 上執(zhí)行 SELECT 語句,連接來自本地和遠(yuǎn)程 DBLink 的表。此時(shí),SELECT使用的SCN是本地端的SCN:30。在偏遠(yuǎn)方面,SCN 已經(jīng)晉升到 100。如果無法通過遠(yuǎn)程端的 UNDO 生成 SCN:30 所需的 before 映像,則無法保持讀取一致性,并且將發(fā)生 ORA-1555 錯(cuò)誤。此外,如果發(fā)生 ORA-1555,則不會(huì)進(jìn)行 SCN 同步。在這種情況下,DBLINK 本地端保持在 SCN:30,重復(fù)執(zhí)行相同的 SQL 將繼續(xù)導(dǎo)致 ORA-1555。
解決方法:
執(zhí)行指定SQL之前先執(zhí)行虛擬查詢。
執(zhí)行使用數(shù)據(jù)庫鏈接的 SQL 將觸發(fā) SCN 同步。為避免 ORA-1555,可以在執(zhí)行可能導(dǎo)致錯(cuò)誤的 SQL 之前使用數(shù)據(jù)庫鏈接運(yùn)行虛擬 SELECT。使用 DUAL 表的 SELECT(如下例所示)就足夠了:
這可確保在主 SQL 開始之前進(jìn)行 SCN 同步。
浙公網(wǎng)安備 33010602011771號(hào)