Tech: Настройка In-Memory Database Cache 11g

Давно я что-то не писал не чего технического (да и на русском :) ), вот и решил это исправить. Так как литературы по TimesTen мало, то я решил обновить статью Jonathan Gennick -а о кэшировании. В данном посте рассматривается возможность кэширования данных из Oracle Database в Oracle TimesTen.

Примечание: в данной статье не будет рассматриваться функциональность In-Memory Database Cache Grid, т.е. будет рассмотрена возможность создания только локальных кэш групп.

Используемое окружение (две виртуальные машины):
OEL 5.3 (x86) - Oracle Database EE 11.2.0.2.0 (Linux/x86), ip - 192.168.2.131 (hostname - db)
OEL 5.3 (x86) - Oracle TimesTen 11.2.1.7.0 (Linux/x86), ip - 192.168.2.132 (hostname - tt1)








Предварительная настройка In-Memory Database Cache
  • Настройка Oracle Database 
  • Для работы In-Memory Database Cache необходимо выполнить ряд настроек. Первоначально создадим табличное пространство в Oracle Database для хранения системных объектов, необходимых для работы TimesTen.
    [oracle@db ~]$ sqlplus / as sysdba
    
    SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 28 07:53:57 2011
    
    Copyright (c) 1982, 2010, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> CREATE TABLESPACE timesten_tbls;
    
    Tablespace created.
    
    SQL> select tablespace_name, file_name from dba_data_files where tablespace_name='TIMESTEN_TBLS';
    
    TABLESPACE_NAME         FILE_NAME
    ----------------------- ------------------------------------------------------------
    TIMESTEN_TBLS           /u02/oradata/DB1/datafile/o1_mf_timesten_6s0t74rm_.dbf
    
    Теперь создадим необходимые объекты в Oracle Database. Создадим пользователя, объекты которого будем кэшировать. Предоставим данному пользователю минимальный набор привилегий, необходимых для создания таблиц. В данном примере, я буду размещать кэшируемые объекты в том же табличном пространстве, что и системные объекты TimesTen.
    SQL> create user oratt identified by oracle default tablespace timesten_tbls;
    
    User created.
    
    SQL> GRANT CREATE SESSION, RESOURCE TO oratt;
    
    Grant succeeded.
    
    Далее, создадим пользователя – администратора кэша.
    SQL> CREATE USER cacheadmin IDENTIFIED BY oracle DEFAULT TABLESPACE timesten_tbls QUOTA UNLIMITED ON timesten_tbls;
    
    User created.
    
    На этом первоначальные настройки с хоста db закончены, но настройки Oracle Database еще не завершены, они будут проводиться с хоста tt1. Для того, чтобы продолжить настраивать Oracle Database c хоста tt1, необходимо подключиться к базе данных. При установке Oracle TimesTen устанавливается Instant client (11.1.0.7.0), размещенный в директории TimesTen_install_dir/TimesTen/Instance_name/ttoracle_home/instantclient_11_1 и подключение должно осуществляться с помощью данного клиента (остальные способы не поддерживаются). В версии 7.0.5, нужно было отдельно устанавливать клиента, как видим, в версии 11g это уже не нужно. Первоначально, настроим окружение на сервере tt1. Выставим переменные окружения TNS_ADMIN и LD_LIBRARY_PATH. В моем случае, я использую следующее окружение:
    export TIMESTEN_HOME=/u01/app/oracle/product/11.2.1/TimesTen/tt1
    export TNS_ADMIN=$TIMESTEN_HOME/network/admin
    export LD_LIBRARY_PATH=$TIMESTEN_HOME/ttoracle_home/instantclient_11_1
    export PATH=$PATH:$HOME/bin:$TIMESTEN_HOME/bin:$LD_LIBRARY_PATH
    
    Прописываем сущность в TNSNAMES.ORA
    ORCL =
      (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = db)(PORT=1521))
         (CONNECT_DATA =
           (SERVICE_NAME = db1)
         )
    )
    
    Проверяем подключение.
    [oracle@tt1 ~]$ sqlplus sys/oracle@orcl as sysdba
    
    SQL*Plus: Release 11.1.0.7.0 - Production on Mon Mar 28 07:42:29 2011
    
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL>
    
    Также, сразу установим значение TNS_ADMIN на уровне экземпляра TimesTen. Для этого воспользуемся утилитой ttmodinstall.
    [oracle@tt1 ~]$ /u01/app/oracle/product/11.2.1/TimesTen/tt1/bin/ttmodinstall    The daemon for instance 'tt1' is currently configured to use port 53384.
    Would you like to change this port? [ no ]
    The server for instance 'tt1' is currently configured to use port 53385.
    Would you like to change this port? [ no ]
    TNS_ADMIN for the instance 'tt1' is currently not set.
    Would you like to change TNS_ADMIN for this instance? [ yes ]
    Please enter a value for TNS_ADMIN (q=quit)? [  ] /u01/app/oracle/product/11.2.1/TimesTen/tt1/network/admin
    
    Do you want to restart the daemon using the new configuration? [ yes ]
    Restarting the daemon ...
    TimesTen Daemon stopped.
    TimesTen Daemon startup OK.
    Instance tt1 is now configured with TNS_ADMIN=/u01/app/oracle/product/11.2.1/TimesTen/tt1/network/admin
    Would you like to configure TimesTen Replication with Oracle Clusterware? [ no ]
    Done ...
    [oracle@tt1 ~]$
    
    Теперь создадим пользователя timesten. Данный пользователь содержит информацию о cache grid. Для его создания, воспользуемся скриптом initCacheGlobalSchema.sql, расположенным в директории TimesTen_install_dir/TimesTen/Instance_name/oraclescripts
    [oracle@tt1 admin]$ cd /u01/app/oracle/product/11.2.1/TimesTen/tt1/oraclescripts/
    [oracle@tt1 oraclescripts]$ ls
    cacheCleanUp.sql               initCacheAdminSchema.sql   README.TXT
    cacheInfo.sql                  initCacheGlobalSchema.sql
    grantCacheAdminPrivileges.sql  initCacheGridSchema.sql
    [oracle@tt1 oraclescripts]$ sqlplus sys/oracle@orcl as sysdba 
                         
    SQL*Plus: Release 11.1.0.7.0 - Production on Mon Mar 28 08:11:02 2011
    
    Copyright (c) 1982, 2008, Oracle.  All rights reserved.
    
    Connected to:
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    
    SQL> @initCacheGlobalSchema "timesten_tbls"
    
    Please enter the tablespace where TIMESTEN user is to be created
    The value chosen for tablespace is timesten_tbls
    
    ******* Creation of TIMESTEN schema and TT_CACHE_ADMIN_ROLE starts *******
    1. Creating TIMESTEN schema
    2. Creating TIMESTEN.TT_GRIDID table
    3. Creating TIMESTEN.TT_GRIDINFO table
    4. Creating TT_CACHE_ADMIN_ROLE role
    5. Granting privileges to TT_CACHE_ADMIN_ROLE
    ** Creation of TIMESTEN schema and TT_CACHE_ADMIN_ROLE done successfully **
    
    PL/SQL procedure successfully completed.
    
    
    Также, предоставим привилегии, ранее созданному администратору кэша. Для этого воспользуемся скриптом grantCacheAdminPrivileges.sql
    SQL> @grantCacheAdminPrivileges "cacheadmin"
    
    Please enter the administrator user id
    The value chosen for administrator user id is cacheadmin
    
    ***************** Initialization for cache admin begins ******************
    0. Granting the CREATE SESSION privilege to CACHEADMIN
    1. Granting the TT_CACHE_ADMIN_ROLE to CACHEADMIN
    2. Granting the DBMS_LOCK package privilege to CACHEADMIN
    3. Granting the RESOURCE  privilege to CACHEADMIN
    4. Granting the CREATE PROCEDURE  privilege to CACHEADMIN
    5. Granting the CREATE ANY TRIGGER  privilege to CACHEADMIN
    6. Granting the DBMS_LOB package privilege to CACHEADMIN
    7. Granting the SELECT on SYS.ALL_OBJECTS privilege to CACHEADMIN
    8. Granting the SELECT on SYS.ALL_SYNONYMS privilege to CACHEADMIN
    9. Checking if the cache administrator user has permissions on the default
    tablespace
         Permission exists
    11. Granting the CREATE ANY TYPE privilege to CACHEADMIN
    ********* Initialization for cache admin user done successfully *********
    SQL>
    
    
    Набор привилегий, который необходим кэш администратору зависит от типа кэш групп, которые планируется создать. В дальнейшем данный набор привилегий будет расширен. На этом, предварительная настройка Oracle Database завершена.
  • Настройка в TimesTen
  • Теперь приступим к настройке TimesTen. Проверим состояние экземпляра.  
    [oracle@tt1 ~]$ ttstatus
    TimesTen status report as of Tue Mar 29 09:40:19 2011
    
    Daemon pid 4392 port 53384 instance tt1
    TimesTen server pid 4400 started on port 53385
    ------------------------------------------------------------------------
    Accessible by group oinstall
    End of report
    [oracle@tt1 ~]$
    
    Первоначально, создадим сущность в sys.odbc.ini. В данном примере, я создаю data store и отключаю возможность создания cache grid (CachegridEnable=0), т.к. данной функциональности будет посвящена отдельная статья. Также, в данной сущности я прописываю атрибут OracleNetServiceName со значением алиаса из tnsnames.ora
    [db_сache]
    Driver=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so
    DataStore=/u01/app/oracle/datastore/db_cache
    PermSize=100
    TempSize=32
    PLSQL=1
    DatabaseCharacterSet= WE8MSWIN1252
    CachegridEnable=0
    OracleNetServiceName=ORCL
    
    Далее, необходимо создать некоторых пользователей в Oracle TimesTen. Вначале создадим пользователя – управляющего кэшем (cache manager user). Данный пользователь должен иметь тоже имя, что и пользователь в Oracle Database, который будет иметь доступ к кэшируемым таблицам. Пароль может отличаться. Предоставим данному пользователю набор привилегий, необходимый для создания cache grid и кэш групп.
    [oracle@tt1 ~]$ ttisql db_cache
    
    Copyright (c) 1996-2010, Oracle.  All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
    
    connect "DSN=db_cache";
    Connection successful: DSN=db_cache;UID=oracle;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
    (Default setting AutoCommit=1)
    Command> CREATE USER cacheadmin IDENTIFIED BY oracle;
    
    User created.
    
    Command> GRANT CREATE SESSION, CACHE_MANAGER, CREATE ANY TABLE, DROP ANY TABLE TO cacheadmin;
    Command>
    
    Далее, создадим пользователя, владельца кэшируемых таблиц и предоставим ему привилегии. Данный пользователь должен иметь тоже имя, что и пользователь в Oracle Database, который будет владеть кэшируемыми объектами. Пароль может отличаться.
    Command> CREATE USER oratt IDENTIFIED BY oracle;
    
    User created.
    
    Command> grant create session to oratt;
    Command>
    
    Далее, подсоединимся к базе данных под пользователем cache manager user, и также установим имя и пароль кэш администратора в Oracle Database с помощью процедуры ttCacheUidPwdSet.
    [oracle@tt1 ~]$ ttIsql "DSN=db_cache;UID=cacheadmin;PWD=oracle;OraclePWD=oracle"
    
    Copyright (c) 1996-2010, Oracle.  All rights reserved.
    Type ? or "help" for help, type "exit" to quit ttIsql.
    
    
    connect "DSN=db_cache;UID=cacheadmin;PWD=oracle;OraclePWD=oracle";
    Connection successful: DSN=db_cache;UID=cacheadmin;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
    (Default setting AutoCommit=1)
    Command> call ttCacheUidPwdSet('cacheadmin','oracle');
    Command>
    
    Как видим, после выполнения данной команды, TimesTen инициировал сессию в Oracle Database.
    SQL> select s.sid,
      2         s.username,
      3         s.status,    
      4         s.schemaname,
      5         s.osuser,
      6         s.machine,
      7         s.terminal,
      8         s.program
      9    from V$SESSION s
     10   where s.type = 'USER'
     11     and s.username is not null;
    
    SID  USERNAME      STATUS    SCHEMANAME    OSUSER   MACHINE TERMINAL  PROGRAM      
    ---- ------------- --------  ------------- -------- ------- --------  ------- 
    36   CACHEADMIN    INACTIVE  CACHEADMIN    oracle   tt1     pts/1     ttIsqlCmd@tt1 
    
    
    На этом предварительные настройки в TimesTen закончены.


