1. 程式人生 > >跨Oracle資料庫實現表級別的實時同步

跨Oracle資料庫實現表級別的實時同步

一:問題描述

有兩個Oracle資料庫,分別佈置在不同的伺服器上,系統均為windows2003;

這裡暫且說成是一個主資料庫和從資料庫:

(1) 主資料庫: oracle_A ;

(2) 從資料庫: oracle_B ;

在oracle_A中有一個表table_A與oracle_B中的表table_B 結構相同 ;

我是處在oracle_B,oracle_A資料庫分配給我有一個訪問oracle_A表table_A的使用者,該使用者 只擁有查詢的許可權 ;

另外,需要 說明的一點 ,就是在oracle_B處,只需對table_B表進行查詢的操作,不進行其他增刪改的操作。

場景介紹完了, 我的問題 的是,如何在oracle_A中表table_A發生變化時,實時更新同步到oracle_B的table_B中?

我原來的處理方式:

通過建立遠端連線DBLink+JOB定時任務+儲存過程的方式,實現了定時同步 更新,但不能做到實時同步 。

二:採用同義詞+DB_Link的方式結果步驟

之所以能夠選擇採用同義詞的方式,處理這個問題。主要還是源於在問題描述中提到一個點,那就是我們只需要對同步後的表進行 查詢 操作。這點是使用同義詞方式的重要要素。

下面詳細模擬一下整個實驗測試的過程:

(1)首先在Oracle_A端建立一個對table_A只有查詢功能的使用者

  1. 建立使用者
    sqlplus /nolog
    conn /as sysdba;
    create user username identified by password;

  2. 檢視所有的使用者列表
    使用者建立完成後,檢視使用者是否建立成功
    select * from all_users;

  3. 授予許可權
    為了能夠保證能夠登陸,必須賦予如下許可權

    • 授予username使用者建立session的許可權,即登陸許可權
      grant create session to username;

    • 授予username使用者使用表空間的許可權
      grant unlimited tablespace to username;

    • oracle對許可權管理比較嚴謹,普通使用者之間也是預設不能互相訪問的,需要互相授權.

    • 如果scott使用者要授權給username使用者檢視自己的test表的許可權;
      sqlplus scott/

      [email protected]:1521/orcl

    • 授予username使用者檢視指定的許可權
      grant select on test to username;

    • 撤銷許可權
      基本語法同grant,關鍵字為revoke;

(2)驗證使用者是否可以成功登入,並進行訪問授權的表

使用sqlplus登入,並進行查詢

sqlplus username/[email protected]:1521/orcl;
select * from scott.test;

注意:查詢表時,務必帶上使用者名稱,說明是哪個使用者下的表。

  1. 建立遠端連線 db_link
    create public database link db32 connect to tianzhi_test identified by "tianzhi_test" using '192.168.56.6:1521/ORCL'
  1. 測試遠端連線是否成功
    select * from [email protected];

(4)在Oracle_B端建立同義詞

  1. 使用sqlplus登入自己的使用者
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl
  1. 建立同義詞
create or replace public synonym TEST1130 for [email protected];

3.查詢測試

select * from TEST1130;

可以看到這與在Oracle_A源資料庫中查到的table_A表中的資料一樣.
注意事項:

當遠端查詢的資料庫中包含BLOB欄位時,會報出如下錯誤.

  ORA-22992: 無法使用從遠端表選擇的 LOB 定位器

當出現這個錯誤的時候,那是因為跨庫連線查詢中的表中存在BLOB型別的欄位,所以一定要注意,所有表中存在blob型別欄位,

不能用 select * from 連線的表
不能將blob型別的欄位出現在指令碼中。
如果這些blob型別的欄位一定要導過來,可以先建立臨時表再插入本地表,方法如下.在pl/sql中執行

第一步 建臨時表

create global temporary table foo ( X BLOB )
on commit delete rows;

第二步 插入本地表

insert into foo select blobcolumn from [email protected]_remote ;

相關推薦

Oracle資料庫實現級別實時同步

一:問題描述 有兩個Oracle資料庫,分別佈置在不同的伺服器上,系統均為windows2003; 這裡暫且說成是一個主資料庫和從資料庫: (1) 主資料庫: oracle_A ; (2) 從資料庫: oracle_B ; 在oracle_A中有一個表

Oracle 10g通過建立物化檢視實現不同資料庫級別的資料同步

