LiveLab „AI Vector Search“ mit der „26ai Free Appliance“

LiveLab „AI Vector Search“ mit der „26ai Free Appliance“

15. Februar 2026 Aus Von Markus Flechtner

Die Oracle Live Labs (https://livelabs.oracle.com) sind eine großartige Möglichkeit, einen ersten Eindruck von Oracle Features zu bekommen und in einer Sandbox eigene Ideen zu sammeln. So haben wir z.B. beim „noon2noon – KI für den DBA“ ausgiebig davon Gebrauch gemacht. Wenn man allerdings das Lab „Getting started with AI Vector Search“ mit einer eigenen Datenbank, wie z.B. der „Oracle AI Database 26ai Free VirtualBox Appliance„, durchführen möchte, dann gilt es, einige kleine Hürden zu überwinden.

Die VirtualBox Appliance ist ein schönes Komplettpaket, wenn man schnell erste Erfahrungen mit der neuen Oracle AI Database 26ai sammeln möchte: die Datenbank ist vorinstalliert, dazu APEX und SQL Developer Web – mehr braucht man nicht.

Für das Livelab „Getting Started with AI Vector Search“ müssen wir aber einige Vorbereitungen treffen, damit die Übungen funktionieren.

Die folgenden Schritte orientieren sich am Ablauf des LiveLabs und sind um die nötigen zusätzlichen Aufgaben ergänzt:

Schritt 1: in der PDB FREEPDB1 die MAX_STRING_SIZE ändern

Der Parameter MAX_STRING_SIZE=EXTENDED erlaubt es, VARCHAR2-Spalten mit einer Länge von 32 KB zu speichern. Über dieses Feature habe ich schon in einigen anderen Beiträgen geschrieben (hier, hier und hier). Im Kontext der AI Vektorsuche sind diese längeren VARCHAR2-Spalten hilfreich, damit die „hybride Vektorindizierung“ mit größeren Chunks, d.h. Textteilen arbeiten kann. Einzelheiten dazu gibt es in der Dokumentation. In einer Container-Datenbank – und seit Oracle 21c gibt es ja nur noch Container-Datenbanken – können wir diese Einstellung auf PDB-Ebene vornehmen, sprich: obwohl der Container CDB$ROOT noch mit der Standard-Einstellung arbeitet, können PDBS auf „EXTENDED“ konfiguriert sein. Dazu müssen wir auf PDB-Ebene den Parameter „MAX_STRING_SIZE“ auf „EXTENDED“ ändern und das Skript utl32k.sql aus dem $ORACLE_HOME/rdbms/admin-Verzeichnis ausführen. Im Einzelnen sieht das so aus:

[oracle@localhost dbs]$ sqlplus sys/oracle@FREEPDB1 as sysdba

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Feb 10 17:02:10 2026
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> alter system set max_string_size=EXTENDED scope=spfile;
System altered.

SQL> alter session set container=CDB$ROOT;
Session altered.

SQL> alter pluggable database FREEPDB1 close immediatE;
Pluggable database altered.

SQL> alter pluggable database FREEPDB1 open upgrade;
Pluggable database altered.

SQL> alter session set container=FREEPDB1;
Session altered.

SQL> @?/rdbms/admin/utl32k
Session altered.

Session altered.

DOC>######################################################################
DOC>######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database has not been opened for UPGRADE.
DOC>
DOC>   Perform a "SHUTDOWN ABORT"  and
DOC>   restart using UPGRADE.
DOC>######################################################################
DOC>######################################################################
DOC>#

no rows selected

DOC>######################################################################
DOC>######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database does not have compatible >= 12.0.0
DOC>
DOC>   Set compatible >= 12.0.0 and retry.
DOC>######################################################################
DOC>######################################################################
DOC>#

PL/SQL procedure successfully completed.

Session altered.

448 rows updated.

Commit complete.

System altered.

PL/SQL procedure successfully completed.

Commit complete.

System altered.

Session altered.

Session altered.

Table created.

Table created.

Table created.

Table truncated.

0 rows created.

PL/SQL procedure successfully completed.

STARTTIME
--------------------------------------------------------------------------
02/10/2026 17:04:42.264055000

PL/SQL procedure successfully completed.
No errors.
PL/SQL procedure successfully completed.

Session altered.

Session altered.

0 rows created.

no rows selected

no rows selected

DOC>######################################################################
DOC>######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if we encountered an error while modifying a column to
DOC>   account for data type length change as a result of enabling or
DOC>   disabling 32k types.
DOC>
DOC>   Contact Oracle support for assistance.
DOC>######################################################################
DOC>######################################################################
DOC>#

PL/SQL procedure successfully completed.

PL/SQL procedure successfully completed.

Commit complete.

Package altered.

Session altered.

SQL> alter session set container=CDB$ROOT;
Session altered.

SQL> alter pluggable database FREEPDB1 close immediate;
Pluggable database altered.

SQL> alter pluggable database FREEPDB1 open;
Pluggable database altered.

SQL> alter session set container=FREEPDB1;
Session altered.

SQL> show parameter MAX_STRING_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------------------
max_string_size                      string      EXTENDED

Schritt 2: Tablespace DATA in der FREEPDB1 anlegen

Damit wir die Demo-Daten importieren können, brauchen wir einen kleinen Tablespace DATA:

SQL> create tablespace DATA datafile '/opt/oracle/oradata/FREE/FREEPDB1/data01.dbf' size 100M autoextend on next 100M maxsize 4000M;
Tablespace created.

Schritt 3: Benutzer NATIONALPARKS anlegen

Für den Import müssen wir den Benutzer NATIONALPARKS anlegen und „REST-aktivieren“:

SQL> create user nationalparks identified by "Welcome_12345"
  2  default tablespace data temporary tablespace temp;
User created.

SQL> alter user nationalparks quota unlimited on data;
User altered.

SQL> grant connect,resource to nationalparks;
Grant succeeded.

SQL> BEGIN
ORDS_ADMIN.ENABLE_SCHEMA(
	    p_enabled => TRUE,
	    p_schema => 'NATIONALPARKS',
	    p_url_mapping_type => 'BASE_PATH',
	    p_url_mapping_pattern => 'nationalparks',
	    p_auto_rest_auth=> TRUE
	  );
commit;
END;
/

In der Anleitung der LiveLabs wird auch noch der Befehl „C##ADP$SERVICE.DBMS_SHARE.ENABLE_SCHEMA“ ausgeführt. Dieses Package ist aber in unserer Nicht-Cloud-Datenbank nicht verfügbar und es hat keine negativen Auswirkungen, wenn wir diesen Schritt ignorieren.

Schritt 4: Package DBMS_CLOUD anlegen

Das Package DBMS_CLOUD fehlt in unserer Datenbank, kann aber einfach nachinstalliert werden, da die nötigen Skripte im $ORACLE_HOME/rdbms/admin-Verzeichnis vorhanden sind (Dank an Tim Hall für den Tipp).

$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \
  -u sys/oracle \
  --force_pdb_mode 'READ WRITE' \
  -b dbms_cloud_install \
  -d $ORACLE_HOME/rdbms/admin/ \
  -l /tmp \
  catclouduser.sql
  
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl \
  -u sys/oracle \
  --force_pdb_mode 'READ WRITE' \
  -b dbms_cloud_install \
  -d $ORACLE_HOME/rdbms/admin/ \
  -l /tmp \
  dbms_cloud_install.sql

Schritt 5: Rechte an den Benutzer NATIONALPARKS vergeben

GRANT ORDS_RUNTIME_ROLE TO nationalparks;
GRANT EXECUTE ON dbms_cloud TO nationalparks;
GRANT EXECUTE ON DBMS_NETWORK_ACL_ADMIN TO nationalparks;
GRANT READ,WRITE ON directory data_pump_dir TO nationalparks;
GRANT CREATE mining model TO nationalparks;
GRANT SELECT ON sys.v_$vector_memory_pool TO nationalparks;
GRANT SELECT ON sys.v_$vector_index TO nationalparks;

Schritt 6: ONNX-Modell importieren

Für die Übung muss ein Deep-Learning-Modell in die Datenbank importiert werden. Dieses liegt in. sog. ONNX-Format („ONNX=Open Neural Network Exchange“) und liegt in einem Object Storage in der Oracle Cloud bereit. Leider funktioniert der direkte Zugriff aus der Datenbank heraus auf den Object Storage nicht, so dass wir einige Zwischenschritte einlegen müssen:

Herunterladen der nötigen Dateien mit wget:

[oracle@localhost ~]$ pwd
/home/oracle

wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/labfiles/clip-vit-base-patch32_txt.onnx

[oracle@localhost ~]$ wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/labfiles/all_MiniLM_L12_v2.onnx

wget 
wget wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/labfiles/natparks.dmp

Da wir für den Import das DATA_PUMP_DIR der PDB nutzen wollen, müssen wir erstmal herausfinden, wo dieses Verzeichnis in unserer Datenbank liegt:

[oracle@localhost ~]$ sqlplus sys/oracle@FREEPDB1 as sysdba

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Feb 10 18:00:30 2026
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> select directory_path from dba_directories where directory_name='DATA_PUMP_DIR';

DIRECTORY_PATH
--------------------------------------------------------------------------------
/opt/oracle/admin/FREE/dpdump/41998495EF3A327FE0630100007FEF3A

SQL> exit
Disconnected from Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

Dateien kopieren

Anschließend können wir die Dateien in das DATA_PUMP_DIR kopieren:

[oracle@localhost ~]$ cp *.onnx /opt/oracle/admin/FREE/dpdump/41998495EF3A327FE0630100007FEF3A/.
[oracle@localhost ~]$ cp natparks.dmp /opt/oracle/admin/FREE/dpdump/41998495EF3A327FE0630100007FEF3A/.

ONNX-Modell importieren

Jetzt können wir vom SQL*Plus aus das ONNX-Modell importieren:

SQL> connect nationalparks/"Welcome_12345"@FREEPDB1
Connected.

begin
	  dbms_vector.load_onnx_model(directory=>'DATA_PUMP_DIR', 
	    file_name=>'clip-vit-base-patch32_txt.onnx', model_name=>'clip_vit_txt',
	    metadata=>JSON('{"function" : "embedding", "embeddingOutput" : "embedding" , "input": {"input": ["DATA"]}}'));
end;
/

Das zweite Modell, all_MiniLM_L12_v2.onnx, wird erst später benötigt.

Schritt 7: Beispieldaten laden

Beim Laden der Beispieldaten kommt es zum nächsten Problem: die Beispieldaten kommen aus einer Datenbank mit der Version 44 der Zeitzonendaten, unsere Datenbank hat aber noch die Version 43. DataPump kann das standardmäßig nicht und so bricht der impdp mit der Fehlermeldung „ORA-39405: Oracle Data Pump does not support importing from a source database with TSTZ version 44 into a target database with TSTZ version 43.“. Für dieses Problem gibt es aber einen Workaround in Form eines „_“-Parameters:

[oracle@localhost ~]$ sqlplus sys/oracle@freepdb1 as sysdba
SQL*Plus: Release 23.26.0.0.0 - Production on Tue Feb 10 18:35:40 2026
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> alter system set "_datapump_bypass_tstz_check"=TRUE scope=memory;
System altered.

SQL> exit
Disconnected from Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

(Dank an Mike Dietrich für diesen Tipp)

Und jetzt funktioniert auch der Import:

[oracle@localhost ~]$ impdp nationalparks/Welcome_12345@FREEPDB1 directory=data_pump_dir dumpfile=natparks.dmp logfile=nationalparks_imp.log

Import: Release 23.26.0.0.0 - Production on Tue Feb 10 18:36:40 2026
Version 23.26.0.0.0
Copyright (c) 1982, 2025, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Master table "NATIONALPARKS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "NATIONALPARKS"."SYS_IMPORT_FULL_01":  nationalparks/********@FREEPDB1 directory=data_pump_dir dumpfile=natparks.dmp logfile=nationalparks_imp.log
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA/LOGREP
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "NATIONALPARKS"."PARK_IMAGES"               437.3 MB  176273 rows
. . imported "NATIONALPARKS"."PARKS"                     464.2 KB     472 rows
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/INDEX/DOMAIN_INDEX/INDEX
Processing object type SCHEMA_EXPORT/POST_SCHEMA/PROCACT_SCHEMA/LBAC_EXP
Job "NATIONALPARKS"."SYS_IMPORT_FULL_01" successfully completed at Tue Feb 10 18:38:06 2026 elapsed 0 00:01:23

Schritt 8: APEX-Applikation importieren

Für das LiveLab gibt es auch eine APEX-Applikation, die wir einfach in unsere Appliance importieren können, denn APEX ist ja bereits installiert.

Download der SQL-Skripte vom Object Storage

wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/labfiles/w100001.sql
wget https://c4u04.objectstorage.us-ashburn-1.oci.customer-oci.com/p/EcTjWk2IuZPZeNnD_fYMcgUhdNDIDA6rt9gaFj_WZMiL7VvxPBNMY60837hu5hga/n/c4u04/b/livelabsfiles/o/labfiles/f114.sql

[oracle@localhost ~]$ ls -ltr *.sql
-rw-r--r--. 1 oracle dba  14400 Aug  8  2025 w100001.sql
-rw-r--r--. 1 oracle dba 752059 Aug  8  2025 f114.sql

Ausführen der SQL-Skripte

[oracle@localhost ~]$ sqlplus sys/oracle@freepdb1 as sysdba

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Feb 10 18:42:01 2026
Version 23.26.0.0.0

Copyright (c) 1982, 2025, Oracle.  All rights reserved.
Connected to:
Oracle AI Database 26ai Free Release 23.26.0.0.0 - Develop, Learn, and Run for Free
Version 23.26.0.0.0

SQL> @w100001.sql
[...]
SQL> @f114.sql
[...]

Danach können wir die Applikation öffnen. Die URL ist http://<HOST_IP>:8080/ords/f?P=114

Ab hier sind alle nötigen Anpassungen für die erste Übung der Livelabs abgeschlossen. Für eine spätere Übung, wenn Vektor-Indizes angelegt werden, müssen wir noch den Parameter VECTOR_MEMORY_SIZE setzen:

Schritt 9: Parameter Vector_Memory_Size setzen

SQL>  connect sys/oracle@FREE as sysdba
Connected.
SQL> alter system set vector_memory_size=200M;
alter system set vector_memory_size=200M
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-51950: The Oracle Database Vector Memory size cannot be increased.
Help: https://docs.oracle.com/error-help/db/ora-02097/

SQL> alter system set vector_memory_size=200M scope=spfile;
System altered.

SQL>
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
ERROR:
ORA-01017: invalid credential or not authorized; logon denied
Help: https://docs.oracle.com/error-help/db/ora-01017/

SQL> exit
[

Der ORA-1017 tritt auf, weil in der .bash_profile der Appliance der Parameter TWO_TASK gesetzt wird. Diesen löschen wir jetzt. Dann können wir uns auch mit „/ as sysdba“ anmelden.

oracle@localhost admin]$ export TWO_TASK=

Jetzt können wir die Instanz einfach starten:

[oracle@localhost admin]$ sqlplus / as sysdba

SQL*Plus: Release 23.26.0.0.0 - Production on Tue Feb 10 19:37:34 2026
Version 23.26.0.0.0

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

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 1603373280 bytes
Fixed Size                  5007584 bytes
Variable Size             369098752 bytes
Database Buffers         1006632960 bytes
Redo Buffers                4530176 bytes
Vector Memory Area        218103808 bytes
Database mounted.
Database opened.
SQL> show parameter vector_memory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
vector_memory_size                   big integer 208M
SQL> alter session set container=FREEPDB1;
Session altered.

SQL>  show parameter vector_memory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
vector_memory_size                   big integer 208M

Damit sind aber auch wirklich alle Workarounds für das LiveLab „Getting Started with AI Vector Search“ abgeschlossen und man kann ganz normal die Aufgaben fortsetzen.

Download: PDF mit allen Workarounds, Aufgaben und Lösungen

Links

Artikelbild von Nahrizul Kadri auf Unsplash