Создание Read Only кэш группы

Для создания read only кэш группы, первоначально необходимо создать объект кэширования – таблицу в Oracle Database и затем наполнить ее данными.

[oracle@db ~]$ sqlplus oratt/oracle

SQL*Plus: Release 11.2.0.2.0 Production on Mon Apr 4 05:53:20 2011

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table readtab ( a NUMBER NOT NULL PRIMARY KEY,
   2                    b VARCHAR2(100) );
  
Table created.

SQL> insert into readtab values (1,'1');

1 row created.

SQL> insert into readtab values (2,'2');

1 row created.

SQL> insert into readtab values (3,'3');

1 row created.

SQL> insert into readtab values (4,'4');

1 row created.

SQL> insert into readtab values (5,'5');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from readtab;

         A       B 
----------  -------------------------------------
         1  1
         2  2
         3  3
         4  4
         5  5

SQL>

После этого, необходимо предоставить SELECT привилегию на таблицу readtab кэш администратору. Данная привилегия необходима для создания read only кэш группы, которая кэширует данную таблицу и выполняет автоматическое обновление данных из Oracle Database в TimesTen.

SQL> GRANT SELECT ON readtab TO cacheadmin;

Grant succeeded.

SQL>


Далее необходимо запустить кэш агент. Для этого воспользуемся процедурой ttCacheStart.