Oracle 10g 物化檢視語法如下: create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | start with (start_t

阿里雲canal訂閱mysql的binlog日誌實現資料和結構實時同步

1.開啟mysql binlog日誌 安裝路徑下的my.ini檔案新增配置log-bin=mysql-bin #開啟日誌binlog-format=ROW #選擇row模式server_id=1 開啟日誌需要重啟mysql服務後生效2.下載canal 地址:https://g

兩個資料庫資料實時同步(sql2008 觸發器)

/****** Object:  Trigger [dbo].[TR_C0T14]    Script Date: 11/01/2011 13:21:04 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -

CentOS6.8使用Rsync+Inotify-tools實現數據實時同步

rsync inotify 說明: 操作系統:CentOS release 6.8 (Final) x86_64 服務器IP:rsync_server(數據源) 10.15.43.100 rsync_client (目標端)

Rsync+inotify實現文件實時同步

數據同步、rsync、rsync inotify-tools 數據備份、文件備份是運維、DBA等崗位最熟悉不過的話題,這裏不介紹數據庫的備份,簡單介紹一下文件同步工具,這樣的工具有很多,Windows環境下有Goodsync、FreeFileSync等,Linux下rsync、unison等,常用的實時同步,

rsync+inotify實現代碼實時同步

rsync inotify 實時同步 rsync rsync是lunix系統下的數據鏡像備份工具。使用快速增量備份工具Remote Sync可以遠程同步,支持本地復制,或者與其他SSH、rsync主機同步。優點:1)、可以鏡像保存整個目錄樹和文件系統。2)、可以很容易做到保持原來文件的權限、

(轉)Linux下通過rsync與inotify(異步文件系統事件監控機制)實現文件實時同步

-a 推送 root started init.d log tool mysql同步 .tar.gz Linux下通過rsync與inotify(異步文件系統事件監控機制)實現文件實時同步原文:http://www.summerspacestation.com/linux%

rsync+inotify實現文件實時同步-步驟詳解

rsync inotify實驗拓撲(centos7下):192.168.80.181 服務器端(主機名www.aa.com)192.168.80.182 客戶端(主機名www.ab.com)1、使用SSH源:安裝rsync,服務端和客戶端同時安裝,只使用客戶端命令就OK了。systemctl stop fir

Rsync+inotify實現數據實時同步

文件差異同步下載軟件wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 2.驗證Rsyncrsync -avz -e ssh /home/wwwroot/default/images/ root

Linux Debian8 Rsync+Sersync實現數據實時同步

dev 火墻 變化 log 默認啟動 define lan vim cut Rsync+sersync實現數據實時同步Rsync??Rsync(remote synchronize)是一個遠程數據同步工具,可通過LAN/WAN快速同步多臺主機間的文件。Rsync使用所謂的“

Rsync + inotify 實現文件實時同步

匿名 實現 nis strong -- --delete 單向 cat wait Rsync用來實現觸發式的文件同步。inotify-tools是一套組件,Linux內核從2.6.13版本開始提供了inotify通知接口,用來監控文件系統的各種變化情況,如文件存取、刪除、移

Oracle資料庫分割槽清理總結)

分割槽表的講解 如何選擇分割槽的型別,如何選擇分割槽的列呢。在這之前你必須明確你的目的——易管理性和效能,你更注重哪個方面。分割槽表所影響的方面可以歸類為以下幾種:效能、易管理性、資料清理。  下面分別說說分割槽表對每一項的具體影響,  效能:  這一般是分割槽的主要目

Oracle 資料庫的時候拆分欄位substr函式

 Oracle 資料庫的substr函式   格式1: substr(string string, int a, int b);   格式2:substr(string string, int a) ; 解釋:     格式1:  &nb

oracle資料庫驅動

出處:http://blog.itpub.net/71225/viewspace-828310/http://www.itpub.net/showthread.php?s=&threadid=144375&perpage=10&pagenumber=2 rule 下所謂驅

Oracle資料庫前,先判斷是否存在,存在不建,不存在則建

------建立TABNAME ---------- DECLARE   TOTAL INT := 0; BEGIN   SELECT COUNT(1)     INTO TOTAL     FROM USER_TABLES A

檢視ORACLE 資料庫和列的相關資訊

本文全部轉載自:http://www.cnblogs.com/tearer/archive/2012/12/13/2815601.html 供自己收藏學習。 -------------------------------------------------------------------

Oracle資料庫—多查詢

內連線 select * from 表名 (別名) (inner) join 表名 (別名) on 連線條件 連線emp表和dep表(emp表中與dep表中的did是關聯欄位,這樣查詢did會出現2次): select * from emp,dep where emp.did = dep.did 相當

用inotify+rsync實現快速的實時同步

轉載:http://www.ttlsa.com/web/let-infotify-rsync-fast/ 背景 我們公司在用inotify+rsync做實時同步,來解決分散式叢集檔案一致性的問題。但當web檔案越來越多(百萬級數量html,jpg等小 檔案),同步就越來越

Oracle資料庫空間的所有表字段變為大寫

批量將空間內所有表的所有欄位名變成大寫: begin   for t in (select table_name tn from user_tables) loop       begin