Примечание: в данной статье не будет рассматриваться функциональность 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 завершена.
[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 комментариев:
Прошу помощи!!!!
При создании кэш-группы
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 действия провожу на одной машине.
Добрый день! В данном случае видно, что проблема связана с подключением с 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 (начало)
"Давно я что-то не писал не чего технического (да и на русском :)"
- очень технически и очень по-русски :)))
Спасибо за замечание!
Добрый День,
испробовал динамическую АВТ кэш группу.
после 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 без триггеров?
спасибо
Здравствуйте oraman.
Не очень понятен вопрос - что такое актуализация?
AWT кэш группы используются для передачи изменений из TimesTen в Oracle DB (не учитывая первоначальную загрузку данных и Transparent load).
Если вопросы остались присылайте test case на адрес - sigalaev.gennadiy@gmail.com
Постораюсь помочь.
Геннадий
Отправить комментарий