Command> call ttCacheStart;
Command> host ttstatus
TimesTen status report as of Mon Apr  4 06:05:43 2011

Daemon pid 29809 port 53384 instance tt1
TimesTen server pid 29823 started on port 53385
------------------------------------------------------------------------
Data store /u01/app/oracle/datastore/db_cache
There are 14 connections to the data store
Shared Memory KEY 0x060008cd ID 786433
PL/SQL Memory KEY 0x070008cd ID 819202 Address 0x10000000
Type            PID     Context     Connection Name              ConnID
Cache Agent     30043   0x088faab8  Handler                           2
Cache Agent     30043   0x08a185c0  Timer                             3
Cache Agent     30043   0x08a74940  Aging                             4
Process         29949   0x08660338  db_cache                          1
Subdaemon       29813   0x087cf2e8  Manager                        2032
Subdaemon       29813   0x08821cb8  Rollback                       2033
Subdaemon       29813   0x088eaca8  Flusher                        2034
Subdaemon       29813   0x0893b718  Monitor                        2035
Subdaemon       29813   0x0899a110  Deadlock Detector              2036
Subdaemon       29813   0x089f8b08  Checkpoint                     2037
Subdaemon       29813   0x08a57500  Aging                          2038
Subdaemon       29813   0x08ac81d8  Log Marker                     2039
Subdaemon       29813   0x08b18c48  AsyncMV                        2040
Subdaemon       29813   0x08bb9f38  HistGC                         2041
Replication policy  : Manual
Cache Agent policy  : Manual
TimesTen's Cache agent is running for this data store
PL/SQL enabled.
------------------------------------------------------------------------
Accessible by group oinstall
End of report
Command> 

