TimesTen內存數據庫-第四章 管理緩存集合

爲緩存集合配置系統

這部分總結將TimesTen主機配置爲Oracle Client並使用Cache Connect to Oracle特性來操作遠程Oracle服務器的指定步驟。

1.在TimesTen主機上安裝Oracle客戶端或Oracle數據庫。Oracle客戶端或數據庫必須在安裝TimesTen之前裝以防止使用Cache Connect特性時會出現問題。

2. 爲特定的操作系統配置環境變更。

3. 安裝TimesTen。

4. 如果打算使用基於Web的Cache Administrator,配置內植的web服務器。

5. 如果在TNSNAMES.ORA文件中定義Oracle Service Names,要使用系統級TNSNAMES.ORA文件。TimesTen的主守護程序、緩存代理、web服務器和複製代理將使用系統級TNSNAMES.ORA文件中提供的信息。不要使用不同的TNSNAMES.ORA文件來配置Oracle客戶端。

注意:TimesTen不支持Oracle Name Server for Windows clients。

在UNIX平臺上配置Cache Connect to Oracle

爲TimesTen用戶環境和啓動TimesTen守護程序(根)的用戶環境設置環境變量:

• 設置ORACLE_HOME環境變量爲Oracle Client安裝目錄的路徑。例如:

$ORACLE_HOME = /oracle/ora10g

• 對於32-位和64-位Oracle/TimesTen安裝應該包括LD_LIBRARY_PATH或SHLIB_PATH環境變更:

$ORACLE_HOME/lib

$ORACLE_HOME/network/lib

install_dir/lib

例如:

LD_LIBRARY_PATH = $ORACLE_HOME/lib:$ORACLE_HOME/network/lib:

/timesten/myinstance/lib

注意:如果使用32-位TimesTen安裝而配置64-位Oracle服務器,則庫路徑是$ORACLE_HOME/lib32。

• PATH環境變量應該包括:

$ORACLE_HOME/bin

install_dir/bin

例如:

PATH = $ORACLE_HOME/bin:/timesten/myinstance/bin

在Window系統中配置Cache Connect to Oracle

必須設置PATH系統環境變量包括:

Oracle_install_dir/bin

install_dir/lib

install_dir/bin

例如:

PATH = C:/Oracle/Ora10g/bin;C:/timesten/myinstance/lib;

C:/timesten/myinstance/bin;

Oracle數據庫中安裝任務

這部分將討論操作Oracle DBA必須使用system帳號在Oracle數據庫上執行。

創建Oracle用戶並設置權限

必須指定一個Oracle用戶和口令以訪問Oracle表和創建緩存集合。所有Oracle用戶帳號必須授予CREATE SESSION權限,以使用Cache Connect to Oracle。一些Cache Connect to Oracle操作要求另外的Oracle用戶權限。

一些Cache Connect to Oracle操作要求一個使用另外Oracle權限的獨立的用戶。因爲可能要求只授予另外緩存管理用戶權限來選擇用戶,所以Cache Connect to Oracle允許創建一個獨立的緩存管理用戶帳號。

關於用於每個Cache Connect to Oracle操作的Oracle用戶和緩存管理用戶最小權限顯示在表 4.1中。對一每個緩存管理用戶的權限必須包括所有Oracle表可以被緩存到數據存儲中,同時Oracle用戶也需要特定的指定在由用戶創建的緩存集合中的Oracle表的權限。參閱例 4.1。

表 4.1 對於緩存集合操作的Oracle權限要求

緩存集合操作

授予Cache Connect to

Oracle用戶的最小權限

授予緩存管理用戶的最小權限

所有操作

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

一個也不需要

CREATE READONLY

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

CREATE

SYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一個也不需要

CREATE

ASYNCHRONOUS

WRITETHROUGH

CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT②

• UPDATE②

• DELETE ②

• QUERY REWRITE③

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

CREATE

USERMANAGED CACHE

GROUP(參閱併發行中的變量)

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

一個也不需要

CREATE

USERMANAGED CACHE

GROUP

.....加上 PROPAGATE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT

• UPDATE

• DELETE

一個也不需要

CREATE

USERMANAGED CACHE

GROUP

.....加上 AUTOREFRESH

INCREMENTAL

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• QUERY REWRITE ③

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• UNLIMITED TABLESPACE

(或在表空間上適當的空間引用 )

• CREATE TABLE①

• CREATE ANY TRIGGER①

LOAD CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

REFRESH CACHE

GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

FLUSH CACHE GROUP

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

• INSERT TABLE

• UPDATE TABLE

-

使用Real Application Clusters 進行配置的所有操作

• 在Oracle數據庫上CREATE SESSION

• SELECT TABLE

在Oracle GV$SESSION上SELECT動態性能視圖

① 如果Oracle對象是手工安裝的,不要求創建緩存集合

② 不強從TimesTen執行

③ 只對於Oracle server version 9.2纔要求

例 4.1 需要爲兩個用戶SamJohn設立權限,使每個用戶可以發送一條CREATE READONLY CACHE GROUP語句來各自創建只讀緩存集合。Sam創建一個緩存Oracle表TTUSER.TABLEA的緩存集合,John創建另一個緩存Oracle TTUSER.TABLEB的緩存集合。

