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