После этого, можно создавать кэш группу.

Command> CREATE READONLY CACHE GROUP readcache
       >   AUTOREFRESH INTERVAL
       >   5 SECONDS
       > FROM oratt.readtab (
       >        a NUMBER NOT NULL PRIMARY KEY,
       >        b VARCHAR2(100) );
Command> 

Проверим наличие записей в кэше.

[oracle@tt1 ~]$ ttIsql "DSN=db_cache;UID=oratt;PWD=oracle;"                     
Copyright (c) 1996-2010, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.


connect "DSN=db_cache;UID=oratt;PWD=oracle;";
Connection successful: DSN=db_cache;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
Command> select * from readtab;
0 rows found.
Command>

Далее необходимо выполнить первоначальную загрузку данных в кэш.

[oracle@tt1 ~]$ ttIsql "DSN=db_cache;UID=cacheadmin;PWD=oracle;OraclePWD=oracle"

Copyright (c) 1996-2010, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.


connect "DSN=db_cache;UID=cacheadmin;PWD=oracle;OraclePWD=oracle";
Connection successful: DSN=db_cache;UID=cacheadmin;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
5 cache instances affected.
Command> connect "DSN=db_cache;UID=oratt;PWD=oracle";
Connection successful: DSN=db_cache;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
con1: Command> select * from readtab;
< 1, 1 >
< 2, 2 >
< 3, 3 >
< 4, 4 >
< 5, 5 >
5 rows found.
con1: Command>


