1. Start
  2. Unternehmen
  3. Blog
  4. Was ist der Oracle True Cache - eine Einführung

Was ist der Oracle True Cache - eine Einführung

1. Überblick

Es gibt Anwendungen, die benötigen auf die Datenbank einen READ-ONLY Zugriff und sollen aber für ressoucenintensive Zugriffe auf einen anderen Host ausgelagert werden. Dafür gab es bisher die Möglichkeit der Nutzung einer physikalischen oder einer logischen Standby-Datenbank. Allerdings gibt es dabei folgende Einschränkungen.

  • Bei Nutzung einer physikalischen Standby Datenbank im READ-ONLY Mode mit Apply von der primären Datenbank wird die Active Data Guard Option benötigt.
  • Bei Nutzung einer logischen Standbydatenbank unterstützt das Apply nicht alle Datentypen (alle nach Oracle 12.1 eingeführten Datentypen werden nicht unterstützt, beispielweise der mit Oracle 21c eingeführte JSON Datentyp).

Weiterhin ist bei beiden Varianten ein Kopieren der kompletten Datenbankdateien nötig.

Mit dem Release Oracle 23ai wurde der Oracle True Cache eingeführt. Oracle True Cache ist ein speicherbasierter, konsistenter und automatisch verwalteteter SQL und Key-Value Cache für Oracle-Datenbanken.

In diesem Blogeintrag werden wesentliche Eigenschaften von Oracle True Cache vorgestellt sowie die Grundfunktionen am Beispiel der Oracle 23ai FREE gezeigt.

2. Architekturüberblick Oracle True Cache

Der Oracle True Cache funktioniert ähnlich der Active Data Guard Option. Alle abgeschlossenen Änderungen (mit commit bestätigt) auf der primären Datenbank werden auf den Oracle True Cache übertragen. Anfangs ist der Oracle True Cache leer. Bei der ersten Abfrage der Anwendung erfolgt automatisch der Refresh der Daten von der primären Datenbank zum Oracle True Cache. Bei der zweiten Abfrage auf die gleichen Daten werden die Daten direkt aus dem Oracle True Cache gelesen – es ist kein Refresh notwendig.

Falls sich die Daten auf der Quelle ändern, so erkennt das der Oracle True Cache und führt automatisch ein Refresh durch, so dass die Anwendung stets die aktuellen Daten erhält.

Bei Bedarf kann DML auf dem Oracle True Cache aktiviert werden. In diesem Fall erfolgt die Umleitung der DML-Statements (nicht DDL) auf die primäre Datenbank. Dort werden sie ausgeführt und danach sofort auf den Oracle True Cache aktualisiert.

Im folgenden Bild der Oracle-Dokumentation sind die Basiskomponenten vom Oracle True Cache zu sehen:

3. Lizenzierung

Die Lizenzierung erfolgt analog der Lizenzierung der primären Datenbank. In unserem Beispiel kann zu einer Oracle 23ai FREE primären Datenbank ein 23ai FREE True Cache aufgesetzt werden, zu einer Oracle BASE EE primären Datenbank gehört ein BASE EE True Cache.
Anbei der passende Ausschnitt aus dem Oracle-Lizenzguide 23ai:

4. Beispielkonfiguration mit Oracle 23ai FREE

Am folgenden Beispiel werden die Basisfunktionalitäten vom Oracle True Cache gezeigt:
Die Software und primäre Datenbank ist eine Oracle 23ai FREE und befindet sich auf Host1 (hier HOST_PRIMARY). Auf einem Host2 ist nur die Software von Oracle 23ai FREE installiert (hier HOST_TRUE_CACHE), aber nicht(!) die Datenbank.

Im nächsten Schritt wird Oracle True Cache auf Host2 angelegt. Die Verbindungen der Anwendung zur Primary und zum True Cache werden mit zwei Oracle Net Servicenamen getestet, hier wird als Tool SQLcl genutzt.

4.1 Anlegen vom Oracle True Cache mit dbca