爲了提供SamJohn充足的Oracle權限來CREATE READONLY CACHE GROUP,需要創建兩個Oracle用戶帳號,並且其中一個緩存管理用戶帳號將擁有擴展的權限。緩存管理用戶的名稱爲User2

• oracleUID = Sam

• oracleUID = John

• cacheUid = User2

在Oracle上創建帳號:

SQL> CREATE USER Sam IDENTIFIED BY Samspwd DEFAULT TABLESPACE users;

SQL> CREATE USER John IDENTIFIED BY Johnspwd DEFAULT TABLESPACE users;

SQL> CREATE USER User2 IDENTIFIED BY User2pwd DEFAULT TABLESPACE users;

然後爲每個用戶分配下列權限:

SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEA TO Sam;

SQL> GRANT CREATE SESSION, SELECT ON TTUSER.TABLEB TO John;

SQL> GRANT

> CREATE SESSION,

> SELECT ON TTUSER.TABLEA, TTUSER.TABLEB,

> UNLIMITED TABLESPACE,

> CREATE TABLE,

> CREATE ANY TRIGGER

> TO User2;

SQL>

爲緩存管理用戶創建一個獨立的表空間

TimesTen強烈推薦爲緩存管理用戶創建一個獨立的表空間。此表空間用作緩存管理用戶的缺省表空間。此表空間包含有每個Oracle表的自動刷新觸發器、變化日誌表和其它對於每個緩存集合用戶TimesTen需要的對象。如果不指定一個獨立的表空間,這些對象將放在Oracle system表空間中。

當在Oracle上創建緩存管理用戶時,要指定表空間。也可以創建用戶之後使用Oracle ALTER USER語句的DEFAULT TABLESPACE子句來指定表空間。

例 4.2 例 4.1 顯示怎樣創建並授權給緩存管理用戶User2。爲了給User2指定一個名爲cacheuser的獨立表空間,在Oracle中輸入下列語句:

SQL> ALTER USER User2 IDENTIFIED BY User2pwd

DEFAULT TABLESPACE cacheuser;

每個緩存的Oracle表的變化日誌表駐留在緩存管理用戶表空間中。對於Oracle表上每次更新,將爲此Oracle表向變化日誌表插入一行(一條變化記錄)。變化日誌記錄的字節大小如下:

變化日誌記錄的大小 = Oracle表上主鍵的大小 + 250

變化日誌表中的記錄數將依賴於Oracle表的更新率和TimesTen上的自動刷新間隔。每隔20秒,TimesTen將刪除已經應用到緩存相關Oracle表的數據存儲的變化日誌記錄。

當緩存管理用戶表空間寫滿時

當緩存管理用戶表空間變寫滿時,自動刷新觸發器將通過刪除已存在的變化日誌記錄來爲新變化日誌記錄產生空間。這將引起一些TimesTen數據存儲上一些表的完全自動刷新。

如果表空間寫滿,檢查如下內容:

• 是否正在創建一個緩存集合或正在複製一個數據存儲?這些臨時操作將停止變化日誌表上的清除操作。

• TimesTen數據存儲上的緩存代理是否正在運行?如果緩存代理沒有運行,變化日誌記錄將堆積。

• 在數據存儲中是否沒有通過刪除自動刷新緩存集合而拋棄的數據存儲?在這種情況下,變化日誌記錄也將堆積。

爲緩存表定義DSN

緩存Oracle數據的數據存儲必須定義爲系統DSN,不能作爲User DSN,如果TimesTen緩存不定義爲System DSN,則TimesTen Cache Administrator就不能進行工作,而且ttAdmin也不能啓動TimesTen緩存代理。

DSN路徑必須是一個絕對值。

當爲了緩存Oracle表創建DSN時,DSN的屬性必須如下設置:

• Logging 必須激活爲disk-based。

• LockLevel 必須激活row-level locking。(Cache Connect to Oracle不支持database-level locking。)

• Isolation 可以是任何isolation模式。

• OracleID 必須設置爲Oracle Service Name for Oracle 9i和以後的Oracle版本。

• PassThrough 可以設置來控制程序和SQL語句是在本地的TimesTen緩存中執行或是傳遞到Oracle。

• DatabaseCharacterSet 必須與Oracle數據庫字符集相同。

• TypeMode 必須設置爲0(Oracle)。

下列屬性可以指定爲DSN屬性或作爲連接屬性:

• Oracle User ID指定Oracle用戶ID。此字符串通過設置UID連接屬性來間接指定。相應的UNIX平臺上的DSN屬性是UID。在Window系統中,相應的DSN屬性是User ID。

• OraclePWD 爲Oracle用戶指定口令。

用來連接到Oracle的用戶名和口令將從DSN定義的屬性中或ODBC連接串中取出。在連接串中給出的值將覆蓋指定DSN中的值。

例如,可以在ttIsql連接串中指定Oracle UID和OraclePWD

ttIsql -connStr "DSN=cgDSN; UID=testuser; OraclePWD=mypsswrd"

如果通過ODBC應用發送更新並提交,必須在連接串中指定用戶名和口令。例如:

SQLDriverConnect(hdbc, ..., "DSN=cgDSN; UID=testuser;

OraclePWD=mypsswrd", ...);

在UNIX平臺上 例如,爲UNIX平臺上的myOraCache定義就如下形式:

[myOraCache]

DataStore=/users/OracleCache/hotData

Authenticate=0

Logging=1

LockLevel=0

PermSize=40

TypeMode=0

DurableCommits=1

OracleID=system1

UID=testuser

OraclePWD=mypsswrd

DatabaseCharacterSet=WE8ISO1559P1

在Windowt系統中 在ODBC TimesTen Setup dialog的Oracle Data Loading窗口中指定OracleID

啓動和停止緩存代理

一個TimesTen進程調用一緩存代理來執行異步緩存操作,如加載或刷新緩存集合。許多Cache Connect to Oracle操作可以直接通過TimesTen進行,而不需要緩存代理的協助。

如果下列之一或多個情形爲真,則必須爲每個包含緩存集合的數據存儲啓動一個獨立的緩存代理:

• 緩存集合爲READONLY。

• 緩存集合爲USERMANAGED並且包含一條AUTOREFRESH子句。

• 應用加載或刷新緩存集合。

可以從命令行或一個程序來爲一個DSN啓動緩存代理。

也可從基於瀏覽器的Cache Administrator來啓動緩存代理。

注意:如果安裝TimesTen時激活了Access Control,必須擁有數據存儲的ADMIN權限來啓動或停止緩存代理。另外,TimesTen用戶名必須與Oracle用戶名相匹配(應用到內部和外部的用戶名)。

從命令行控制緩存代理

使用ttAdmin工具來從命令行控制緩存代理。可以使用ttAdmin來:

• 從命令行設置緩存管理用戶ID和口令

• 從命令行啓動緩存代理

• 從命令行停止緩存代理

• 從命令行設置代理啓動性質

從命令行設置緩存管理用戶ID和口令

如果使用下列之一的緩存集合類型,則必須有一個擁有相應Oracle權限的緩存管理用戶帳號:

• ASYNCHRONOUS WRITETHROUGH緩存集合

• READONLY緩存集合

• 使用AUTOREFRESH屬性的USERMANAGED緩存集合

緩存管理用戶ID必須遵守下列規則:

• 長度爲1到30字節。

• 必須以字母開頭。

• 只能包含ASCII字母、下劃線(_)、美元符號($)和英鎊符號(#)。

緩存管理口令必須遵守下列規則:

• 長度爲1到30字節。

• 可以包含除了分號(;)外的任何ASCII字符。

在啓動緩存代理之前設置緩存管理用戶ID和口令。使用如下語法:

ttAdmin -cacheUidPwdSet -cacheUid cacheUid -cachePwd cachePwd DSN

注意:如果數據存儲中有自動刷新或AWT緩存集合,則緩存管理用戶ID和口令不能進行重新設置。在重新設置緩存管理用戶ID和口令之前,必須刪除那些緩存集合。

例 4.3 ttAdmin -cacheUidPwdSet -cacheUid testuser -cachePwd mypass myOraCache

如果改變了緩存管理用戶ID或口令,則必須重新啓動緩存代理。

注意:如果在數據存儲中沒有緩存集合,則不要設置緩存管理用戶ID和口令。如果沒有緩存集合時設置了它們,將不會使用緩存管理用戶ID和口令,並校驗到Oracle數據庫。

從命令行啓動緩存代理

爲了人命令行啓動緩存代理,使用如下語法:

ttAdmin -cacheStart DSN

例 4.4 ttAdmin -cacheStart myOraCache

如果試圖爲在DSN中使用相關路徑標識的數據存儲啓動緩存代理,TimesTen將搜索TimesTen運行和失敗的相關數據存儲。例如,在Window系統中,如果在DSN中爲數據存儲指定路徑爲DataStore=./dsn1,並且試圖使用下面命令啓動緩存代理:

ttAdmin -cacheStart dsn1

緩存代理在install_dir/srv/dsn1中搜索數據存儲。將不能在此位置找到數據存儲,也不能啓動緩存代理。對於UNIX,緩存代理將查找:

/var/TimesTen/ttversion/bits

從命令行停止緩存代理

爲了停止代理,使用如下語法:

ttAdmin -cacheStop DSN

例 4.5 ttAdmin -cacheStop myOraCache

注意:使用AUTOREFRESH特性時,在刪除或改變緩存集合之後,不要立即停止緩存代理。應該至少等待2分鐘。緩存代理需要這個時間來清除AUTOREFRESH使用的Oracle對象。

從命令行設置緩存代理啓動性質

可以通過調用ttCachePolicySet程序來設置緩存代理啓動性質。使用ttCachePolicyGet程序來返回當前的性質。

缺省的緩存代理啓動性質是manual。如果要在TimesTen守護程序重新啓動時將緩存代理自動重新啓動,則設置緩存代理性質爲always。一旦設置性質爲always,緩存代理將立即啓動。

例 4.6 設置緩存代理性質爲always

CALL ttCachePolicySet ('always');

從程序控制緩存代理

爲了從程序中控制數據存儲的緩存代理,首先連接到數據存儲。使用ttCacheUidPwdSetttCacheStart、ttCacheStopttCachePolicySet程序來執行下列任務:

• 從程序設置緩存管理用戶ID和口令

• 從程序啓動緩存代理

• 從程序停止緩存代理

• 從程序設置緩存代理性質

注意:如果Access Control被激活,則需要ADMIN權限來爲緩存代理和複製代理進行啓動、停止和設置性質。也需要ADMIN權限來設置緩存管理用戶ID和口令。

從程序設置緩存管理用戶ID和口令

如果使用下列類型之一的緩存集合,必須有一個擁有相應Oracle權限的緩存管理用戶帳號:

• ASYNCHRONOUS WRITETHROUGH緩存集合

• READONLY緩存集合

• 使用AUTOREFRESH屬性的USERMANAGED緩存集合

緩存管理用戶ID必須遵守下列規則:

• 長度爲1到30字節。

• 必須以字母開頭。

• 只能包含ASCII字母、下劃線(_)、美元符號($)和英鎊符號(#)。

緩存管理口令必須遵守下列規則:

• 長度爲1到30字節。

• 可以包含除了分號(;)外的任何ASCII字符。

在啓動緩存代理之前設置緩存管理用戶ID和口令。使用ttCacheUidPwdSet程序。

例 4.7 在此例中,通過連接句柄hdbc指定數據存儲。緩存管理用戶ID爲testuser,並且緩存管理用戶口令爲mypass

sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt2 );

rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );

從程序啓動緩存代理

使用ttCacheStart程序來啓動緩存代理。

例 4.8 在此例中,通過連接句柄hdbc指定數據存儲。

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

注意:如果自動提交非激活,則必須在提交之前之後調用ttCacheStart

從程序停止緩存代理

使用ttCacheStop程序來停止緩存代理。

例 4.9 sprintf( stmt, "CALL ttCacheStop()" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

ttCacheStop程序有一個選項參數stopTimeout,用來指定TimesTen守護程序要等多長時間才停止緩存代理。如果緩存代理在指定的時間內沒有停止,則TimesTen守護程序將停止緩存代理。stopTimeout的缺省值是100秒。0值指定永遠等待下去。

例 4.10 爲了停止緩存代理,並設置stopTimeout爲160秒:

sprintf( stmt, "CALL ttCacheStop(160)" );

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

從程序設置緩存代理啓動性質

可以通過調用ttCachePolicySet程序來設置緩存代理啓動性質。使用ttCachePolicyGet程序來返回當前的性質。

缺省的緩存代理啓動性質是manual。如果要在TimesTen守護程序重新啓動時將緩存代理自動重新啓動,則設置緩存代理性質爲always。一旦設置性質爲always,緩存代理將立即啓動。

例 4.11 設置由hdbc連接句柄指定數據存儲的緩存代理啓動性質爲always

sprintf( stmt, "CALL ttCachePolicySet ('always')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

檢查緩存代理的狀態

可以使用ttStatus工具或ttDataStoreStatus程序來檢查正在運行的TimesTen緩存代理。

例 4.12 爲了使用ttStatus工具來確認位於c:/temp/cgds的數據存儲的緩存代理正在運行,輸入:

C:/>ttStatus

TimesTen status report as of Wed Apr 07 15:04:45 2004

Daemon pid 484 port 15000 instance MYCOMPUTER

No TimesTen server running

--------------------------------------------------------------

Data store c:/temp/cgds

There are 4 connections to the data store

Data store is in shared mode

Shared Memory KEY Global/DBI3cd02077.0.SHM.26 HANDLE 0x380

Subdaemon pid 964 context 0x5d82d0 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x97b200 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x1427c70 connected (KEY

Global/DBI3cd02077.0.SHM.26)

Process pid 2040 context 0x144bd70 connected (KEY

Global/DBI3cd02077.0.SHM.26)

TimesTen's cache agent is running for this data store

cache agent restart policy: manual

可以使用帶有-query選項的ttAdmin工具來確認爲數據存儲設置的性質,包括緩存代理的重啓性質。

例 4.13

C:/>ttAdmin -query cgDSN

RAM Residence Policy : inUse

Replication Agent Policy : manual

Replication Manually Started : False

cache agent Policy : manual

cache agent Manually Started : True

例 4.14 如果已經創建了一個AWT緩存集合,並且數據存儲已經啓動複製代理,則ttStatus工具也報告Oracle和複製代理的狀態。在此例中,複製和緩存代理正在運行。

C:/> ttStatus

TimesTen status report as of Wed May 4 13:44:30 2005

Daemon pid 25337 port 16000 instance -

No TimesTen server running

No TimesTen webserver running

-----------------------------------------------------------------

------- Data store /datastore/cache There are 15 connections to

the data store Data store is in shared mode Shared Memory KEY

0x260e30c2 ID 521502725

Cache agent pid 25545 context 0x82fd820 name timestenorad

connid 2 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0x832d798 name timestenorad

connid 4 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0x8335198 name timestenorad

connid 3 connected (KEY 0x260e30c2)

Cache agent pid 25545 context 0xaf27ad08 name timestenorad

connid 6 connected (KEY 0x260e30c2)

Process pid 25485 context 0x80bd8b0 name cache connid 8

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x8193110 name connid 7

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x81bddb0 name connid 9

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x81e53f8 name connid 12

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x82040d8 name connid 5

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x8229148 name connid 10

connected (KEY 0x260e30c2)

Replication pid 25559 context 0x824e1b8 name connid 11

connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x8092960 name Worker connid

2044 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x8110140 name Flusher connid

2045 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x813a838 name Checkpoint

connid 2047 connected (KEY 0x260e30c2)

Subdaemon pid 25350 context 0x81608f8 name Monitor connid

2046 connected (KEY 0x260e30c2)

Replication policy : Manual

Replication agent is running.

Cache agent policy : Manual

TimesTen's Cache agent is running for this data store

爲AWT緩存集合啓動複製代理

如果使用異步寫(AWT)緩存集合,必須啓動複製代理。

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP 語句將創建一個複製計劃以激活數據存儲與Oracle數據庫之間的通信。複製計劃完全由TimesTen管理,不需要用戶介入。使用DROP CACHE GROUP語句刪除AWT緩存集合時,複製計劃也將被刪除。

可能通過使用帶有-repStart選項的ttAdmin工具從命令行啓動複製代理。

例 4.15 AWTdsn數據存儲啓動複製代理。

ttAdmin -repStart AWTdsn

也可以通過使用ttRepStart程序從程序啓動複製代理。

例 4.16 一個緩存管理用戶的ID爲testuser,口令爲mypass,可以使用:

• ttCacheUidPwdSet 程序來設置緩存管理用戶ID和口令

• ttCacheStart 程序來啓動緩存代理

• ttRepStart 程序來爲AWTdsn數據存儲啓動複製代理

sprintf( stmt, "CALL ttCacheUidPwdSet('testuser','mypass')");

rc = SQLAllocStmt( hdbc, &hstmt );

rc = SQLExecDirect( hstmt, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttCacheStart()" );

rc = SQLAllocStmt( hdbc, &hstmt2 );

rc = SQLExecDirect( hstmt2, (SQLCHAR *) stmt, SQL_NTS );

sprintf( stmt, "CALL ttRepStart()" );

rc = SQLAllocStmt( hdbc, &hstmt3 );

rc = SQLExecDirect( hstmt3, (SQLCHAR *) stmt, SQL_NTS );

注意:在爲AWT緩存集合發送一條CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP或DROP CACHE GROUP語句之前,要停止複製代理(如ttAdmin -repStop DSN)。

應用緩存集合定義到數據存儲

如果有定義緩存集合的SQL文件,就可以在TimesTen數據存儲上使用帶有-f選項的ttIsql工具來執行此SQL。語法是::

ttIsql -f file.sql DSN

例 4.17 如果緩存集合在名爲CG1.sql的文件中定義,可以在名爲cgDSN的DSN上執行此文件,輸入:

C:/> ttIsql -f CG1.sql cgDSN

也可以從ttIsql命令行執行包含緩存集合定義的SQL文件。例如:

Command> run CG1.sql

設置passthrough級別

應用通過TimesTen連接可以發送SQL語句到TimesTen或Oracle。

SQL是否被直接傳送到TimesTen或Oracle將依賴於SQL語句的組成和PassThrough連接屬性的設置。可以設置PassThrough屬性來定義SQL語句的類型:是由本地的TimesTen處理,還是重定向到Oracle。

例如,可以設置PassThrough=0(缺省值)來指定所有SQL都在TimesTen中執行或PassThrough=3來指定所有SQL被傳送到Oracle去執行。

如圖 4.1顯示,可以設置PassThrough=1來爲一個不在TimesTen中的目標表或在TimesTen中產生的一條語法錯誤傳送SQL。例如,一條到緩存表(Table A)的UPDATE 在TimesTen緩存中被處理,同時一條到在TimesTen中找不到的表(Table G)的UPDATE被傳送到Oracle。同樣地,TimesTen的設置程序如ttCacheStartttCkpt,由TimesTen處理,同時不支持的過程將傳送到Oracle。

圖 4.1 PassThrough=1

clip_image040

對於PassThrough=1的設置,沒有DDL語句會傳送到Oracle。TimesTen中不存在的過程將被傳送到Oracle:如果對於緩存集合表DML語句包含錯誤語法,就不會發送到Oracle。但是,所有包含錯誤語法的SELECT語句將被髮送到Oracle。

對於所有的passthrough級別,如果事務有任何DDL或DML語句傳送到Oracle,則提交和回滾將在Oracle和TimesTen中都要執行。否則,將只在TimesTen中執行。

READONLY緩存集合禁止在緩存集合中使用DML語句的更新。如果計劃使用READONLY緩存集合,可以設置PassThrough=2來直接將緩存集合中所有表的DML語句定向到Oracle。否則,此設置將於PassThrough=1時一樣,因此所有DDL語句、兼容的非DML語句及過程將直接到TimesTen。相同的passthrough情形也應用到USERMANAGED緩存集合中的READONLY表。例如,考慮如圖4.1所示的緩存集合示例。如果在Table A上設置了READONLY屬性,並且PassThrough = 2,一條到Table A的UPDATE將被傳送到Oracle。

在AWT和SWT緩存集合的表DML操作不推薦使用passthrough特性。在被定義爲異步的AWT集合中通過緩存進行的更新,passthrough將同步實施,可能將產生非預期結果。如果運用passthrough特性,SWT緩存集合中的更新可能導致自死鎖。

Passthrough和參數綁定

確保應用爲傳送語句提供正確的SQL數據類型。ODBC驅動器將轉換C和SQL類型,並向TimesTen傳送轉換的數據和SQL類型碼。TimesTen傳遞此信息到Oracle。

TimesTen處理passthrough語句的參數與在TimesTen中它自己執行語句中的參數不同。TimesTen查詢優化將爲TimesTen語句的參數分配數據類型。應用將獲得分配的數據類型來使用SQLDescribeParam ODBC函數。與此相比,passthrough語句的參數將不會爲它們分配數據類型。TimesTen將報告passthrough語句的參數的數據類型爲VARCHAR2(4000)。此數據類型只是一個佔位符。它不意謂着TimesTen期望作爲VARCHAR2數據來接收此參數值。作爲替代,當應用調用SQLBindParameter ODBC函數時,必須通知TimesTen關於passthrough語句參數的數據類型。SQLBindParameter的fSqlType參數指定參數的SQL數據類型。如果使用,cbColDef和ibScale參數指定精度和比例。

例如,爲了綁定一個SQL數據類型INTEGER的參數爲NUMBER(3)參數,使用下列參數調用SQLBindParameterODBC函數:

fCType=SQL_C_SLONG

fSqlType=SQL_DECIMAL

cbColDef=3

ibScale=0

二選其一,也可以使用下列參數:

fCType=SQL_C_SLONG

fSqlType=SQL_INTEGER

cbColDef=0

ibScale=0

對於SQL_INTEGER,cbColDef和ibScale參數將被忽略。

改變passthrough級別

可以在ttIsql會話中使用passthrough命令來覆蓋DSN中PassThrough的設置。也可以爲指定的事務通過調用ttOptSetFlag程序並指定‘passthrough’作爲optflag參數和新的passthrough設置作爲optval參數來重新設置passthrough。新的passthrough設置將立即產生影響。在事務的最後,passthrough將被重置爲原來指定在PassThrough屬性中的值。

注意:PassThrough的行爲如同任何其它的優化標誌。當執行語句時準備的語句是使用的級別時,將建立PassThrough級別。如果在准許語句和執行它之間改變了PassThrough級別,則在執行中將使用原來的PassThrough級別。

監視緩存集合

以下部分將討論怎樣得到緩存集合的配置信息和怎樣監視緩存集合的狀態。

使用ttIsql cachegroup命令

可以通過使用ttIsql cachegroup命令來獲得關於數據存儲中當前使用中的緩存集合的信息,如下面例4.18所示。

例 4.18

Command> cachegroup;

Cache Group TESTUSER.CUSTOMERORDERS:

AutoRefresh Mode: Incremental

AutoRefresh State: On

AutoRefresh Interval: 5 Minutes

Root Table: TESTUSER.CUSTOMER

Where Clause: (none)

Type: Read Only

Child Table: TESTUSER.ORDERTAB

Where Clause: (none)

Type: Read Only

Cache Group TESTUSER.TABCACHE:

Root Table: TESTUSER.TAB3

Where Clause: (none)

Type: Propagate

2 cache groups found.

監視自動刷新緩存集合

TimesTen提供下列工具來監視自動刷新緩存集合:

• ttCacheAutorefreshStatsGet內部程序

• 支持日誌中的信息

• 一個可以在Oracle數據庫中執行的SQL腳本來顯示關於變化日誌表的信息

• ttTraceMon工具的AUTOREFRESH組成

• SNMP陷阱

爲READONLY、AUTOREFRESH和AWT緩存集合管理Oracle對象

READONLY緩存集合和一些USERMANAGED緩存集合使用AUTOREFRESH特性來自動將Oracle更新刷新到TimesTen緩存中。

可以爲緩存集合建立完全或增量自動刷新模式。當配置爲增量自動刷新時,TimesTen將爲緩存集合中的每個Oracle基表要求創建一個觸發器、日誌表和其它對象。每次在Oracle基表上的插入、更新和刪除操作將啓動觸器。觸發器將在日誌表中記錄更新記錄的主鍵。TimesTen緩存代理將定期搜索日誌表中的更新鍵和關聯的被更新的Oracle基表以得到最近更新的快照。

使用AUTOREFRESH INCREMENTAL屬性創建緩存集合時,自動刷新的要求的Oracle對象將被自動安裝。二選其一,可以手工安裝Oracle對象,以允許用戶使用較小的Oracle權限來創建要使用觸發器的緩存集合。

在安裝Oracle對象之前,必須:

• 有一個授予了額外的緩存管理用戶權限的緩存管理用戶帳號。

• 使用ttCacheUidPwdSet設置緩存管理用戶ID和口令。

• 啓動緩存代理。

對於每個緩存管理用戶,TimesTen將創建下列各表,version是一個內部TimesTen版本號:

• TT_version_USER_COUNT

• TT_version_AGENT_STATUS

• TT_version_SYNC_OBJS

對於緩存集合中的每個表,TimesTen將創建下列對象,number是原Oracle表的對象ID,version是一個內部TimesTen版本號。

對象

描述

TT_version_number_L

爲記錄到Oracle表的變化變化日誌表。

TT_version_number_T

在變化日誌表記錄變化的觸發器。當在緩存表中有插入、刪除和更新時被觸發。

AWT緩存集合請求一個額外的Oracle對象。將在Oracle上創建一個名爲TT_version_REPPPEERS的表用來跟蹤狀態和最近應用到Oracle的語句。此表將由CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP語句自動創建。二選其一,可以創建AWT緩存集合之前手工創建此Oracle表。

如果AWT緩存集合是一個活動的複製計劃備用對的一部分,則當創建活動的備用對時,一個名爲TT_version_REPACTIVESTANDBY將在Oracle上被自動創建。

TimesTen將下列表的SELECT、INSERT、UPDATE和DELETE的權限授予給user PUBLIC:

• TT_version_number_L

• TT_version_USER_COUNT

• TT_version_REPPEERS (爲AWT緩存集合創建)

• TT_version_REPACTIVESTANDBY (爲活動的備用複製計劃中的AWT緩存集合創建)

自動安裝Oracle對象

爲了直接使TimesTen自動安裝Oracle對象,確保緩存管理用戶擁有所有要求的自動創建Oracle對象的權限。當以PAUSED或ON狀態創建緩存集合或緩存集合狀態被改爲PAUSED或ON時,將自動創建Oracle對象。

例 4.19 顯示怎樣直接使TimesTen爲READONLY緩存集合自動安裝Oracle對象。

1. 使用ttIsql來連接到cgDSN數據存儲。

2. 調用ttCacheUidPwdSet程序來爲數據存儲設置緩存管理用戶ID(testuser)和口令。

3. 調用ttCacheStart程序來啓動緩存代理。

4. 使用CREATE READONLY CACHE GROUP來創建一個READONLY緩存集合,此集合有AUTOREFRESH INCREMENTAL值,並且STATE被設置爲缺省值PAUSED。

例 4.19

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheStart();

Command> CREATE READONLY CACHE GROUP readcache

FROM

user1.readtab

(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));

例 4.20 顯示怎樣直接使TimesTen爲AWT緩存集合自動安裝Oracle對象。

例 4.20

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheStart();

Command> CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache

FROM user1.writetab (a NUMBER NOT NULL PRIMARY KEY,b VARCHAR2(31));

手工安裝Oracle對象

如果不需要授予用戶完全自動安裝Oracle對象的CREATE權限設置,可以手工安裝Oracle對象,並允許用戶使用較少的權限來創建AWT緩存集合和使用AUTOREFRESH INCREMENTAL屬性的緩存集合。

對象的安裝必須授予與選擇自動安裝選項的用戶相同的Oracle權限。

獲得SQL碼需要通過下方式之一從TimesTen創建Oracle對象:

• 從ttIsql提示符,輸入一條帶有INSTALL標誌的cachesqlget命令。

• 從一個程序中,調用ttCacheSqlGet內部程序並指定參數install_flag爲‘1’。

注意:當獲得SQL碼來安裝Oracle對象時,也應該產生一個來獲得SQL碼的腳本並保存它以在以後用來刪除對象。

在已經獲得SQL碼以後,就可以通過在Oracle主機上啓動SQL*Plus來手工創建Oracle對象,登錄如下:

sqlplus cacheUid/cachePwd@machine_name

在SQL>提示符,輸入SQL碼來創建對象。

例 4.21 使用ttIsql來連接到數據存儲。然後調用ttCacheStart程序來爲數據存儲啓動緩存代理。緩存管理用戶ID是testuser,口令爲mypsswrd。下一步,使用CREATE CACHE GROUP來創建一個READONLY緩存集合,AUTOREFRESH STATE設置爲OFF,並運行cachesqlget命令來獲取必須的SQL來安裝Oracle對象:

> ttIsql cgDSN

Command> call ttCacheUidPwdSet('testuser', 'mypsswrd');

Command> call ttCacheStart();

Command> CREATE READONLY CACHE GROUP readcache

AUTOREFRESH

MODE INCREMENTAL

INTERVAL 30 SECONDS

STATE OFF

FROM user1.readtab

(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));

Command> cachesqlget readcache install;

從cachesqlget的輸出相似如下:

CREATE TABLE system.tt_version_user_count(tableName VARCHAR2(65),

userCount

.... more code .....

END;

.

RUN;

可以從TimesTen剪貼和粘貼此SQL到Oracle上的SQL*Plus提示符:

SQL> CREATE TABLE system.tt_version_user_count(tableName

VARCHAR2(65), userCount

.... more code .....

END;

.

RUN;

二選其一,可以請求ttIsql將cachesqlget輸出到一個在命令行中提供的輸出文件名稱的一個文件將其保存。然後可以拷貝此文件到Oracle系統並執行此文件來安裝Oracle對象。

注意:如果手工安裝Oracle對象,必須要手工刪除它們。

手工爲AWT緩存集合安裝Oracle對象

當手工爲AWT緩存集合安裝Oracle對象時,必須在爲Oracle實例創建AWT緩存集合之前安裝。對於每個Oracle實例和緩存管理用戶ID和口令,對象只需要安裝一次。

執行下列任務來爲一個AWT緩存集合安裝Oracle對象:

1. 在ttIsql會話中使用ttCacheUidGet程序來檢查是否已經設置緩存管理用戶ID和口令。在此例中,DSN爲cgDSN。NULL結果表示還沒有爲cgDSN設置緩存管理用戶ID和口令。

> ttIsql cgDSN

Command> call ttCacheUidGet();

< >

1 row found.

2. 通過使用ttCacheUidPwdSet(uid,pwd)來設置緩存管理用戶ID和口令。下面的例子在ttIsql會話中設置緩存管理用戶ID爲testuser,口令爲mypsswrd,然後驗證它已經被設置。

Command> call ttCacheUidPwdSet('testuser','mypsswrd');

Command> call ttCacheUidGet();

< testuser >

3. 通過使用ASYNCHRONOUS_WRITETHROUGH和INSTALL標誌的ttIsql cachesqlget命令來獲取SQL以安裝對象。

Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH INSTALL;

輸出相似如下:

CREATE TABLE testuser.TT_03_RepPeers(

replication_name CHAR(31) NOT NULL,

replication_owner CHAR(31) NOT NULL,

tt_store_id NUMBER(19,0) NOT NULL,

subscriber_id NUMBER(19,0) NOT NULL,

commit_timestamp NUMBER(19,0),

commit_seqnum NUMBER(19,0),

timerecv NUMBER(10,0),

protocol NUMBER(10,0),

PRIMARY KEY(tt_store_id));

GRANT INSERT, UPDATE, DELETE, SELECT

ON testuser.TT_03_RepPeers TO PUBLIC;

CREATE TABLE testuser.TT_03_RepActiveStandby(

tt_store_pair INTEGER NOT NULL,

tt_store_id1 NUMBER(19,0) NOT NULL,

tt_store_id2 NUMBER(19,0) NOT NULL,

ts1 NUMBER(19,0),

ts2 NUMBER(19,0),

role1 CHAR(1),

role2 CHAR(1),

state NUMBER(10,0),

rep_checksum NUMBER(19,0),

PRIMARY KEY(tt_store_pair));

CREATE INDEX testuser.TT_03_RepActiveStandby_ix

ON testuser.TT_03_RepActiveStandby

( tt_store_id1, tt_store_id2 );

GRANT INSERT, UPDATE, DELETE, SELECT

ON testuser.TT_03_RepActiveStandby TO PUBLIC;

4. 剪切並粘貼SQL碼到SQL*Plus會話以創建TT_version_REPPEERS。二選其一,可以從一個PassThrough屬性被設置爲3進行連接的TimesTen中的ODBC或JDBC程序中執行此代碼。

如果AWT緩存集合是活動的備用對中的副本,還要創建TT_version_REPACTIVESTANDBY和TT_version_REPACTIVESTANDBY_IX。

Oracle對象的配置安裝

爲了確定安裝在Oracle中的對象,登錄Oracle帳號並從Oracle SQL *Plus命令提示符執行下列查詢:

SQL> select owner, object_name, object_type from all_objects where

object_name like 'TT/___/_%' escape '/';

輸出應該包含對象,相似如下:

OWNER OBJECT_NAME OBJECT_TYPE

------------- ------------------------------ ------------------

TESTUSER TT_03_34520_L TABLE

TESTUSER TT_03_34520_T TRIGGER

TESTUSER TT_03_USER_COUNT TABLE

TESTUSER TT_03_REPPEERS TABLE

刪除Oracle對象

如果Oracle對象由Cache Connect to Oracle自動安裝,則當設置AUTOREFRESH爲OFF或使用DROP CACHE GROUP來刪除緩存集合時,將自動刪除。

如果手工安裝Oracle對象,可以通過在Oracle系統中執行代碼來卸載它們來刪除對象。爲了從TimesTen獲得卸載代碼,使用下列方式之一:

• 從ttIsql提示符,輸入一條cachesqlget命令,指定uninstall。

• 從一個程序,調用ttCacheSqlGet程序並設置install_flag爲0。

注意:如果在刪除或改變自動刷新緩存集合之後立即關閉緩存代理,則它可能不會卸載Oracle對象。當重啓緩存代理時,它將卸載刪除或改變自動刷新緩存集合時留下的Oracle對象。

爲AWT緩存集合手工刪除Oracle對象

在從所有使用一個Oracle實例的數據存儲中刪除所有的AWT緩存集合之後,要爲AWT緩存集合刪除Oracle對象。

1. 從ttIsql會話,執行cachesqlget命令來獲取SQL來刪除對象。在此例中,DSN爲cgDSN,並且用戶是testuser。

> ttIsql cgDSN

Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH UNINSTALL;

輸出相似如下:

DROP TABLE testuser.TT_03_RepPeers;

DROP TABLE testuser.TT_03_RepActiveStandby;

2. 剪切並粘貼此SQL到SQL*Plus會話來刪除對象。二選其一,可以從使用PassThrough屬性被設置爲3的TimesTen連接中的ODBC或JDBC程序中執行此代碼。

發佈了41 篇原創文章 · 獲贊 16 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章