Следовательно, данные загрузились. Попробуем изменить данные в Oracle Database.

SQL> conn oratt/oracle
Connected.
SQL> INSERT INTO readtab VALUES (0, '0');

1 row created.

SQL> DELETE FROM readtab WHERE a=2;

1 row deleted.

SQL> UPDATE readtab SET b='8' WHERE a=4;

1 row updated.

SQL> commit;

Commit complete.

SQL> select * from readtab;

         A B
---------- ------------------------------------------------------
         1 1
         3 3
         4 8
         5 5
         0 0

Теперь проверим кэш.

con1: Command> select * from readtab;
< 0, 0 >
< 1, 1 >
< 3, 3 >
< 4, 8 >
< 5, 5 >
5 rows found.
con1: Command>


Как видно, измененные данные переносятся из Oracle Database в Oracle TimesTen.

Создание AWT кэш группы

Вначале опять создадим таблицу в Oracle Database и затем наполнить ее данными.

[oracle@db ~]$ sqlplus oratt/oracle

SQL*Plus: Release 11.2.0.2.0 Production on Tue Apr 5 01:38:30 2011

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table awttab ( a NUMBER NOT NULL PRIMARY KEY,
                      b VARCHAR2(100),
                      c TIMESTAMP DEFAULT SYSDATE NOT NULL);  2    3

Table created.

SQL> insert into awttab values (1,'1',sysdate);

1 row created.

SQL> insert into awttab values (2,'2',sysdate);

1 row created.