Die primäre Datenbank muss sich im Archivelog Modus befinden:

 

-- HOST_PRIMARY

SYS@FREE:CDB$ROOT:> select log_mode from V$DATABASE;

LOG_MODE
------------
ARCHIVELOG

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME   OPEN MODE  RESTRICTED
---------- ---------- ---------- ---------- 
     2     PDB$SEED   READ ONLY  NO
     3     FREEPDB1   READ WRITE NO
     4     PDBAPPL    READ WRITE NO

 

Auf dem Host2, wo der Oracle True Cache aufgebaut wird, ist als erstes das Passwortfile von der primären Datenbank zu übertragen.
Danach erfolgt der Aufbau vom Oracle True Cache mit dem Tool DBCA. Alle Änderungen an der primären Datenbank, der Oracle Net Konfiguration und dem Oracle True Cache werden automatisch ausgeführt.

 

-- HOST_TRUE_CACHE

$ scp HOST_PRIMARY:/opt/oracle/product/23ai/dbhomeFree/dbs/orapwFREE /tmp

$./dbca -silent -createTrueCache -gdbName FREE -sourceDBConnectionString HOST_PRIMARY:1521/FREE -passwordFileFromSourceDB /tmp/orapwFREE

-- Ausgabe von dbca:

Session ID of the current execution is: 1
Log file location: /opt/oracle/cfgtoollogs/dbca/FREE/trace.log_2024-08-09_01-09-19PM_33901
-----------------
Running Extract_password_file_from_blob_file job
Completed Extract_password_file_from_blob_file job
25% complete
-----------------
Running Create_static_listener job
Completed Create_static_listener job
38% complete
-----------------
...
-----------------
Running Reopen_wallet job
Skipping. Job is detected as not applicable.
100% complete
---------- PLUGIN NOTES ----------
Successfully created True Cache.
In order to complete the operation,configure the True Cache database application services from the primary database.
---------- END OF PLUGIN NOTES ----------
Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE0.log" for further details.

4.2 Überprüfung vom Oracle True Cache

Alle Nutzer PDBs sind READ-ONLY geöffnet. Die Datenbank hat die neue Rolle "True Cache".
Das Apply von der primären Datenbank zum True Cache ist eingeschaltet. Die Kontrolldatei hat den neuen Typ "True Cache".

 

-- HOST_TRUE_CACHE

SYS@FREE:CDB$ROOT:> show pdbs

CON_ID     CON_NAME      OPEN MODE  RESTRICTED
---------- ------------- ---------- ----------
   2       PDB$SEED       READ ONLY NO
   3       FREEPDB1       READ ONLY NO
   4       PDBAPPL        READ ONLY NO

SYS@FREE:CDB$ROOT:> select name, open_mode, database_role from v$database;

NAME      OPEN_MODE            DATABASE_ROLE
--------- -------------------- ----------------
FREE      READ ONLY WITH APPLY TRUE CACHE

SYS@FREE:CDB$ROOT:> select controlfile_type from v$database;

CONTROLFILE
----------
TRUE CACHE

 

Aus welchen Dateien besteht der Oracle True Cache ?
--> spfile, mit neuen Parametern
--> Kontrolldatei
--> keine Online Redo Log Gruppen
--> keine Online Redo Member
--> Standby Redo Logs
--> keine Datendateien
--> für jeden Container eine Temp-Datei

 

-- HOST_TRUE_CACHE

SYS@FREE:CDB$ROOT:> select name from v$controlfile;

NAME                                                        
___________________________________________________________ 
/opt/oracle/oradata/FREE/controlfile/o1_mf_mcd1g37l_.ctl    

SYS@FREE:CDB$ROOT:> select * from v$log;

no rows selected

SYS@FREE:CDB$ROOT:> select group#, type, member from v$logfile;

   GROUP# TYPE       MEMBER                                                      
