An Oracle writer → Oracle 19c → JPA Micro-Integration → Solace → JPA Micro-Integration → PostgreSQL → PostgreSQL reporter Demo
End-to-end demo showing how to stream data from an Oracle 19c source database into PostgreSQL via a Solace PubSub+ Standard event broker and the Solace Databases (JPA) Micro‑Integration, with Python services producing and consuming data.
This repo contains:
-
docker-compose.yml– brings up:- Oracle 19c source DB (Enterprise Edition, official Oracle container image)
- PostgreSQL target DB
- Solace PubSub+ Standard broker
- Solace Databases (JPA) micro‑integration instance for Oracle → Solace
- Solace Databases (JPA) micro‑integration instance for Solace → PostgreSQL
- A Python Oracle writer service (inserts new test data every 30 seconds)
- A Python PostgreSQL reporter service (continuously prints new rows)
-
Auto‑init database scripts:
- Oracle:
oracle-init/00_create_user.sql,oracle-init/01_create_schema.sqlandoracle-init/02_create_AQ_queue_plus_test.sql - PostgreSQL:
postgres-init/01_create_schema.sql
- Oracle:
-
Python apps:
oracle-writer/– inserts rows into Oracle table(s)postgres-reporter/– reads rows from PostgreSQL table(s)
-
JPA Micro‑Integration configs:
config and entity/Emil_PoC/Source_JPA_ora_TEST_IDENTIFICATIONconfig and entity/Emil_PoC/SINK_JPA_pos_test_identification
⚠️ Important:
The Solace Databases (JPA) Micro‑Integration container image is not on Docker Hub.
You must download versionpubsubplus-connector-database-2.0.1-image.tar(or acquire a later version) from https://solace.com/integration-hub/databases-jpa/ at the Solace Integration Hub anddocker loadit locally before using this demo, see documentationpubsubplus-connector-database-2.0.1-User-Guide.pdf.
TODO: swap order JPA MI Oracle and Solace PubSub+ Standard, arrow from JPA MI Oracle to Oracle 19c DB
+-------------------+ +----------------------------+ +---------------------+
| Oracle 19c DB | | Solace PubSub+ Standard | | PostgreSQL DB |
| (source) | | (event broker) | | (target) |
+---------+---------+ +---------------+------------+ +----------+----------+
^ ^ ^
| | |
| | |
| +--------+--------+ |
| | JPA MI: | |
| | Oracle → Solace| |
| +--------+--------+ |
| | |
| Topics: | |
| db/oracle/test_identification |
| db/oracle/test_metrics |
| v |
+---------+---------+ +---------------+------------+ +----------+----------+
| Python Writer | | Queues on Solace | ---> | JPA MI: |
| (oracle-writer) | | Q.ORACLE.TEST_IDENT... | | Solace → Postgres |
+------------------+ | Q.ORACLE.TEST_METRICS | +----------+---------+
+----------------------------+ |
v
+--------+--------+
| Python Reporter |
| postgres-repor. |
+-----------------+
This repo provides a docker-compose.yml file to run demo as a standalone setup. You can use existing (Cloud) components like Oracle, PostgreSQL database and Solace broker by changing environment parameters. Docker Desktop can convert your Compose file into Kubernetes manifests and deploy them to the Kubernetes cluster.
You’ll need:
- Docker Desktop or similar alternatives (
podman,colimawith docker-compose installed, might hit some caveats). - Ability to log in to Oracle Container Registry and accept the Oracle Database 19c image license.
- Access to the Solace Databases (JPA) Micro‑Integration container image:
- Download from Solace Integration Hub (Databases JPA connector).
- You should end up with a
.tarimage file which you then load into Docker.
- Internet access for pulling the Postgres and Solace broker images (once).
After unpacking/cloning:
sopdemo
├── documents
├── images
├── jpa-oracle-config
├── jpa-oracle-source-package
├── jpa-postgres-config
│ └── lib
├── oracle-init
├── oracle-writer
├── postgres-init
├── postgres-reporter
└── samples
(source: tree ../sopdemo -d > tree.txt)
- Go to Oracle Container Registry https://container-registry.oracle.com/ (you must have an Oracle account).
- Accept the license for Oracle Database Enterprise Edition 19c.
- Log in and pull the image:
docker login container-registry.oracle.com
docker pull container-registry.oracle.com/database/enterprise:19.3.0.0With the docker login ... you have to use token not password so you might need to login into Oracle Registry online first and create token to use that with the Docker command, see https://docs.oracle.com/en-us/iaas/Content/Functions/Tasks/functionsgenerateauthtokens.htm (that changed some time end of 2025).
This is the image used by oracle19c in docker-compose.yml.
NOTE: Docker Desktop (or similar) must be running the docker daemon. If not you might error message like:
failed to connect to the docker API at unix:///Users/emilzegers/.docker/run/docker.sock; check if the path is correct and if the daemon is running: dial unix /Users/emilzegers/.docker/run/docker.sock: connect: no such file or directory- Go to the Solace Integration Hub → Databases (JPA).
- Download the container image for the JPA micro‑integration.
- Load it into Docker and tag it as
solace/mi-databases-jpa:2.0.1(or adjust the tag and the compose file):
For 2.0.1 (previously used in this demo)
docker load -i ./pubsubplus-connector-database-2.0.1-image.tar
docker images
docker tag <IMAGE_ID> solace/mi-databases-jpa:2.0.1For 2.0.2 (now used in this demo)
docker load -i ./pubsubplus-connector-databaseV2.0.2.tar
docker images
docker tag <IMAGE_ID> solace/mi-databases-jpa:2.0.2Replace <IMAGE_ID> with the ID from docker images, for example:
docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
container-registry.oracle.com/database/enterprise:19.3.0.0
291fd8c7958b 8.32GB 0B
solace/solace-pubsub-connector-database:2.0.1
ef614b5c4b57 291MB 0B
emilzegers@ezSolace sopdemo % docker tag ef614b5c4b57 solace/mi-databases-jpa:2.0.1If you use a different tag, update docker-compose.yml accordingly.
Ensure you are in the root of the project:
cd <path/to/sopdemo>NOTE: depending on OS and Docker version you might need to use either docker compose or docker-compose
docker-compose build oracle-writer postgres-reporterIf necessary check for running containers (starting with docker ps -a ) to avoid any port conflicts.
docker-compose up -d oracle19c postgres solace-brokerThe Oracle container will automatically run oracle-init/01_create_schema.sql during its first startup.
Wait a few minutes for Oracle to initialize. You can check logs and/or stats with below commands or monitor in Docker Desktop:
docker logs -f oracle19c
docker stats oracle19cOnce Oracle writes that the database is open and ready, you can continue. See Appendix Oracle Log for more details.
#########################
DATABASE IS READY TO USE!
#########################TIP: Use DBeaver to easily check Oracle and PostgreSQL database connectivity and schema creation (https://dbeaver.io/download/ or brew install --cask dbeaver-community).
Ensure that Oracle, Postgres, and the Solace containers are running, then:
docker-compose up -d jpa-oracle-source jpa-postgres-targetThese will read their configuration from the configuration volume mappings.
TODO: adjust below mappings as these are not the current ones using some test code. See docker-compose.yml.
jpa-oracle-config/application.yml(Oracle → Solace)jpa-postgres-config/application.yml(Solace → Postgres)
Open PubSub+ Manager in your browser:
- URL:
http://localhost:8080 - Default credentials from
docker-compose.yml:admin / admin
Check that the queues:
Q.ORACLE.TEST_IDENTIFICATIONQ.ORACLE.TEST_METRICSpmacs_lvqpmacs_lvq1
exist and have the correct topic subscriptions configured (also defined in the JPA MI config).
If not present, you can quickly create them in the UI (or via CLI/SEMP) and add subscriptions:
Q.ORACLE.TEST_IDENTIFICATION→db/oracle/test_identificationQ.ORACLE.TEST_METRICS→db/oracle/test_metricspmacs_lvq→lvq/pmacspmacs_lvq1→lvq/pmacs1
TODO: automate this, have script for this purpose
docker-compose up -d oracle-writerThis service:
- Every 30 seconds:
- Inserts one row into
TEST_IDENTIFICATION. - Inserts three metrics rows into
TEST_METRICS.
- Inserts one row into
- Commits the transaction.
These new rows are picked up by the JPA Oracle source instance and published as messages to Solace topics.
docker-compose up -d postgres-reporterNow, the full flow is:
- Oracle writer inserts rows into Oracle 19c.
- JPA Oracle source polls Oracle and publishes changes to:
db/oracle/test_identificationdb/oracle/test_metrics
- On the broker, those topics are attracted to:
Q.ORACLE.TEST_IDENTIFICATIONQ.ORACLE.TEST_METRICS
- JPA Postgres target consumes from those queues and writes to:
test_identificationtest_metrics
- Postgres reporter polls for new rows and prints them.
View the reporter logs:
docker logs -f sopdemo-postgres-reporterYou should see lines similar to:
2026-01-29T15:35:06.940Z INFO Latest identification: [(10078, 'demo', datetime.datetime(2026, 1, 21, 21, 13, 46, tzinfo=datetime.timezone.utc))]
2026-01-29T15:35:06.941Z INFO Latest metrics: []
2026-01-29T15:35:16.942Z INFO Latest identification: [(10078, 'demo', datetime.datetime(2026, 1, 21, 21, 13, 46, tzinfo=datetime.timezone.utc))]
2026-01-29T15:35:16.942Z INFO Latest metrics: []
Connect into the container:
docker exec -it oracle19c bashInside the container:
sqlplus testuser/testuser@ORCLPDB1
SELECT * FROM TEST_IDENTIFICATION ORDER BY TEST_ID DESC;
SELECT * FROM TEST_METRICS ORDER BY METRIC_ID DESC;From your host:
docker exec -it postgres psql -U demo -d demo
SELECT * FROM test_identification ORDER BY test_id DESC;
SELECT * FROM test_metrics ORDER BY metric_id DESC;You should see rows corresponding to the ones in Oracle.
Or use DBeaver if your prefer an easy GUI.
To stop everything:
docker-compose downTo remove volumes (Oracle/Postgres data will be wiped):
docker-compose down -v- Oracle startup takes time: The initial creation of the CDB/PDB can easily take a few minutes. Don’t start the JPA or writer too early.
- JPA configs: The provided
application.ymlfiles are sane defaults that assume:- Single Solace broker.
- Default Message VPN (
default). - Simple direct mapping of table columns to JSON payload fields.
- You may need to tweak workflow and entity configuration according to your exact JPA MI version. Use the official user guide as reference.
- Connector workflows:
jpa-oracle-sourcedefines two workflows:TEST_IDENTIFICATIONtable →db/oracle/test_identificationTEST_METRICStable →db/oracle/test_metrics
jpa-postgres-targetdefines two workflows:Q.ORACLE.TEST_IDENTIFICATION→test_identificationQ.ORACLE.TEST_METRICS→test_metrics
If you get stuck with the JPA micro‑integration configuration, enable DEBUG logs in the MI container and compare with the examples in the official docs.
Happy testing! 🚀
To remove extended attributes from a downloaded file:
xattr -c pubsubplus-connector-database-2.0.2-SNAPSHOT.jarSave listed jar contents to file:
unzip -l pubsubplus-connector-database-2.0.2-SNAPSHOT.jar > pubsubplus-connector-database-2.0.2-SNAPSHOT.txtdocker-compose build oracle-writer postgres-reporter
[+] Building 19.7s (22/22) FINISHED
=> [internal] load local bake definitions 0.0s
=> => reading from stdin 1.11kB 0.0s
=> [oracle-writer internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 195B 0.0s
=> [postgres-reporter internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 282B 0.0s
=> [oracle-writer internal] load metadata for docker.io/library/python:3.12-slim 1.7s
=> [postgres-reporter internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [oracle-writer internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [oracle-writer 1/5] FROM docker.io/library/python:3.12-slim@sha256:fa48eefe2146644c2308b909d6bb7651a768178f84fc9550dcd495e4d6d84d01 2.1s
=> => resolve docker.io/library/python:3.12-slim@sha256:fa48eefe2146644c2308b909d6bb7651a768178f84fc9550dcd495e4d6d84d01 0.0s
=> => sha256:be2247ce67e89642d0ab8de566a63a5dead183ebe55e6c08c14c573aa486a7c2 249B / 249B 0.3s
=> => sha256:a9f68c0a3aadb70a0b446f162248647f1909e76228a6c95bb38c0a7478bc0352 12.04MB / 12.04MB 0.8s
=> => sha256:e4f53be5987bcccb341c9ba8661a266f8f4a6416b21b4bb1de6af395f2f9e3f4 1.27MB / 1.27MB 0.6s
=> => sha256:f626fba1463b32b20f78d29b52dcf15be927dbb5372a9ba6a5f97aad47ae220b 30.14MB / 30.14MB 1.4s
=> => extracting sha256:f626fba1463b32b20f78d29b52dcf15be927dbb5372a9ba6a5f97aad47ae220b 0.4s
=> => extracting sha256:e4f53be5987bcccb341c9ba8661a266f8f4a6416b21b4bb1de6af395f2f9e3f4 0.0s
=> => extracting sha256:a9f68c0a3aadb70a0b446f162248647f1909e76228a6c95bb38c0a7478bc0352 0.2s
=> => extracting sha256:be2247ce67e89642d0ab8de566a63a5dead183ebe55e6c08c14c573aa486a7c2 0.0s
=> [oracle-writer internal] load build context 0.0s
=> => transferring context: 2.13kB 0.0s
=> [postgres-reporter internal] load build context 0.0s
=> => transferring context: 2.05kB 0.0s
=> [oracle-writer 2/5] WORKDIR /app 0.2s
=> [postgres-reporter 2/6] RUN apt-get update && apt-get install -y libpq-dev gcc && rm -rf /var/lib/apt/lists/* 8.6s
=> [oracle-writer 3/5] COPY requirements.txt . 0.0s
=> [oracle-writer 4/5] RUN pip install --no-cache-dir -r requirements.txt 2.4s
=> [oracle-writer 5/5] COPY main.py . 0.0s
=> [oracle-writer] exporting to image 1.1s
=> => exporting layers 0.9s
=> => exporting manifest sha256:31f7523d8fef374cede40920c55383d78adee16aa8f381c5836aeb7e0e9c0c4e 0.0s
=> => exporting config sha256:e94320473825036e25b5edef0916c499b0d01d50390e5a50ad408cb922eaee95 0.0s
=> => exporting attestation manifest sha256:40bf87a0b7dcc359591be5b8062f71ded459fdc1624a6dd683b8bf0431fe6c6f 0.0s
=> => exporting manifest list sha256:ea0107eae2459b80bf23fcddaf6a8e9846338f570f37f75b4c20266525f08ac1 0.0s
=> => naming to docker.io/library/sopdemo-oracle-writer:latest 0.0s
=> => unpacking to docker.io/library/sopdemo-oracle-writer:latest 0.2s
=> [oracle-writer] resolving provenance for metadata file 0.0s
=> [postgres-reporter 3/6] WORKDIR /app 0.0s
=> [postgres-reporter 4/6] COPY requirements.txt . 0.0s
=> [postgres-reporter 5/6] RUN pip install --no-cache-dir -r requirements.txt 1.4s
=> [postgres-reporter 6/6] COPY main.py . 0.0s
=> [postgres-reporter] exporting to image 5.5s
=> => exporting layers 4.6s
=> => exporting manifest sha256:0b23be98940a921e44a06abdcbc69ef38d4a97d05fd726a9ce434cc8569b9ab3 0.0s
=> => exporting config sha256:71011b9022646571c04d4062f595aa17094e076d84a88cb8419ff457354f3a05 0.0s
=> => exporting attestation manifest sha256:1cb959962f42d2e3c01059b6ce631b30a9acb01322c1d6a3c07d149352f8e94d 0.0s
=> => exporting manifest list sha256:60cb47f4a1f3f1c6a17da4c0a4bbaf9ab07aab34e2da3288da33cee97abccb90 0.0s
=> => naming to docker.io/library/sopdemo-postgres-reporter:latest 0.0s
=> => unpacking to docker.io/library/sopdemo-postgres-reporter:latest 0.9s
=> [postgres-reporter] resolving provenance for metadata file 0.0s
[+] Building 2/2
✔ sopdemo-postgres-reporter Built 0.0s
✔ sopdemo-oracle-writer Built docker-compose up -d oracle19c postgres solace-broker
[+] Running 30/30
✔ solace-broker Pulled 43.8s
✔ 37ec27b0cc89 Pull complete 42.0s
✔ eb0c5f005c94 Pull complete 38.3s
✔ bb4d4e0bb46a Pull complete 40.7s
✔ 4f4fb700ef54 Pull complete 0.7s
✔ 040d3098cb9f Pull complete 40.6s
✔ 3d31ff0be4b8 Pull complete 16.0s
✔ 4878ebb9364a Pull complete 39.0s
✔ eb1c72a6f5f4 Pull complete 39.2s
✔ postgres Pulled 16.9s
✔ 68ddf11a3b09 Pull complete 2.2s
✔ 095c943337a4 Pull complete 2.1s
✔ 70eefe1d4030 Pull complete 12.9s
✔ 30510bb727c6 Pull complete 12.8s
✔ 9489ff614da7 Pull complete 2.2s
✔ 5c0519ff8ffa Pull complete 2.1s
✔ 6dd96c6166b0 Pull complete 5.6s
✔ 1790448b2ffa Pull complete 5.7s
✔ 87e4529caf5b Pull complete 2.2s
✔ dd41c2432499 Pull complete 2.1s
✔ 1ec970c8249c Pull complete 3.5s
✔ 7f7bda153710 Pull complete 5.5s
✔ c460c571d627 Pull complete 2.1s
✔ oracle19c Pulled 42.4s
✔ 581cd9b60709 Pull complete 40.4s
✔ e910ada64373 Pull complete 39.0s
✔ 1a21ffc61e30 Pull complete 14.1s
✔ 6892bd8688ca Pull complete 39.9s
✔ a0e6f73c8374 Pull complete 14.9s
✔ e4752e3cd1af Pull complete 38.0s
[+] Running 5/5
✔ Network sopdemo_default Created 0.0s
✔ Volume sopdemo_oracle-free-data Created 0.0s
✔ Container oracle19c Started 0.8s
✔ Container solace-broker Started 0.8s
✔ Container postgres Started 0.8s docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
473df24add2f postgres:16 "docker-entrypoint.s…" 7 seconds ago Up 7 seconds 0.0.0.0:5432->5432/tcp, [::]:5432->5432/tcp postgres
25bb2b256061 gvenzl/oracle-free:23-slim "container-entrypoin…" 7 seconds ago Up 7 seconds 0.0.0.0:1521->1521/tcp, [::]:1521->1521/tcp, 0.0.0.0:5500->5500/tcp, [::]:5500->5500/tcp oracle19c
2c92c2e4a2e5 solace/solace-pubsub-standard:latest "/usr/sbin/boot.sh" 7 seconds ago Up 7 seconds 0.0.0.0:8008->8008/tcp, [::]:8008->8008/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:55443->55443/tcp, [::]:55443->55443/tcp, 0.0.0.0:55554->55555/tcp, [::]:55554->55555/tcp solace-brokerdocker logs -f oracle19c
CONTAINER: starting up...
CONTAINER: first database startup, initializing...
CONTAINER: uncompressing database data files, please wait...
CONTAINER: done uncompressing database data files, duration: 4 seconds.
CONTAINER: starting up Oracle Database...
LSNRCTL for Linux: Version 23.26.0.0.0 - Production on 14-DEC-2025 00:18:51
Copyright (c) 1991, 2025, Oracle. All rights reserved.
Starting /opt/oracle/product/26ai/dbhomeFree/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 23.26.0.0.0 - Production
System parameter file is /opt/oracle/product/26ai/dbhomeFree/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/3427e91abf2f/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_FREE)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 23.26.0.0.0 - Production
Start Date 14-DEC-2025 00:18:51
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Default Service FREE
Listener Parameter File /opt/oracle/product/26ai/dbhomeFree/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/3427e91abf2f/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_FREE)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
ORACLE instance started.
Total System Global Area 1603373280 bytes
Fixed Size 5007584 bytes
Variable Size 654311424 bytes
Database Buffers 939524096 bytes
Redo Buffers 4530176 bytes
Database mounted.
Database opened.
CONTAINER: Resetting SYS and SYSTEM passwords.
User altered.
User altered.
CONTAINER: Creating app user for default pluggable database.
Session altered.
User created.
Grant succeeded.
CONTAINER: DONE: Creating app user for default pluggable database.
CONTAINER: Executing user-defined scripts...
CONTAINER: running /container-entrypoint-startdb.d/01_create_schema.sql ...
Session altered.
CREATE USER testuser IDENTIFIED BY testuser
*
ERROR at line 1:
ORA-01920: user name 'TESTUSER' conflicts with another user or role name
Help: https://docs.oracle.com/error-help/db/ora-01920/
Grant succeeded.
Table created.
Table created.
Sequence created.
Sequence created.
CONTAINER: DONE: running /container-entrypoint-startdb.d/01_create_schema.sql
CONTAINER: DONE: Executing user-defined scripts.
#########################
DATABASE IS READY TO USE!
#########################
####################################################################
CONTAINER: The following output is now from the alert_FREE.log file:
####################################################################
Completed: ALTER DATABASE OPEN
2025-12-14T00:18:54.058656+00:00
Thread 1 advanced to log sequence 13 (LGWR switch), current SCN: 2276767
Current log# 1 seq# 13 mem# 0: /opt/oracle/oradata/FREE/redo01.log
Thread 1 cannot allocate new log, sequence 14
Checkpoint not complete
Current log# 1 seq# 13 mem# 0: /opt/oracle/oradata/FREE/redo01.log
2025-12-14T00:18:54.713203+00:00
Thread 1 advanced to log sequence 14 (LGWR switch), current SCN: 2276898
Current log# 2 seq# 14 mem# 0: /opt/oracle/oradata/FREE/redo02.log
2025-12-14T00:18:54.765649+00:00
Resize operation completed for file# 18, fname /opt/oracle/oradata/FREE/undotbs01.dbf, old size 11264K, new size 21504K
2025-12-14T00:18:55.163910+00:00
Thread 1 advanced to log sequence 15 (LGWR switch), current SCN: 2277625
Current log# 1 seq# 15 mem# 0: /opt/oracle/oradata/FREE/redo01.log
Thread 1 cannot allocate new log, sequence 16
Checkpoint not complete
Current log# 1 seq# 15 mem# 0: /opt/oracle/oradata/FREE/redo01.log
2025-12-14T00:18:55.367356+00:00
Thread 1 advanced to log sequence 16 (LGWR switch), current SCN: 2277673
Current log# 2 seq# 16 mem# 0: /opt/oracle/oradata/FREE/redo02.log
FREEPDB1(3):Resize operation completed for file# 23, fname /opt/oracle/oradata/FREE/FREEPDB1/undotbs01.dbf, old size 11264K, new size 21504Kdocker logs -f oracle19c
[2025:12:18 17:34:49]: Acquiring lock .ORCLCDB.create_lck with heartbeat 30 secs
[2025:12:18 17:34:49]: Lock acquired
[2025:12:18 17:34:49]: Starting heartbeat
[2025:12:18 17:34:49]: Lock held .ORCLCDB.create_lck
ORACLE EDITION: ENTERPRISE
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 18-DEC-2025 17:34:49
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/544c5dcf5add/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 18-DEC-2025 17:34:49
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/544c5dcf5add/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Prepare for db operation
8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete
40% complete
43% complete
46% complete
Completing Database Creation
51% complete
54% complete
Creating Pluggable Databases
58% complete
77% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/opt/oracle/cfgtoollogs/dbca/ORCLCDB.
Database Information:
Global Database Name:ORCLCDB
System Identifier(SID):ORCLCDB
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log" for further details.
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Dec 18 17:49:24 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
System altered.
SQL>
System altered.
SQL>
Pluggable database altered.
SQL>
PL/SQL procedure successfully completed.
SQL> SQL>
Session altered.
SQL>
User created.
SQL>
Grant succeeded.
SQL>
Grant succeeded.
SQL>
Grant succeeded.
SQL>
User altered.
SQL> SQL> Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
The Oracle base remains unchanged with value /opt/oracle
Executing user defined scripts
/opt/oracle/runUserScripts.sh: running /opt/oracle/scripts/extensions/setup/swapLocks.sh
[2025:12:18 17:49:29]: Releasing lock .ORCLCDB.create_lck
[2025:12:18 17:49:29]: Lock released .ORCLCDB.create_lck
[2025:12:18 17:49:29]: Acquiring lock .ORCLCDB.exist_lck with heartbeat 30 secs
[2025:12:18 17:49:29]: Lock acquired
[2025:12:18 17:49:29]: Starting heartbeat
[2025:12:18 17:49:29]: Lock held .ORCLCDB.exist_lck
DONE: Executing user defined scripts
Executing user defined scripts
/opt/oracle/runUserScripts.sh: running /opt/oracle/scripts/setup/01_create_schema.sql
ERROR:
ORA-65011: Pluggable database FREEPDB1 does not exist.
ERROR:
ORA-01435: user does not exist
Table created.
Table created.
Sequence created.
Sequence created.
DONE: Executing user defined scripts
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
ORCLPDB1(3):
ORCLPDB1(3):XDB initialized.
2025-12-18T17:49:24.803493+00:00
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ORCLCDB/control01.ctl' SCOPE=SPFILE;
2025-12-18T17:49:24.826214+00:00
ALTER SYSTEM SET local_listener='' SCOPE=BOTH;
ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
Completed: ALTER PLUGGABLE DATABASE ORCLPDB1 SAVE STATE
XDB initialized.brew install colima lima-additional-guestagents docker qemuNeed to start colima with --arch x86_64 for Oracle.
ARM Oracle support means no x86 emulation needed.
colima start --runtime docker --cpu 6 --memory 12 --disk 100 --network-addressIf already started without run:
colima stop
colima delete
<colima start command>
limactl info | jq .guestAgents
docker context use colima
docker info | grep -i architecture
docker context lsOn Apple Silicon (M1/M2/M3), Oracle Database is not available natively. The official 19c Enterprise image is amd64-only, and running it under Docker Desktop’s built-in emulation (qemu/Rosetta) is known to cause these kinds of failures: PMON not starting, ORA-01034 during DBCA, etc.
📌 Final note: will never get Oracle 19c to run inside Colima on Apple Silicon — SIGILL during DBCA makes it impossible.
On macOS M use ARM-native “Oracle Free 23ai” image like gvenzl/oracle-free.
colima stop --force
colima delete
limactl stop --all
limactl delete --all
pkill -f colima
pkill -f limactl
osascript -e 'quit app "Docker"'
osascript -e 'quit app "Podman Desktop"'
rm -rf ~/.docker
rm -rf ~/.colima
rm -rf ~/.lima
sudo rm -rf /Library/Containers/com.docker.docker
sudo rm -rf /Library/Group\ Containers/group.com.docker
brew uninstall --cask docker-desktop podman-desktop
brew uninstall colima docker docker-completion docker-compose docker-credential-helper lima lima-additional-guestagents
brew list | grep -E 'docker|lima|colima'
brew list --cask | grep -E 'docker|podman'
ps aux | grep -E 'lima|colima|podman' | grep -v grep
ls ~/.lima ~/.colima 2>/dev/null