SQL> insert into awttab values (3,'3',sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> grant select, insert, update, delete on awttab to cacheadmin;

Grant succeeded.

SQL> select * from awttab;

         A B                                  C
---------- ---------------------------------- ----------------------------
         1 1                                  05-APR-11 01.39.26.000000 AM
         2 2                                  05-APR-11 01.39.32.000000 AM
         3 3                                  05-APR-11 01.39.38.000000 AM
SQL>

После этого, необходимо предоставить привилегии на таблицу awttab кэш администратору.

SQL> grant select, insert, update, delete on awttab to cacheadmin;

Grant succeeded.

SQL>

SELECT привилегия необходима для создания AWT кэш группы, которая кэширует данную таблицу. INSERT, UPDATE, DELETE привилегии необходимы для выполнения операций изменения в TimesTen и переноса их в Oracle Database.
Далее запускаем кэш агент. Для этого воспользуемся процедурой ttCacheStart.
Command> call ttCacheStart;
Command>
Далее создаем AWT кэш группу.
Command> CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP awtcache
       > FROM oratt.awttab ( a NUMBER NOT NULL PRIMARY KEY,
       >                     b VARCHAR2(100),
       >                     c TIMESTAMP NOT NULL DEFAULT SYSDATE );
Command> connect "DSN=db_cache;UID=oratt;PWD=oracle;";
Connection successful: DSN=db_cache;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
con1: Command> select * from awttab;
0 rows found.
con1: Command>

Запускаем репликационный агент. Для этого воспользуемся процедурой ttRepStart.
Command> call ttRepStart;
Command> host ttstatus;
TimesTen status report as of Tue Apr  5 02:00:56 2011

Daemon pid 3637 port 53384 instance tt1
TimesTen server pid 3645 started on port 53385
------------------------------------------------------------------------
Data store /u01/app/oracle/datastore/db_cache
There are 21 connections to the data store
Shared Memory KEY 0x090008cd ID 294913
PL/SQL Memory KEY 0x0a0008cd ID 327682 Address 0x10000000
Type            PID     Context     Connection Name              ConnID
Cache Agent     3778    0x0987bab8  Handler                           2
Cache Agent     3778    0x099995c0  Timer                             3
Cache Agent     3778    0x099f5940  Aging                             4
Cache Agent     3778    0x09ac91a0  Refresher(S,5000)                 6
Cache Agent     3778    0x09b7e948  BMReporter(-1594258544)           5
Process         3807    0x084aa338  db_cache                          1
Replication     4156    0x0a0162c8  LOGFORCE                          9
Replication     4156    0x0a034250  REPHOLD                           7
Replication     4156    0x0a084cc0  REPLISTENER                       8
Replication     4156    0x0a0d6780  TRANSMITTER                      10
Replication     4156    0x0a14c9f8  RECEIVER                         11
Subdaemon       3642    0x0900b2e8  Manager                        2032
Subdaemon       3642    0x090970d0  Flusher                        2034
Subdaemon       3642    0x090f5cd8  Monitor                        2035
Subdaemon       3642    0x091548e0  Deadlock Detector              2036
Subdaemon       3642    0xa7940038  Log Marker                     2039
Subdaemon       3642    0xa7990aa8  AsyncMV                        2040
Subdaemon       3642    0xa79e1518  HistGC                         2041
Subdaemon       3642    0xb5342400  Rollback                       2033
Subdaemon       3642    0xb5393110  Checkpoint                     2037
Subdaemon       3642    0xb53e3d90  Aging                          2038
Replication policy  : Manual
Replication agent is running.
Cache Agent policy  : Manual
TimesTen's Cache agent is running for this data store
PL/SQL enabled.
------------------------------------------------------------------------
Accessible by group oinstall
End of report
Command>

Можем выполнить первоначальную инициализацию данных. Данный шаг не обязателен.
Command> load cache group AWTCACHE commit every 265 rows;
3 cache instances affected.
Command> connect "DSN=db_cache;UID=oratt;PWD=oracle;";
Connection successful: DSN=db_cache;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
con1: Command> select * from awttab;
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >
3 rows found.
con1: Command>

Вставим несколько строк в TimesTen.

con1: Command> insert into awttab values (-1,'-1',sysdate);
1 row inserted.
con1: Command> insert into awttab values (-2,'-2',sysdate);
1 row inserted.
con1: Command> select * from awttab;
< -2, -2, 2011-04-05 02:06:43.000000 >
< -1, -1, 2011-04-05 02:06:37.000000 >
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >
5 rows found.
con1: Command>

Теперь посмотрим состояние данных в Oracle Database.
SQL>  select * from awttab;
         A B                                  C
---------- ---------------------------------- ----------------------------
        -1 -1                                 05-APR-11 02.06.37.000000 AM
        -2 -2                                 05-APR-11 02.06.43.000000 AM
         1 1                                  05-APR-11 01.39.26.000000 AM
         2 2                                  05-APR-11 01.39.32.000000 AM
         3 3                                  05-APR-11 01.39.38.000000 AM
SQL>

Как видно, новые данные, появившиеся в TimesTen, переносятся в Oracle Database.

Создание SWT кэш группы

Процесс создания SWT кэш группы идентичен созданию AWT кэш группы, за исключением, предоставления SELECT, UPDATE,DELETE, INSERT привилегий не только кэш администратору на уровне Oracle Database, но, данные привилегии необходимо предоставить и cache manager пользователю на уровне TimesTen. Кроме того, при работе пользователем oratt, необходимо указать при подключении атрибут OraclePWD, для синхронной передачи данный в Oracle Database.

Создание User Managed кэш группы

Для создания кэш групп с нестандартным поведением можно создать User Managed кэш группу. Процесс создания данной кэш группы зависит от того, какой функционал вам необходим. Если вы используете возможность передачи данных из Oracle TimesTen в Oracle Database (Propagate) и обратно (Autorefresh), тогда процесс создания аналогичен SWT кэш группе.

Создание динамических (dynamic) кэш групп

Также в TimesTen 11g существует возможность создания динамических (dynamic) кэш групп. Что такое динамические кэш группы?
В версии TimesTen 7.0.5 у Data store был атрибут, который назывался transparentload, который позволял загрузить данные из Oracle Database в TimesTen при использовании изменяемого (updatable) кэша (awt, awt, um группы). С версии 11g (11.2.1.1.0) установка данного параметра вручную устарел (deprecated) и теперь для обеспечения данного функционала, необходимо использовать ключевое слово Dynamic в определении кэш группы.
Предположим, у меня есть AWT кэш группа.
Command> cachegroups;

Cache Group CACHEADMIN.AWTCACHE:
…
  Cache Group Type: Asynchronous Writethrough
  Autorefresh: No
  Aging: No aging defined

  Root Table: ORATT.AWTTAB
  Table Type: Propagate
…
Command>

Удалим данную группу и создадим заново с атрибутом dynamic.
Command> call ttRepStop;
Command> drop cache group awtcache;
Command> CREATE DYNAMIC ASYNCHRONOUS WRITETHROUGH CACHE GROUP awtcache
       > FROM oratt.awttab ( a NUMBER NOT NULL PRIMARY KEY,
       >                     b VARCHAR2(100),
       >                     c TIMESTAMP NOT NULL DEFAULT SYSDATE );
Command> call ttRepStart;
Command> connect "DSN=db_cache;UID=oratt;PWD=oracle;";
Connection successful: DSN=db_cache;UID=oratt;DataStore=/u01/app/oracle/datastore/db_cache;DatabaseCharacterSet=WE8MSWIN1252;ConnectionCharacterSet=US7ASCII;DRIVER=/u01/app/oracle/product/11.2.1/TimesTen/tt1/lib/libtten.so;PermSize=100;TempSize=32;TypeMode=0;CacheGridEnable=0;OracleNetServiceName=ORCL;
(Default setting AutoCommit=1)
Con1: Command> select * from awttab;
0 rows found.

Загружаем данные.
con2: Command> load cache group AWTCACHE commit every 265 rows;
5 cache instances affected.
сon1: Command> select * from awttab;
< -2, -2, 2011-04-05 02:06:43.000000 >
< -1, -1, 2011-04-05 02:06:37.000000 >
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >
5 rows found.
Вставим строку в кэше.
сon1: Command> insert into awttab values (-3,'-3');
1 row inserted.
сon1: Command> select * from awttab;
< -3, -3, 2011-04-05 03:30:40.000000 >
< -2, -2, 2011-04-05 02:06:43.000000 >
< -1, -1, 2011-04-05 02:06:37.000000 >
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >

6 rows found.

Проверим данные в Oracle Database.

SQL>  select * from awttab;
         A B                                  C
---------- ---------------------------------- ----------------------------
        -1 -1                                 05-APR-11 02.06.37.000000 AM
        -2 -2                                 05-APR-11 02.06.43.000000 AM
         1 1                                  05-APR-11 01.39.26.000000 AM
         2 2                                  05-APR-11 01.39.32.000000 AM
         3 3                                  05-APR-11 01.39.38.000000 AM
        -3 -3                                 05-APR-11 03.30.40.000000 AM
6 rows selected.

SQL>
Видно, что передача изменений из Кэша в Oracle Database работает. Но что делать, если необходимо вставить данные в Oracle Database и после этого, загрузить эти данные в кэш без пересоздания кэш группы. Именно в данной ситуации мы воспользуемся функционалом прозрачной загрузки данных из Oracle Database в TimesTen при выполнении SQL запроса. Работает данный функционал следующим образом: если определенный (поддерживаются только некоторые конструкции – см. Types of SQL statements for which dynamic load is available в Oracle® In-Memory Database Cache User's Guide ) SQL запрос не возвращает не одной строки в TimesTen, то данный запрос будет перенаправлен в Oracle Database и выполнен там и если данный запрос что-то вернул, эти строки будут загружены в TimesTen.

Предположим, нам необходимо вставить строку в Oracle Database.
SQL> insert into oratt.awttab values (0,'DB insert',sysdate);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from awttab;

         A B                                  C
---------- ---------------------------------- ----------------------------
        -1 -1                                 05-APR-11 02.06.37.000000 AM
        -2 -2                                 05-APR-11 02.06.43.000000 AM
         1 1                                  05-APR-11 01.39.26.000000 AM
         2 2                                  05-APR-11 01.39.32.000000 AM
         3 3                                  05-APR-11 01.39.38.000000 AM
        -3 -3                                 05-APR-11 03.30.40.000000 AM
         0 DB insert                          05-APR-11 03.50.35.000000 AM

7 rows selected.

SQL>

И теперь необходимо переместить ее в изменяемый кэш. Для этого необходимо выполнить банальный запрос.
Command> select * from oratt.awttab;
< -3, -3, 2011-04-05 03:30:40.000000 >
< -2, -2, 2011-04-05 02:06:43.000000 >
< -1, -1, 2011-04-05 02:06:37.000000 >
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >
6 rows found.
Command> select * from oratt.awttab where a = 0;
< 0, DB insert, 2011-04-05 03:50:35.000000 >
1 row found.
Command> select * from oratt.awttab;
< -3, -3, 2011-04-05 03:30:40.000000 >
< -2, -2, 2011-04-05 02:06:43.000000 >
< -1, -1, 2011-04-05 02:06:37.000000 >
< 0, DB insert, 2011-04-05 03:50:35.000000 >
< 1, 1, 2011-04-05 01:39:26.000000 >
< 2, 2, 2011-04-05 01:39:32.000000 >
< 3, 3, 2011-04-05 01:39:38.000000 >
7 rows found.
Command>


Но нужно помнить, что данный функционал имеет ограничения и перед тем как его применять, рекомендую ознакомиться с документацией.

Заключение

Oracle TimesTen может быть использована как быстрый кэш над Oracle Database. Как видно из статьи, TimesTen позволяет очень быстро создать кэш группы с различным функционалом – передачей данный из Oracle Database в TimesTen или наоборот, или в обе стороны. Учитывая существенное увеличение скорости выполнения SQL запросов, данный механизм может позволить увеличить производительность различных приложений.

PS. Но фото Мальдивы :)

6 комментариев:

mos комментирует...

Прошу помощи!!!!
При создании кэш-группы

Command> CREATE READONLY CACHE GROUP readcache AUTOREFRESH INTERVAL 5 SECONDS FROM oratt.readtab (a NUMBER NOT NULL PRIMARY KEY,b VARCHAR2(100) );
Warning 5923: Cache agent has deferred the create/alter cache group request because it is not connected to Oracle yet

Группа создается.
Но потом при попытке загрузки данных в кэш.

Command> LOAD CACHE GROUP readcache COMMIT EVERY 256 ROWS;
5056: The cache operation fails: error_type=, error_code=<12154>, error_message: ORA-12154: TNS:could not resolve the connect identifier specified
The command failed.


P.S действия провожу на одной машине.

GGS комментирует...

Добрый день! В данном случае видно, что проблема связана с подключением с Oracle DB. Проверьте правильно ли прописана сущьность в tnsnames.ora и попробуйте подключиться с использованием sqlplus. Например
sqlplus sys/your_pwd@you_alias as sysdba. Также необходимо выставить переменную TNS_ADMIN для окружения TimesTen. Про это можно почитать тут
http://ggsig.blogspot.com/2011/04/tech-in-memory-database-cache-11g.html (начало)

Анонимный комментирует...

"Давно я что-то не писал не чего технического (да и на русском :)"
- очень технически и очень по-русски :)))

GGS комментирует...

Спасибо за замечание!

oraman комментирует...

Добрый День,

испробовал динамическую АВТ кэш группу.

после insert в oracle, таблица в timesten актуализируется всегда.

однако после update актуализируется только тогда если в update комманде присутствует колонка primary key:

update customers set customer_id=1009257,cust_first_name='new f 2',cust_last_name='new l 2' where CUSTOMER_ID=1009256;
commit;

етот вариант не актуализирует в timesten:

update customers set cust_last_name='new l 2' where CUSTOMER_ID=1009256;
commit;

чем можно обьяснить данное поведение?

ещё один вопрос:
у данной таблицы не обнаружил в oracle триггеров. функционирует актуализация между oracle и timesten без триггеров?

спасибо

GGS комментирует...

Здравствуйте oraman.

Не очень понятен вопрос - что такое актуализация?
AWT кэш группы используются для передачи изменений из TimesTen в Oracle DB (не учитывая первоначальную загрузку данных и Transparent load).

Если вопросы остались присылайте test case на адрес - sigalaev.gennadiy@gmail.com
Постораюсь помочь.

Геннадий