_________ __________ ___________________________________________________________ 
        1 STANDBY    /opt/oracle/oradata/FREE/onlinelog/o1_mf_1_mcd1g3bc_.log    
        2 STANDBY    /opt/oracle/oradata/FREE/onlinelog/o1_mf_2_mcd1g4z3_.log    
        3 STANDBY    /opt/oracle/oradata/FREE/onlinelog/o1_mf_3_mcd1g6fp_.log    
        4 STANDBY    /opt/oracle/oradata/FREE/onlinelog/o1_mf_4_mcd1g7tl_.log    


SYS@FREE:CDB$ROOT:> select GROUP#, SEQUENCE#, BYTES, USED, ARCHIVED, STATUS from v$standby_log;

   GROUP#    SEQUENCE#        BYTES         USED ARCHIVED    STATUS        
_________ ____________ ____________ ____________ ___________ _____________ 
        1          141    209715200    168229376 YES         ACTIVE        
        2          140    209715200        31232 NO          ACTIVE        
        3            0    209715200            0 NO          UNASSIGNED    
        4            0    209715200            0 NO          UNASSIGNED 

SYS@FREE:CDB$ROOT:>select * from v$datafile;

no rows selected

SYS@FREE:CDB$ROOT:>select name, con_id from v$tempfile;

NAME                                                        CON_ID 
________________________________________________________ _________ 
/opt/oracle/oradata/S_TEMP_##TC##_FREE_8192_1_3_201_1            1 
/opt/oracle/oradata/S_TEMP_##TC##_FREE_8192_2_3_202_1            2 
/opt/oracle/oradata/S_TEMP_##TC##_FREE_8192_3_3_203_1            3 
/opt/oracle/oradata/S_TEMP_##TC##_FREE_8192_4_3_204_1            4 

 

Hinweis: Standby Redo Logs werden auf dem Oracle True Cache Host für die Zwischenspeicherung von Redo Log Daten von der primären Datenbank genutzt.
Die entstandenene Standby Redo Logs erkennt man am Wert "STANDBY" in der Spalte Type der View v$logfile.

Die Redo Log Daten werden von der primären Datenbank an den True Cache geschickt.
Das erkennt man an den Einstellungen der Destination "log_archive_dest_2":

 

-- HOST_PRIMARY
SYS@FREE:CDB$ROOT:>select DEST_NAME, DESTINATION, VALID_NOW, VALID_TYPE, VALID_ROLE, ROLE, DB_UNIQUE_NAME from v$archive_dest where DEST_NAME like '%DEST_2';

DEST_NAME             DESTINATION                             VALID_NOW    VALID_TYPE        VALID_ROLE      ROLE          DB_UNIQUE_NAME    
_____________________ _______________________________________ ____________ _________________ _______________ _____________ _________________ 
LOG_ARCHIVE_DEST_2    HOST_TRUE_CACHE:1521/FREE               YES          ONLINE_LOGFILE    PRIMARY_ROLE    TRUE_CACHE    FREE 

 

Folgende wichtige Parameter wurden automatisch durch den DBCA auf dem Oracle True Cache konfiguriert;

true_cache=true
remote_listener=HOST_PRIMARY:1521
fal_client=HOST_TRUE_CACHE:1521/FREE
fal_server=HOST_PRIMARY:1521/FREE

Auch der Listener wurde durch den DBCA konfiguriert und gestartet.

 

$ cat /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora

# listener.ora Network Configuration File: /opt/oracle/product/23ai/dbhomeFree/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = FREE)
      (ORACLE_HOME = /opt/oracle/product/23ai/dbhomeFree)
      (SID_NAME = FREE)
    )
  )

LISTENER =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = HOST_TRUE_CACHE)(PORT = 1521))
  )

4.3 Lesen vom Oracle True Cache

Für dieses Beispiel werden die beiden Net Servicenamen in der tnsnames.ora definiert:
PDBAPPL_PRIMARY - Verbindung zur Primary
PDBAPPL_TC             - Verbindung zum True Cache

