在创建完数据源dsa之后,现在来看看如何在dsa的基础上去创建Cache Connect,从而和后台的Oracle数据库进行数据的同步。
首先必须安装Oracle数据库,如果TimesTen不是和Oracle在同一台服务器上的话,还必须在部署TimesTen的机子上安装相应的Oracle客户端,一般如果条件允许的话,最好是TimesTen和Oracle分开部署,免得竞争资源。不管安装的是Oracle客户端还是Oracle服务器,Cache Connect只支持如下的Oracle版本:
Oracle 10g Release 2 (Oracle 10.2.0.1.0 or above)
Oracle 10g Release 1 (Oracle 10.1.0.5.0 or above)
Oracle 9i Release 2 (Oracle 9.2.0.8.0 or above)
Oracle 10g Release 1 (Oracle 10.1.0.5.0 or above)
Oracle 9i Release 2 (Oracle 9.2.0.8.0 or above)
安装成功的标志就是在TimesTen的机子上能通过Sqlplus访问到Oracle数据库即可。
接下来必须配置系统的环境,比如LIBRARY 、PATH等,下面是TimesTen安装用户下的.bash_profile,可以参考一下。
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0
export ORACLE_SID=ORCLLIN
export ORACLE_TERM=xterm
export TIMESTEN=/home/tt705/TimesTen/tt705
export JAVA_HOME=/home/tt705/jdk1.6.0_07
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar:$TIMESTEN/lib
export LD_LIBRARY_PATH=$TIMESTEN/lib:$ORACLE_HOME/lib
export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0
export ORACLE_SID=ORCLLIN
export ORACLE_TERM=xterm
export TIMESTEN=/home/tt705/TimesTen/tt705
export JAVA_HOME=/home/tt705/jdk1.6.0_07
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar:$TIMESTEN/lib
export LD_LIBRARY_PATH=$TIMESTEN/lib:$ORACLE_HOME/lib
export PATH=$JAVA_HOME/bin:$TIMESTEN/bin:$ORACLE_HOME/bin:$PATH:$HOME/bin:
unset USERNAME
unset USERNAME
尤其要注意的是LD_LIBRARY_PATH,在Linux 和Solaris系统中,这个变量叫LD_LIBRARY_PATH;在AIX系统中,这个变量叫LIBPATH;在HP 32位系统中,叫SHLIB_PATH;在HP 64位系统中,叫LD_LIBRARY_PATH。具体可以参考标准文档中的install.pdf,千万不要弄混了。而且在配置LD_LIBRARY_PATH的时候,如果要使用Cache Connect的话,必须要包含Oracle的lib目录(且TimesTen的安装用户对这个目录有访问的权限),当然还有TimesTen自身的lib目录。因为使用Cache Connect的时候,底层要调用相应的库。
当然oracle数据库以及Listener必须启动。
lsnrctl> start
[oracle@west-mountain admin]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Dec 21 23:55:03 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> connect /as sysdba
SQL> startup
SQL>
SQL> startup
SQL>
至此,前期准备工作已经完成了。TimesTen安装的时候我们也选择包含了Cache Connect功能,否则的话就得卸掉重新安装了。在前面创建dsa数据源的时候,我们对数据源的定义如下:
[dsa] /*命名为dsa,即DataStore A*/
Driver=/home/tt1/TimesTen/tt70/lib/libtten.so /*每个安装对应的该 so 文件是固定的*/
DataStore=/home/tt1/TimesTen/tt70/info/dsa /*可以设置为自己的目录,但必须有相应的写权限*/
DatabaseCharacterSet=ZHS16GBK
PermSize=50
TempSize=10
在这些属性定义中,有一项DatabaseCharacterSet,必须和将要连接的Oracle数据库的字符集一样,否则必须destroy(ttdestroy dsa)掉当前的数据源,将这个属性改为一样,然后再登录。
可以在Oracle中通过下列语句确定Oracle的字符集。
SELECT value FROM nls_database_parameters WHERE parameter=’NLS_CHARACTERSET’;
所以最终的DSN定义如下:
[dsa] /*命名为dsa,即DataStore A*/
Driver=/home/tt1/TimesTen/tt70/lib/libtten.so /*每个安装对应的该 so 文件是固定的*/
DataStore=/home/tt1/TimesTen/tt70/info/dsa /*可以设置为自己的目录,但必须有相应的写权限*/
DatabaseCharacterSet=ZHS16GBK
PermSize=50
TempSize=10
OracleID=ORCLLIN
Driver=/home/tt1/TimesTen/tt70/lib/libtten.so /*每个安装对应的该 so 文件是固定的*/
DataStore=/home/tt1/TimesTen/tt70/info/dsa /*可以设置为自己的目录,但必须有相应的写权限*/
DatabaseCharacterSet=ZHS16GBK
PermSize=50
TempSize=10
OracleID=ORCLLIN
新加了一个OracleID属性,这个属性是通过Oracle的tnsname.ora得来的,是Service Name。因为在tnsname.ora中已经定义了ORCLLIN:
[oracle@west-mountain admin]$ pwd
/opt/oracle/product/10.2.0/network/admin
[oracle@west-mountain admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/10.2.0/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
/opt/oracle/product/10.2.0/network/admin
[oracle@west-mountain admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/oracle/product/10.2.0/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
ORCLLIN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = west-mountain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = west-mountain)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
……
在使用Cache Connect to Oracle的时候,牵涉到TimesTen和Oracle两边,所以两边的用户以及相应的权限,必须先创建配置好。在TimesTen这边,只有一种用户,就是哪个将真正操作数据,就创建哪个用户,但可能不只一个。在Oracle那边,有两种用户,一种是Cache Administrator用户,这个用户将为一个DSN的所有Cache Connect服务,比如负责在Oracle数据库那边建立相应的底层数据结构等等,所以一般建议创建单独的tablespace为这个用户;还有一种是最终的用户,也就是真正操作数据的用户,这个用户的用户名字必须和TimesTen的那个用户一模一样。
在试验中,我们将创建如下的客户:
操作数据的用户: tt1
Cache Admin : cacheadmin
密码均为oracle。
在Oracle中创建相应的用户并赋予权限:
sqlplus / as sysdba
SQL> create user tt1 identified by oracle default tablespace users;
SQL> create user cacheadmin identified by oracle default tablespace users;
SQL> grant connect, resource to tt1;
SQL> create user cacheadmin identified by oracle default tablespace users;
SQL> grant connect, resource to tt1;
SQL> grant dba to cacheadmin; //为简便起见,我们设置了dba权限给cache admin,其实不建议这么做的,cacheadmin各种情形下需要的权限请参考cacheconnect.pdf
在Oracle数据库中,用tt1用户登录,创建了表t1;然后用tt2用户登录创建表t2,且分别插入了两条不同的数据:
[oracle@west-mountain admin]$ sqlplus tt1/oracle
SQL> create table t1(a int not null primary key, b char(10));
SQL> insert into t1 values(1,’china’);
SQL> insert into t1 values(2,’us’);
SQL> commit;
SQL>
SQL> create table t1(a int not null primary key, b char(10));
SQL> insert into t1 values(1,’china’);
SQL> insert into t1 values(2,’us’);
SQL> commit;
SQL>
在TimesTen端创建相应的用户并赋予相应的权限:
[tt705@west-mountain info]$ ttisql dsa
Command> create user tt1 identified by ‘oracle’;
Command> grant admin,ddl to tt1;
Command>
Command> grant admin,ddl to tt1;
Command>
并设置好Cache Admin的用户名和密码,这个设置针对每个数据源只用调用一次即可,除非想变动cache admin,或者数据源被destroy。并启动cache agent。
Command> call ttcacheuidpwdset(’cacheadmin’,'oracle’);
Command> call ttcachestart;
Command> call ttcachestart;
另开一个ttisql控制台,用tt1用户登录并创建Cache Group:
[tt705@west-mountain info]$ ttisql "dsn=dsa;uid=tt1;pwd=oracle;oraclepwd=oracle"
Command> CREATE READONLY CACHE GROUP cache_t1 AUTOREFRESH INTERVAL 5 SECONDS
> FROM t1 (a int NOT NULL PRIMARY KEY, b char(10));
Command> cachegroups;
> FROM t1 (a int NOT NULL PRIMARY KEY, b char(10));
Command> cachegroups;
Cache Group TT1.CACHE_T1:
Cache Group Type: Read Only
Autorefresh: Yes
Autorefresh Mode: Incremental
Autorefresh State: Paused
Autorefresh Interval: 5 Seconds
Autorefresh: Yes
Autorefresh Mode: Incremental
Autorefresh State: Paused
Autorefresh Interval: 5 Seconds
Root Table: TT1.T1
Table Type: Read Only
Table Type: Read Only
1 cache group found.
Command> load cache group cache_t1 commit every 10 rows;
2 cache instances affected.
Command> select * from t1;
< 1, china >
< 2, us >
2 rows found.
Command>
Command> load cache group cache_t1 commit every 10 rows;
2 cache instances affected.
Command> select * from t1;
< 1, china >
< 2, us >
2 rows found.
Command>
创建成功了一个简单的readonly的cache group,且5秒钟刷新一次,所以以后只要oracle那边有新的数据插入,TimesTen这边将在5秒钟之后栓新这些数据。
这里要注意的是,Oracle那边的底层表,如果想被cache到TimesTen中,如上面的t1表,则该表必须要有主键或者唯一性索引。实际上,创建完cache group之后,在TimesTen已经有和oracle那边对应的表了,可以通过tables查看。
目前创建的是只读的cache group,如果想创建可修改的cache group,只是语法上不一样而已,当然必须启动replication agent(call ttrepstart)。因为可修改的cache group是通过 replication agent和oracle进行数据的同步的。这一点初学的时候往往忘记。
文章 (RSS)