天天看點

timesten系列五:如何定義cache,和背景oracle資料庫同步資料

TT最典型的應用,就是TT背景連接配接一個oracle資料庫,TT隻保留少量的最需要的資料以提供最快的通路速度,爾背景oracle資料庫則用來保留所 有的資料,在TT需要的時候,可以從oracle裡面自動抽取資料到TT,當然,TT裡面的資料也可以自動同步到oracle,這個功能,是目前其他記憶體 型資料庫暫時無法提供的,或者不可能做到這麼好的,畢竟TT和oracle是同一家公司的産品,當然能夠更好的無縫內建了。

在TT裡面,cache有下面幾種類型

1.read only

資料從oracle 自動重新整理到 TT裡面,TT裡面無法做修改。

典型應用是在TT裡面儲存隻讀的産品資訊,使用者資訊等等,定期從oracle重新整理該資訊

2.異步寫

資料在TT裡面更新,異步傳遞到oracle 。

這種比較适合在TT上面做事務性操作,然後同步到oracle

3.同步寫

資料在TT裡面更新,同步傳遞到oracle 。

這種比較适合在TT上面做事務性操作,然後同步到oracle

4.人工管理的cache

在這種模式下,資料可以同時在TT和oracle裡面更新,自動同步到對方。

這種方式最靈活,但是需要考慮資料沖突的問題,比如同時在oracle和TT上面修改統一條記錄,怎麼處理。

當然TT提供了基于時間戳的處理機制。

同步的原理是在oracle上面更新的資料會通過trigger捕獲記錄下來,然後通過cache agent定期來擷取這些資訊同步到TT。

而TT上的同步則是通過分析TT的記錄檔來獲得做了那些DML操作,然後通過cache agent同步到oracle .

由于我們第一次安裝TT的時候,沒有安裝 cache connect to oracle ,是以還無法實作和oracle的通信,

是以首先我們需要做得就是安裝 cache connect to oracle .

如果在配置cache之前,沒有安裝oracle client,請先安裝好oracle client 。

TT支援如下版本的oracle client

9.2.0.8 or above

10.1.0.5 or above

10.2.0.1 or above

很簡單的操作步驟,還是執行 setup.sh

./setup.sh -installCache ,然後安裝提示,一路next下去,就ok了,詳細資訊請看下面的log

[[email protected] linux86]$ ./setup.sh -installCache

There is 1 TimesTen instance installed locally :

1) tt70 (TimesTen7.0.5.0.0)

NOTE: There is only one instance which can be upgraded.

Instance Name : tt70

Product Installed : TimesTen7.0.5.0.0

Installation Directory : /oracle/timesten/TimesTen/tt70

BitLevel : 32

Component Installed : Client/Server and DataManager

Daemon Port : 17000

Would you like to upgrade this instance? [ yes ]

Extracting Cache Connect to Oracle ...

The following variables have been set in the file :

/oracle/timesten/TimesTen/tt70/bin/ttThunk

ORACLE_HOME=/oracle/product/10.2.0/db_1

LD_LIBRARY_PATH=/oracle/timesten/TimesTen/tt70/lib:/oracle/product/10.2.0/db_1/lib32:/oracle/product/10.2.0/db_1/network/lib32:/oracle/product/10.2.0/db_1/lib:/oracle/product/10.2.0/db_1/network/lib

Would you like to enable the Cache Connect to Oracle Administrator? [ yes ]

What TCP/IP port number would you like Cache Connect to Oracle Administrator to listen on? [ 17004 ]

NOTE: To access the TimesTen Cache Connect to Oracle Administrator

go to the url: http://localhost:17004/cache

Restarting the daemon ...

TimesTen Daemon stopped.

TimesTen Daemon startup OK.

End of TimesTen installation.

然後檢查timesten 使用者的.bash_profile檔案,确認 ORACLE_HOME是否設定為正确的oracle client的安裝目錄,

确認LD_LIBRARY_PATH ,一定要包含

$ORACLE_HOME/lib:$ORACLE_HOME/network/lib

然後在oracle上面建立 使用者,以便TT用來連接配接到oracle

sqlplus '/as sysdba'

create user tt identified by tt;

grant connect,resource to tt;

然後修改我們建立的wzy_tt70 data store的系統級DSN(info/sys.odbc.ini),加上如下資訊

#oracle資料庫使用者名

UID=tt

#oracle資料庫連接配接sid

OracleId=rac1

#oracle資料庫密碼

OraclePwd=tt

修改後的完整DSN如下(注意:DatabaseCharacterSet必須和oracle的一緻):

[wzy_tt70]

Driver=/oracle/timesten/TimesTen/tt70/lib/libtten.so

DataStore=/oracle/timesten/TimesTen/tt70/info/wzy/wzy

DatabaseCharacterSet=WE8ISO8859P1

Authenticate=0

PermSize=64

TempSize=16

UID=tt

OracleId=rac1

OraclePwd=tt

在oracle client端的tnsnames.ora 裡面添加一個名字叫rac1(對應上面定義的OracleId)的别名,如下

RAC1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = rac01-vip)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = rac)

(INSTANCE_NAME = rac1)

)

)

在oracle裡面建立一個測試表

sqlplus tt/[email protected]

create table t1(id number(2) primary key);

開始建立cache group ,

ttIsql wzy_tt70

Command>call ttCacheUidPwdSet('tt','tt'); #設定連接配接到oracle的使用者名和密碼

Command>call ttCacheStart; #啟動cache

建立一個read only的文法如下

CREATE READONLY CACHE GROUP readcache AUTOREFRESH INTERVAL 1 SECONDS FROM t1 (id number(2) not null primary key);

注意:from t1後面是跟oracle裡面需要同步的表的名字,一定要有同樣的列和字段類型,而且一定要有pk或者非空的唯一性索引字段

一個隻讀的cache group建立好了,然後從oracle裡面load一次資料,用如下文法:

LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;

然後在oracle裡面insert資料,看看是否能在TT裡面出現。

建立一個同步的cache group文法如下:

CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP update_t1

FROM t1 (id number(2) not null primary key);

其他的都和建立read only的文法一樣。。。

那我們最關心的應該還是建立一個使用者管理的cache group,因為隻有使用者管理的cache group ,才能實作

雙向的資料同步,資料可以在oracle上面修改,也可以在TT上修改,都能及時同步到對方。

建立一個使用者管理的cache group文法如下:

CREATE USERMANAGED CACHE GROUP update_anywhere_t1

AUTOREFRESH

MODE INCREMENTAL

INTERVAL 5 SECONDS

FROM t1(id number(2) primary key,PROPAGATE);

其他的操作和read only一樣,比如建立完成之後,需要第一次load資料 。

其中:MODE INCREMENTAL 說明我們從oracle裡面是用增量的方式同步資料(會在oracle上面自動建立trigger和額外的表來記錄oracle dml的資訊),INTERVAL 5 SECONDS 定義每5S從oracle同步一次資訊, 爾 PROPAGATE 則定義 TT的dml操作需要同步到 oracle 。。。

繼續閱讀