Jetzt wird der Oracle True Cache neu gestartet, damit er keine Anwendungsdaten enthält.
Alle Container sind READ-ONLY geöffnet.

 

-- Stoppen True Cache

SYS@FREE:CDB$ROOT:> conn sys/<password>@pdbappl_tc as sysdba

SYS@FREE:CDB$ROOT:> shutdown immediate
True Cache instance shut down.

-- Starten True Cache

SYS@FREE:CDB$ROOT:>startup
ORACLE instance started.

Total System Global Area 1599564808 bytes
Fixed Size		    5360648 bytes
Variable Size		  402653184 bytes
Database Buffers	 1191182336 bytes
Redo Buffers		     368640 bytes
Database mounted.
Database opened.

SYS@FREE:CDB$ROOT:> show pdbs

    CON_ID CON_NAME			  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
	 2 PDB$SEED			  READ ONLY  NO
	 3 FREEPDB1			  READ ONLY  NO
	 4 PDBAPPL			  READ ONLY  NO

 

Mit dem folgenden Statement wird überprüft, ob sich im Oracle True Cache Objekte des Nutzers HR befinden, die mit der Zeichenkette "EMP" beginnen.
Das werden im folgenden unsere Testdaten sein. Nach dem Neustart des True Cache ist der Cache immer leer. Dieses Statement wird zur Vereinfachung von weiteren Abfragen unter dem Namen true_cache_abfrage_hr_emp.sql abgelegt und verwendet.

 

-- HOST_TRUE_CACHE 

SYS@FREE:CDB$ROOT:> conn system/<password>@pdbappl_tc

SYSTEM@FREE:PDBAPPL:>

SELECT o.OBJECT_NAME, o.OBJECT_TYPE, o.OWNER, COUNT(*) NUMBER_OF_BLOCKS, substr(d.database_role,1,10) role 
FROM DBA_OBJECTS o, V$BH bh, v$database d
WHERE o.DATA_OBJECT_ID = bh.OBJD
AND o.OWNER in ('HR') and o.object_name like 'EMP%'
GROUP BY o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE, d.database_role;

no rows selected

 

Jetzt wird in der primären Datenbank eine neue Tabelle HR.EMPLOYEES2 angelegt.
Die Daten werden im Oracle True Cache nicht refreshed, weil sie noch nicht abgefragt wurden.

 

-- HOST_PRIMARY

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdbappl_primary

SYSTEM@FREE:PDBAPPL:> create table HR.EMPLOYEES2 as select * from HR.EMPLOYEES;
Table HR.EMPLOYEES2 created.

-- HOST_TRUE_CACHE

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdborcl_tc

SYSTEM@FREE:PDBAPPL:> @true_cache_abfrage_hr_emp.sql

no rows selected

 

Jetzt erfolgt die Anmeldung am Oracle True Cache und eine Abfrage auf die neue Tabelle HR.EMPLOYEES2.
Die Daten werden refreshed von der primären Datenbank und liegen jetzt im True Cache.

 

-- HOST_TRUE_CACHE

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdbappl_tc

SYSTEM@FREE:PDBAPPL:> select count(*) from HR.EMPLOYEES2;

   COUNT(*) 
___________ 
        107 

SYSTEM@FREE:PDBAPPL:> @true_cache_abfrage_hr_emp.sql

OBJECT_NAME    OBJECT_TYPE    OWNER       NUMBER_OF_BLOCKS ROLE          
______________ ______________ ________ ___________________ _____________ 
EMPLOYEES2     TABLE          HR                         3 TRUE CACHE   

 

Bei einer Änderung auf der primären Datenbank liefert der Oracle True Cache sofort die aktuellen Daten, d.h. hier wurde ebenfalls ein Refresh durchgeführt.

 

-- HOST_PRIMARY

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdbappl_primary

SYSTEM@FREE:PDBAPPL:> insert into HR.EMPLOYEES2 select * from HR.EMPLOYEES2;

107 rows inserted.

SYSTEM@FREE:PDBAPPL:> commit;

Commit complete.

SYSTEM@FREE:PDBAPPL:> select count(*) from HR.EMPLOYEES2;

   COUNT(*) 
___________ 
        214 

-- HOST_TRUE_CACHE

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdbappl_tc

SYSTEM@FREE:PDBAPPL:> select count(*) from HR.EMPLOYEES2;

   COUNT(*) 
___________ 
        214 

SYSTEM@FREE:PDBAPPL:> select host_name from v$instance;

HOST_NAME     
_____________ 
HOST_TRUE_CACHE

4.4 DML Operationen im Oracle True Cache (DML Redirection)

Da der Oracle True Cache ein READ-ONLY Cache ist, sind DML Operationen anfangs verboten.
Der Parameter "adg_redirect_dml" steht deshalb auf "FALSE".

 

-- HOST_TRUE_CACHE

SYSTEM@FREE:PDBAPPL:> conn system/<password>@pdbappl_tc

SYSTEM@FREE:PDBAPPL:> show parameter adg_re

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
adg_redirect_dml		     boolean	 FALSE

SYSTEM@FREE:PDBAPPL:> delete from HR.EMPLOYEES2;
delete from HR.EMPLOYEES2
                *
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.

 

Jetzt wird der Parameter "adg_redirect_dml" auf "TRUE" geändert im spfile/pfile, dazu muss der Oracle True Cache neu gestartet werden.
Danach funktionieren auch DML Operationen, weil sie umgelenkt werden zur primären Datenbank. Dort erfolgt das DML und über den Refresh sieht die Anwendung den neuen Wert im Oracle True Cache. DDL Operationen sind weiterhin nicht möglich über den Oracle True Cache. Für DDL Operation muss man an der primären Datenbank angemeldet sein.

 

-- HOST_TRUE_CACHE

$ cat /opt/oracle/product/23ai/dbhomeFree/dbs/spfileFREE.ora
...
*.adg_redirect_dml=TRUE
...

SYS@FREE:CDB$ROOT:> shutdown immediate
SYS@FREE:CDB$ROOT:> startup

SYS@FREE:CDB$ROOT:> show parameter adg_re

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
adg_redirect_dml		     boolean	 TRUE

SYS@FREE:CDB$ROOT:> conn system/<password>@pdbappl_tc
Connected.

SYSTEM@FREE:PDBAPPL:> select count(*) from HR.EMPLOYEES2;

  COUNT(*)
----------
       214

SYSTEM@FREE:PDBAPPL:> delete from HR.EMPLOYEES2;

214 rows deleted.

SYSTEM@FREE:PDBAPPL:> commit;

Commit complete.

SYSTEM@FREE:PDBAPPL:> select count(*) from HR.EMPLOYEES2;

  COUNT(*)
----------
	 0

SYSTEM@FREE:PDBAPPL:> create table HR.EMPLOYEES3 as select * from HR.EMPLOYEES;
create table HR.EMPLOYEES3 as select * from HR.EMPLOYEES
                                               *
ERROR at line 1:
ORA-16000: Attempting to modify database or pluggable database that is open for read-only access.

5. Zusammenfassung

Oracle True Cache wird mit Oracle 23ai neu eingeführt.
Damit können Reporting-Anwendungen komfortabel auf einen READ-ONLY Cache ausserhalb der primären Datenbank zugreifen. Obwohl die Funktionalitäten der Active Data Guard Option sehr ähnlich sind, muss diese Option nicht lizenziert werden. Es können auch mehrere Oracle True Caches konfiguriert werden, womit einer Erweiterung des normalen Datenbank Buffer Caches möglich ist. Bei Bedarf kann DML Redirection auf dem Oracle True Cache eingeschaltet werden. Damit werden DML Operationen auf dem Oracle True Cache auf die primäre Datenbank umgelenkt. 

Weitere Informationen zu den neuen Funktionen der Oracle Datenbank 23ai finden Sie im folgenden Praxisworkshop: DBA New Features Oracle 12c bis 23ai Free

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich