From 821ee8d1f8f1d8fc96de23afda70ec1c44e1bda7 Mon Sep 17 00:00:00 2001 From: Zdravko Donev Date: Fri, 26 Dec 2025 07:04:48 +0200 Subject: [PATCH 1/7] RDSC-4297: Update RDI Oracle XStream setup steps and clarify them --- .../data-pipelines/prepare-dbs/oracle.md | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index 502b2a57f3..68f3153e61 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -76,6 +76,12 @@ ORACLE_SID=ORACLCDB dbz_oracle sqlplus /nolog CONNECT sys/top_secret AS SYSDBA alter system set db_recovery_file_dest_size = 10G; alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile; +-- ====================================================================================================================================================== +-- !!!IMPORTANT!!!: +-- In order to avoid Oracle downtime, please check if the LOG_MODE on your database is already set to `ARCHIVELOG` before executing the following commands: +-- SELECT log_mode FROM v$database; +-- If the LOG_MODE is already `ARCHIVELOG`, then you can skip the rest of the commands in this script +-- ====================================================================================================================================================== shutdown immediate startup mount alter database archivelog; @@ -376,12 +382,12 @@ to capture changes. Follow the steps in the sections below to configure Xstream to work with Debezium and RDI. -{{< note >}}You should run all database commands shown below as the `oracle` user. +{{< note >}}You should run all database commands shown below as the `sysdba` user. {{< /note >}} ### 1. Configure Xstream -Create a directory for the recovery area: +Create a directory for the recovery area on the Oracle host (or Oracle container if you are using a containerized Oracle): ```bash mkdir /opt/oracle/oradata/recovery_area @@ -397,6 +403,12 @@ sqlplus sys/ as sysdba SQL> alter system set db_recovery_file_dest_size = 5G; SQL> alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile; SQL> alter system set enable_goldengate_replication=true; +-- ====================================================================================================================================================== +-- !!!IMPORTANT!!!: +-- In order to avoid Oracle downtime, please check if the LOG_MODE on your database is already set to `ARCHIVELOG` before executing the following commands: +-- SELECT log_mode FROM v$database; +-- If the LOG_MODE is already `ARCHIVELOG`, then you can skip the rest of the commands in this script +-- ====================================================================================================================================================== SQL> shutdown immediate Database closed. Database dismounted. @@ -419,7 +431,13 @@ Archive destination       USE_DB_RECOVERY_FILE_DEST Oldest online log sequence     10 Next log sequence to archive   12 Current log sequence       12 +``` + +Enable supplemental logging for the tables you want to capture or +for the entire database. This lets Debezium capture the state of +database rows before and after changes occur. +```sql SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; SQL> alter session set container=orclpdb1; @@ -449,6 +467,7 @@ Create an Xstream administrator user with the following SQL: ```sql sqlplus sys/ as sysdba +SQL> ALTER SESSION SET CONTAINER=CDB$ROOT; SQL> CREATE TABLESPACE xstream_adm_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/xstream_adm_tbs.dbf'     SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; @@ -628,6 +647,33 @@ To support XStream connector, you must create a custom [Docker](https://www.dock sudo k3s ctr images import dbz3.0.8-xstream-linux-amd.tar all ``` +### 5. Make RDI use the custom image + +#### 5.1. For VM installation + +Edit the `rdi-operator` configmap: + +```bash +kubectl edit configmap rdi-operator -n rdi +``` + +In the editor, find the collector section and change the image settings: + +```yaml + collector: + image: + pullPolicy: IfNotPresent + registry: docker.io # change this to `quay.io` + repository: redislabs/debezium-server # Change this to `debezium/server` + tag: 3.0.8.Final-rdi.1 # Change this to `3.0.8.Final` +``` + +Save the configmap. Once it is saved, the operator will restart automatically and will apply the changes. + +{{< note >}}After upgrading to another RDI version +the changes to the configmap will be lost. You must repeat the above steps after each upgrade. +{{< /note >}} + ### 5. Enable the Oracle configuration in RDI Finally, you must update your `config.yaml` file to enable Xstream. From f5d26ce5abadf7ba5631d1739ea595a20fa4be9e Mon Sep 17 00:00:00 2001 From: Zdravko Donev Date: Fri, 26 Dec 2025 07:10:52 +0200 Subject: [PATCH 2/7] Add notes about default CDB and PDB names used in the examples --- .../data-pipelines/prepare-dbs/oracle.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index 68f3153e61..918a26c6d4 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -208,6 +208,8 @@ These grants are required for the connector to function. be sure that the modified scope is compatible with the settings in the connector’s include configuration. The privileges that you set for the account must permit reading from all of the tables that you want the connector to capture.{{< /note >}} +{{< note >}}This example uses `ORCLCDB` as the container database (CDB) name and `ORCLPDB1` as the pluggable database (PDB) name. Replace these with the CDB and PDB names from your own environment.{{< /note >}} + ```sql sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/logminer_tbs.dbf' @@ -455,6 +457,8 @@ SQL> ALTER TABLE CHINOOK.PLAYLISTTRACK ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; SQL> ALTER TABLE CHINOOK.TRACK ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; ``` +{{< note >}}The example above uses `orclpdb1` as the PDB name. Replace it with the name of the pluggable database (PDB) that you use in your own environment.{{< /note >}} + {{< note >}}You must configure supplemental logging explicitly for each table as shown above. Otherwise, only the original sync will be performed and no change data will be captured for the table. @@ -526,6 +530,8 @@ SQL> GRANT SELECT ANY TABLE TO c##dbzxsuser CONTAINER=ALL; SQL> GRANT LOCK ANY TABLE TO c##dbzxsuser CONTAINER=ALL; ``` +{{< note >}}The Xstream user examples above use `ORCLCDB` as the CDB name and `ORCLPDB1`/`orclpdb1` as the PDB name in file paths and `ALTER SESSION SET CONTAINER` commands. Replace these with the CDB and PDB names from your own Oracle deployment.{{< /note >}} + {{< note >}}If you are using the [Debezium Xstream documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#creating-xstream-users-for-the-connector), you should note that it misses out the last two GRANT statements shown above: @@ -562,6 +568,8 @@ END; / ``` +{{< note >}}In this example, `ORCLCDB` is the CDB service name and `orclpdb1` is the PDB name. Replace them with the appropriate service and PDB names for your own environment.{{< /note >}} + The value `NULL` for `tables` enables data capture from all tables in the `chinook` schema, unless the changes have been made by the `sys` or `system` users. @@ -699,6 +707,8 @@ sources: database.out.server.name: dbzxout ``` +{{< note >}}The values `ORCLCDB` and `ORCLPDB1` in the example above are sample CDB and PDB names. Set `database.dbname` and `database.pdb.name` to the CDB and PDB names for your own Oracle database.{{< /note >}} + See the [Debezium Oracle documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties) for a full list of properties you can use in the `advanced.source` subsection. @@ -780,6 +790,8 @@ sources: lob.enabled: true ``` +{{< note >}}The XMLTYPE configuration example uses `ORCLCDB` as the CDB name and `ORCLPDB1` as the PDB name. Replace these with your actual CDB and PDB names when configuring XMLTYPE support.{{< /note >}} + ### Test XMLTYPE support You can create a test table to verify that `XMLTYPE` columns work correctly From 46f88aeef31b105c82f52954398d23acba227180 Mon Sep 17 00:00:00 2001 From: Zdravko Donev Date: Fri, 26 Dec 2025 07:21:10 +0200 Subject: [PATCH 3/7] Update numbering --- .../data-pipelines/prepare-dbs/oracle.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index 918a26c6d4..ac75d40ead 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -42,6 +42,7 @@ You may find it helpful to use them to track your progress as you work through t - [ ] [Create Xstream users](#2-create-xstream-users) - [ ] [Create an Xstream outbound server](#3-create-an-xstream-outbound-server) - [ ] [Add a custom Docker image for the Debezium server](#4-add-a-custom-docker-image-for-the-debezium-server) +- [ ] [Make RDI use the custom image](#5-make-rdi-use-the-custom-image) - [ ] [Enable the Oracle configuration in RDI](#5-enable-the-oracle-configuration-in-rdi) ``` @@ -682,7 +683,7 @@ Save the configmap. Once it is saved, the operator will restart automatically an the changes to the configmap will be lost. You must repeat the above steps after each upgrade. {{< /note >}} -### 5. Enable the Oracle configuration in RDI +### 6. Enable the Oracle configuration in RDI Finally, you must update your `config.yaml` file to enable Xstream. The example below shows the relevant parts of the `sources` section: @@ -713,7 +714,7 @@ See the [Debezium Oracle documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties) for a full list of properties you can use in the `advanced.source` subsection. -### 6. Configuration is complete {#xstream-complete} +### 7. Configuration is complete {#xstream-complete} After you have followed the steps above, your Oracle database is ready for Debezium to use. From 6ca34b298b8acff7e23ff43fbeff69fdd4eaa4c1 Mon Sep 17 00:00:00 2001 From: Zdravko Donev Date: Sun, 4 Jan 2026 03:34:05 +0200 Subject: [PATCH 4/7] RDSC-4297: Update RDI Oracle XStream setup steps to include differences for RAC and non-CDB Oralce databases. Add FAQ section --- .../data-pipelines/prepare-dbs/oracle.md | 697 ++++++++++++++++-- 1 file changed, 639 insertions(+), 58 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index ac75d40ead..f8a3b4a77f 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -38,9 +38,9 @@ You may find it helpful to use them to track your progress as you work through t **XStream** ```checklist {id="oraclexstreamlist"} -- [ ] [Configure Xstream](#1-configure-xstream) -- [ ] [Create Xstream users](#2-create-xstream-users) -- [ ] [Create an Xstream outbound server](#3-create-an-xstream-outbound-server) +- [ ] [Configure XStream](#1-configure-xstream) +- [ ] [Create XStream users](#2-create-xstream-users) +- [ ] [Create an XStream outbound server](#3-create-an-xstream-outbound-server) - [ ] [Add a custom Docker image for the Debezium server](#4-add-a-custom-docker-image-for-the-debezium-server) - [ ] [Make RDI use the custom image](#5-make-rdi-use-the-custom-image) - [ ] [Enable the Oracle configuration in RDI](#5-enable-the-oracle-configuration-in-rdi) @@ -60,8 +60,7 @@ Follow the steps below to configure [LogMiner](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-logminer-utility.html) and prepare your database for use with RDI. - -### 1. Configure Oracle LogMiner +### 1. Configure Oracle LogMiner (#1-configure-oracle-logminer) The following example shows the configuration for Oracle LogMiner. @@ -374,38 +373,126 @@ REVOKE LOCK ANY TABLE FROM c##dbzuser container=all; Once you have followed the steps above, your Oracle database is ready for Debezium to use. -## Xstream +## XStream -[Xstream](https://docs.oracle.com/en/database/oracle/oracle-database/19/xstrm/introduction-to-xstream.html#GUID-5939CB6C-8BA9-4594-8F96-B0453D246722) +[XStream](https://docs.oracle.com/en/database/oracle/oracle-database/19/xstrm/introduction-to-xstream.html#GUID-5939CB6C-8BA9-4594-8F96-B0453D246722) is a set of database components and APIs to communicate change data to and from an Oracle database. RDI specifically uses -[Xstream Out](https://docs.oracle.com/en/database/oracle/oracle-database/19/xstrm/xstream-out.html) +[XStream Out](https://docs.oracle.com/en/database/oracle/oracle-database/19/xstrm/xstream-out.html) to capture changes. -Follow the steps in the sections below to configure Xstream to work with +Follow the steps in the sections below to configure XStream to work with Debezium and RDI. {{< note >}}You should run all database commands shown below as the `sysdba` user. {{< /note >}} -### 1. Configure Xstream +```sql +sqlplus sys/ as sysdba +``` + +### Configure recovery area + +{{< multitabs id="oracle-recovery-area" + tab1="non-RAC (single-instance)" + tab2="Oracle RAC (multitenant environment)" >}} + +Create a directory for the recovery area on the Oracle host (or Oracle container if you are using a containerized Oracle). -Create a directory for the recovery area on the Oracle host (or Oracle container if you are using a containerized Oracle): +For single-instance (non-RAC) deployments on local disk, you can use: ```bash -mkdir /opt/oracle/oradata/recovery_area +mkdir -p /opt/oracle/oradata/recovery_area +``` + + ```sql + ALTER SYSTEM SET db_recovery_file_dest_size = 10G; -- Adjust size as needed + ALTER SYSTEM SET db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' SCOPE=BOTH; + ``` + +-tab-sep- + +For Oracle RAC (cluster) environments, the Fast Recovery Area (FRA) must be on **shared storage** (ASM or a shared filesystem). + +- **If using ASM (recommended for RAC):** + + ```sql + ALTER SYSTEM SET db_recovery_file_dest_size = 10G; -- Adjust size as needed + ALTER SYSTEM SET db_recovery_file_dest = '+FRA' SCOPE=BOTH; + ``` + + Replace `+FRA` with the ASM disk group used for your FRA. No `mkdir` is required; ASM manages the storage. + +- **If using a shared filesystem (NFS/OCFS2/etc.):** + + ```sql + ALTER SYSTEM SET db_recovery_file_dest_size = 10G; -- Adjust size as needed + ALTER SYSTEM SET db_recovery_file_dest = '/u02/oradata/recovery_area' SCOPE=BOTH; + ``` + + The path you use must: + + - Be on shared storage visible from all RAC nodes + - Be mounted at the **same path** on all nodes + - Be writable by the Oracle user + + Create the directory once on the shared filesystem (it will be visible from all nodes): + + ```bash + mkdir -p /u02/oradata/recovery_area + chown oracle:oinstall /u02/oradata/recovery_area + chmod 755 /u02/oradata/recovery_area + ``` + +{{< /multitabs >}} + +### Enable GoldenGate replication + +Check if `enable_goldengate_replication` is already set to `true`: + +{{< multitabs id="oracle-goldengate-replication" + tab1="Container database (CDB)" + tab2="Non-container database (Non-CDB)" >}} + +For a CDB, check the parameter in the root container: + +```sql +SELECT VALUE FROM V$PARAMETER WHERE NAME = 'enable_goldengate_replication'; ``` -Then, use the following SQL commands to configure Xstream (using the +If it is not set to `true`, you need to set it and **restart the database**: + +```sql +ALTER SYSTEM SET enable_goldengate_replication=true SCOPE=BOTH CONTAINER=ALL; +``` + +-tab-sep- + +For a non-CDB, check the parameter in the database instance: + +```sql +SELECT VALUE FROM V$PARAMETER WHERE NAME = 'enable_goldengate_replication'; +``` + +If it is not set to `true`, you need to set it and **restart the database**: + +```sql +ALTER SYSTEM SET enable_goldengate_replication=true SCOPE=BOTH; +``` + +{{< /multitabs >}} + +### 1. Configure XStream + +Use the following SQL commands to configure XStream (using the [`chinook`](https://github.com/Redislabs-Solution-Architects/rdi-quickstart-postgres/tree/main) schema as an example): -```sql -sqlplus sys/ as sysdba +{{< multitabs id="oracle-xstream-rac" + tab1="non-RAC (single-instance)" + tab2="Oracle RAC (multitenant environment)" >}} -SQL> alter system set db_recovery_file_dest_size = 5G; -SQL> alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile; -SQL> alter system set enable_goldengate_replication=true; +```sql -- ====================================================================================================================================================== -- !!!IMPORTANT!!!: -- In order to avoid Oracle downtime, please check if the LOG_MODE on your database is already set to `ARCHIVELOG` before executing the following commands: @@ -434,8 +521,46 @@ Archive destination       USE_DB_RECOVERY_FILE_DEST Oldest online log sequence     10 Next log sequence to archive   12 Current log sequence       12 + +-- Confirm the database is in ARCHIVELOG mode. +SQL> SELECT LOG_MODE FROM V$DATABASE; ``` +-tab-sep- + +```sql +-- ====================================================================================================================================================== +-- !!!IMPORTANT!!!: +-- In order to avoid Oracle downtime, please check if the LOG_MODE on your database is already set to `ARCHIVELOG` before executing the following commands: +-- SELECT log_mode FROM v$database; +-- If the LOG_MODE is already `ARCHIVELOG`, then you can skip the rest of the commands in this script +-- ====================================================================================================================================================== + +-- Stop all database instances +SQL> srvctl stop database -d + +-- Start the database in mount state. +SQL> srvctl start database -d -o mount + +-- Enable archive log mode +SQL> alter database archivelog; + +-- Restart all database instances. +SQL> srvctl stop database -d +SQL> srvctl start database -d + +-- Confirm the database is in ARCHIVELOG mode. +SQL> SELECT LOG_MODE FROM V$DATABASE; +``` + +{{< /multitabs >}} + +### 2. Enable supplemental logging + +{{< multitabs id="oracle-xstream-supplemental-logging" + tab1="Container database (CDB)" + tab2="Non-container database (Non-CDB)" >}} + Enable supplemental logging for the tables you want to capture or for the entire database. This lets Debezium capture the state of database rows before and after changes occur. @@ -460,14 +585,44 @@ SQL> ALTER TABLE CHINOOK.TRACK ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; {{< note >}}The example above uses `orclpdb1` as the PDB name. Replace it with the name of the pluggable database (PDB) that you use in your own environment.{{< /note >}} +-tab-sep- + +Enable supplemental logging for the tables you want to capture or +for the entire database. This lets Debezium capture the state of +database rows before and after changes occur. + +```sql +SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; + +SQL> ALTER TABLE CHINOOK.ALBUM ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.ARTIST ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.CUSTOMER ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.EMPLOYEE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.GENRE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.INVOICE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.INVOICELINE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.MEDIATYPE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.PLAYLIST ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.PLAYLISTTRACK ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +SQL> ALTER TABLE CHINOOK.TRACK ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; +``` + +{{< /multitabs >}} + {{< note >}}You must configure supplemental logging explicitly for each table as shown above. Otherwise, only the original sync will be performed and no change data will be captured for the table. {{< /note >}} -### 2. Create Xstream users +### 3. Create XStream users + +{{< multitabs id="oracle-xstream-user-creation" + tab1="Container database (CDB)" + tab2="Non-container database (Non-CDB)" >}} + +{{< note >}}The XStream user examples below use `ORCLCDB` as the CDB name and `ORCLPDB1`/`orclpdb1` as the PDB name in file paths and `ALTER SESSION SET CONTAINER` commands. Replace these with the CDB and PDB names from your own Oracle deployment.{{< /note >}} -Create an Xstream administrator user with the following SQL: +Create an XStream administrator user with the following SQL: ```sql sqlplus sys/ as sysdba @@ -501,7 +656,7 @@ SQL> BEGIN   / ``` -Then, create the Xstream user: +Then, create the XStream user: ```sql sqlplus sys/ as sysdba @@ -531,10 +686,8 @@ SQL> GRANT SELECT ANY TABLE TO c##dbzxsuser CONTAINER=ALL; SQL> GRANT LOCK ANY TABLE TO c##dbzxsuser CONTAINER=ALL; ``` -{{< note >}}The Xstream user examples above use `ORCLCDB` as the CDB name and `ORCLPDB1`/`orclpdb1` as the PDB name in file paths and `ALTER SESSION SET CONTAINER` commands. Replace these with the CDB and PDB names from your own Oracle deployment.{{< /note >}} - {{< note >}}If you are using the -[Debezium Xstream documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#creating-xstream-users-for-the-connector), +[Debezium XStream documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#creating-xstream-users-for-the-connector), you should note that it misses out the last two GRANT statements shown above: ```sql @@ -545,65 +698,244 @@ GRANT LOCK ANY TABLE TO c##dbzxsuser CONTAINER=ALL; However, without these, no tables can be read by Debezium, so neither the initial snapshot nor any subsequent updates will produce any data. {{< /note >}} -### 3. Create an Xstream outbound server +-tab-sep- -Create the outbound server with the following SQL. Note that -you must connect as the `c##dbzadmin` user created in the previous step, -not the `sys` user: +{{< note >}}The non-CDB architecture is deprecated in Oracle Database 12c and discontinued in Oracle Database 20c.{{< /note >}} + +For a non-container (non-CDB) Oracle database: + +- You have a single database with no containers. +- Users are regular database users without the `C##` prefix. +- Application data is stored directly in the database. +- You do not use `ALTER SESSION SET CONTAINER` statements or `CONTAINER=ALL` clauses. + +### 1. Create XStream users and tablespaces (non-CDB) + +Run the following script as the `sys` user: ```sql -sqlplus c##dbzadmin/dbz@localhost:1521/ORCLCDB +-- ===================================================== +-- Create XStream Users - FOR NON-CDB ENVIRONMENT +-- ===================================================== +-- This script creates the XStream administrator and user accounts +-- Run as: sqlplus sys/ as sysdba +-- ===================================================== + +-- Step 1: Create XStream Administrator Tablespace +CREATE TABLESPACE xstream_adm_tbs DATAFILE '/u01/app/oracle/oradata/ORCL/xstream_adm_tbs.dbf' + SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; + +PROMPT Tablespace xstream_adm_tbs created + +-- Step 2: Create XStream Administrator User +CREATE USER dbzadmin IDENTIFIED BY dbz + DEFAULT TABLESPACE xstream_adm_tbs + QUOTA UNLIMITED ON xstream_adm_tbs; -SQL> DECLARE -  tables  DBMS_UTILITY.UNCL_ARRAY; -  schemas DBMS_UTILITY.UNCL_ARRAY; +GRANT CREATE SESSION TO dbzadmin; + +PROMPT User dbzadmin created + +-- Step 3: Grant XStream Admin Privileges BEGIN -    tables(1)  := NULL; -    schemas(1) := 'chinook'; -  DBMS_XSTREAM_ADM.CREATE_OUTBOUND( -    server_name     =>  'dbzxout', - source_container_name => 'orclpdb1', -    table_names     =>  tables, -    schema_names    =>  schemas); + DBMS_XSTREAM_AUTH.GRANT_ADMIN_PRIVILEGE( + grantee => 'dbzadmin', + privilege_type => 'CAPTURE', + grant_select_privileges => TRUE + ); END; / + +PROMPT XStream admin privileges granted to dbzadmin + +-- Step 4: Create XStream User Tablespace +CREATE TABLESPACE xstream_tbs DATAFILE '/u01/app/oracle/oradata/ORCL/xstream_tbs.dbf' + SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED; + +PROMPT Tablespace xstream_tbs created + +-- Step 5: Create XStream User +CREATE USER dbzxsuser IDENTIFIED BY dbz + DEFAULT TABLESPACE xstream_tbs + QUOTA UNLIMITED ON xstream_tbs; + +PROMPT User dbzxsuser created + +-- Step 6: Grant necessary privileges to XStream User +GRANT CREATE SESSION TO dbzxsuser; +GRANT SELECT ON V_$DATABASE TO dbzxsuser; +GRANT FLASHBACK ANY TABLE TO dbzxsuser; +GRANT SELECT_CATALOG_ROLE TO dbzxsuser; +GRANT EXECUTE_CATALOG_ROLE TO dbzxsuser; +GRANT SELECT ANY TABLE TO dbzxsuser; +GRANT LOCK ANY TABLE TO dbzxsuser; + +PROMPT Privileges granted to dbzxsuser + +-- Verification: Check users were created +SELECT username, account_status, default_tablespace +FROM dba_users +WHERE username IN ('DBZADMIN', 'DBZXSUSER'); + +PROMPT +PROMPT ===================================================== +PROMPT XStream Users Created Successfully! +PROMPT ===================================================== +PROMPT Created users: +PROMPT - dbzadmin (XStream Administrator) +PROMPT - dbzxsuser (XStream User) +PROMPT +PROMPT Next step: +PROMPT Run 03_create_xstream_outbound.sql to create outbound server +PROMPT ===================================================== ``` +This script creates: + +- The `xstream_adm_tbs` tablespace and `dbzadmin` XStream administrator user. +- The `xstream_tbs` tablespace and `dbzxsuser` XStream connect user. + +{{< /multitabs >}} + +### 4. Create an XStream outbound server + +Create the outbound server with the following SQL. + +{{< multitabs id="oracle-xstream-outbound-server" + tab1="Container database (CDB)" + tab2="Non-container database (Non-CDB)" >}} + {{< note >}}In this example, `ORCLCDB` is the CDB service name and `orclpdb1` is the PDB name. Replace them with the appropriate service and PDB names for your own environment.{{< /note >}} -The value `NULL` for `tables` enables data capture from all tables in the `chinook` -schema, unless the changes have been made by the `sys` or `system` users. +Note that you must connect as the `c##dbzadmin` user created in the previous step, +not the `sys` user: -{{< note >}}The Debezium documentation is misleading here. It includes the line +```bash +sqlplus c##dbzadmin/dbz@localhost:1521/ORCLCDB +``` ```sql -schemas(1) := 'debezium'; -``` +-- ===================================================== +-- Create XStream Outbound Server +-- ===================================================== +-- This script creates the XStream outbound server for CDC +-- Run as: sqlplus c##dbzadmin/dbz@localhost:1521/ORCLCDB +-- ===================================================== + +-- Step 1: Create XStream Outbound Server +DECLARE + tables DBMS_UTILITY.UNCL_ARRAY; + schemas DBMS_UTILITY.UNCL_ARRAY; +BEGIN + tables(1) := NULL; + schemas(1) := 'C##DBZUSER'; + + DBMS_XSTREAM_ADM.CREATE_OUTBOUND( + server_name => 'dbzxout', + source_container_name => 'XEPDB1', + table_names => tables, + schema_names => schemas + ); +END; +/ -instead of +-- Step 2: Configure XStream User to connect to outbound server +-- This must be run as sys user +CONNECT sys/oracle AS SYSDBA -```sql -schemas(1) := 'chinook'; +BEGIN + DBMS_XSTREAM_ADM.ALTER_OUTBOUND( + server_name => 'dbzxout', + connect_user => 'c##dbzxsuser' + ); +END; +/ + +-- Verification: Check outbound server was created +SELECT server_name, source_database, capture_name, capture_user, connect_user, queue_owner, queue_name +FROM dba_xstream_outbound; + +-- Verification: Check capture process +SELECT capture_name, status, capture_type, source_database +FROM dba_capture; + +PROMPT +PROMPT ===================================================== +PROMPT XStream Outbound Server Created Successfully! +PROMPT ===================================================== +PROMPT Server name: dbzxout +PROMPT Schema: C##DBZUSER +PROMPT PDB: XEPDB1 +PROMPT ===================================================== ``` -as shown above. However, this will only capture data from a schema named `debezium`. Also, -you must provide the `source_container_name` parameter if you are capturing changes from -a pluggable database. -{{< /note >}} +--tab-sep- -Then, configure the XStream user account to connect to the XStream outbound server: +Note that you must connect as the `dbzadmin` user created in the previous step, +not the `sys` user: + +```bash +sqlplus dbzadmin/dbz@localhost:1521/ORCL +``` ```sql -sqlplus sys/ as sysdba +-- ===================================================== +-- Create XStream Outbound Server - FOR NON-CDB ENVIRONMENT +-- ===================================================== +-- This script creates the XStream outbound server for CDC +-- Run as: sqlplus dbzadmin/dbz@localhost:1521/ORCL +-- ===================================================== + +-- Step 1: Create XStream Outbound Server +DECLARE + tables DBMS_UTILITY.UNCL_ARRAY; + schemas DBMS_UTILITY.UNCL_ARRAY; +BEGIN + tables(1) := NULL; + schemas(1) := 'chinook'; -- Replace with actual schema name + + DBMS_XSTREAM_ADM.CREATE_OUTBOUND( + server_name => 'dbzxout', + table_names => tables, + schema_names => schemas + ); +END; +/ + +PROMPT XStream outbound server created + +-- Step 2: Configure XStream User to connect to outbound server +-- This must be run as sys user +CONNECT sys/ AS SYSDBA BEGIN -  DBMS_XSTREAM_ADM.ALTER_OUTBOUND( -    server_name  => 'dbzxout', -    connect_user => 'c##dbzxsuser'); + DBMS_XSTREAM_ADM.ALTER_OUTBOUND( + server_name => 'dbzxout', + connect_user => 'dbzxsuser' + ); END; / + +PROMPT Connect user configured + +-- Verification: Check outbound server was created +SELECT server_name, source_database, capture_name, capture_user, connect_user, queue_owner, queue_name +FROM dba_xstream_outbound; + +-- Verification: Check capture process +SELECT capture_name, status, capture_type, source_database +FROM dba_capture; + +PROMPT +PROMPT ===================================================== +PROMPT XStream Outbound Server Created Successfully! +PROMPT ===================================================== +PROMPT Server name: dbzxout +PROMPT ===================================================== ``` +{{< /multitabs >}} + ### 4. Add a custom Docker image for the Debezium server To support XStream connector, you must create a custom [Docker](https://www.docker.com/) image that includes the required Instant Client package libraries for Linux x64 from the Oracle website. @@ -685,7 +1017,7 @@ the changes to the configmap will be lost. You must repeat the above steps after ### 6. Enable the Oracle configuration in RDI -Finally, you must update your `config.yaml` file to enable Xstream. +Finally, you must update your `config.yaml` file to enable XStream. The example below shows the relevant parts of the `sources` section: ```yaml @@ -836,4 +1168,253 @@ After you run an initial [snapshot]({{< relref "/integrate/redis-data-integration/data-pipelines/#pipeline-lifecycle" >}}), the XML data appears in your Redis target database: -{{< image filename="/images/rdi/ingest/xmltype-example.webp" >}} \ No newline at end of file +{{< image filename="/images/rdi/ingest/xmltype-example.webp" >}} + +## FAQ + +### CDB vs Non-CDB differences + +**CDB (Container Database – multitenant)** + +- Root container `CDB$ROOT` plus one or more pluggable databases (PDBs). +- Common users (for example `C##DBZADMIN`, `C##DBZXSUSER`) exist across all containers. +- Application data lives in PDBs. +- Many XStream-related operations use `CONTAINER=ALL` and `ALTER SESSION SET CONTAINER`. + +**Non-CDB (traditional)** + +- Single database, no containers. +- Users are regular database users without the `C##` prefix (for example `DBZADMIN`, `DBZXSUSER`). +- Application data lives directly in that single database. +- No `CONTAINER=ALL` or `ALTER SESSION SET CONTAINER` clauses are required. + +From an RDI/Debezium point of view, both models are supported; the main differences are in the user names you create and whether you need container-related clauses in the SQL. + +### Single-instance vs RAC differences + +**Single-instance** + +- One Oracle instance running on one server. +- You run the LogMiner/XStream setup scripts once. +- All configuration (users, tablespaces, outbound server, logging) is stored in that database instance. + +**RAC (Real Application Clusters)** + +- Multiple instances (nodes) share the same database and storage. +- You still run the XStream setup only once on any one node. +- All nodes share the same: + - Database files + - Archive logs + - XStream outbound server + - Capture process + +Important RAC points: + +- Archive log mode is enabled at the database level and applies to all nodes. +- Tablespaces you create are in shared storage and visible from all nodes. +- Users you create exist in the shared database and can connect through any node. +- Debezium/RDI can connect to any RAC node or to a SCAN address; it does not need a specific node. + +### In RAC setups, do you need to execute steps on all nodes? + +No. The XStream configuration is database-level, so you execute the setup once on any node: + +- Enable archive log mode: once (affects the whole database). +- Create XStream tablespaces: once (on shared storage). +- Create XStream users: once (in the shared database). +- Create the XStream outbound server: once (visible from all nodes). +- Enable supplemental logging: once (database-wide). + +You may run client connection tests from multiple nodes, but the actual administrative steps only need to be executed once. + +### Why are two XStream tablespaces required? + + +XStream is not just reading your tables - it's storing its own data: + +```text +Customer's Existing Tablespaces: +┌─────────────────────────────────┐ +│ USERS (or custom tablespace) │ +│ │ +│ - CUSTOMERS table │ +│ - ORDERS table │ +│ - PRODUCTS table │ +│ - TRANSACTIONS table │ +│ (Application data) │ +└─────────────────────────────────┘ + +XStream Admin Tablespace: +┌─────────────────────────────────┐ +│ XSTREAM_ADM_TBS │ +│ │ +│ - Capture process metadata │ +│ - Outbound server config │ +│ - Checkpoint information │ +│ - Position tracking │ +└─────────────────────────────────┘ + +XStream User Tablespace: +┌─────────────────────────────────┐ +│ XSTREAM_TBS │ +│ │ +│ - LCR Queue (change records) │ +│ - Buffered changes │ +│ - Transaction state │ +└─────────────────────────────────┘ +``` + +#### Real Example: What Gets Stored Where + +Scenario: Customer has CUSTOMERS table + +Customer's existing tablespace (USERS): +```sql +-- Application data +SELECT * FROM MY_APP.CUSTOMERS; +-- Returns: customer_id, name, address, balance, etc. +``` + +XStream tablespaces (NEW): +```sql +-- XStream metadata (in XSTREAM_ADM_TBS) +SELECT capture_name, status, start_scn, checkpoint_scn +FROM dba_capture; +-- Returns: dbzxout_capture, ENABLED, 12345678, 12345690 + +-- XStream queue (in XSTREAM_TBS) +SELECT queue_name, enqueue_time, dequeue_time, state +FROM dba_queues; +-- Returns: dbzxout_queue, , , READY +``` + +#### Size Comparison + +Customer's Application Tablespaces: + +```sql +-- Typical size: Large +SELECT tablespace_name, + ROUND(SUM(bytes)/1024/1024/1024, 2) AS size_gb +FROM dba_data_files +WHERE tablespace_name = 'USERS' +GROUP BY tablespace_name; + +-- Result: 50 GB, 100 GB, 500 GB, etc. +``` + +XStream Tablespaces: + +```sql +-- Typical size: Small +SELECT tablespace_name, + ROUND(SUM(bytes)/1024/1024, 2) AS size_mb +FROM dba_data_files +WHERE tablespace_name IN ('XSTREAM_ADM_TBS', 'XSTREAM_TBS') +GROUP BY tablespace_name; + +-- Result: +-- XSTREAM_ADM_TBS: 100-500 MB +-- XSTREAM_TBS: 500 MB - 2 GB (depends on queue size) +``` + +#### General Recommendations + +This guide uses two separate tablespaces: + +- `xstream_adm_tbs` – XStream administrator tablespace. +- `xstream_tbs` – XStream user (connect) tablespace. + +They serve different purposes and follow the principle of least privilege. + +**1. Separation of concerns and security** + +- *Administrator tablespace (`xstream_adm_tbs`)* + - Used by the XStream admin user (for example `C##DBZADMIN` or `DBZADMIN`). + - Stores XStream metadata and control structures: + - Capture process metadata + - Outbound server configuration + - Queue tables and queues + - Other XStream internal objects + - Belongs to a highly privileged user that can create and manage XStream objects. + +- *User tablespace (`xstream_tbs`)* + - Used by the XStream connect user (for example `C##DBZXSUSER` or `DBZXSUSER`). + - Lower-privileged account used by Debezium/RDI to read changes. + - Keeps operational data and temporary objects separate from admin metadata. + +**2. Resource management** + +Having two tablespaces lets you: + +- Monitor space usage separately for admin vs user workloads. +- Allow for different growth patterns (admin metadata typically grows more slowly). +- Apply separate quotas per user/tablespace. +- Tune storage parameters differently for each tablespace if needed. + +**3. Operational benefits** + +- Backup and recovery: + - You can back up or restore admin and user data independently. + - Critical XStream metadata is isolated in its own tablespace. +- Maintenance and troubleshooting: + - You can perform maintenance on one tablespace without affecting the other. + - Easier to diagnose which part of the XStream setup is consuming space. +- Security and auditing: + - Clear separation of administrative vs operational data. + - Easier to audit which users access which objects. + +**4. Can you use a single tablespace?** + +Technically you could place both users in a single tablespace, but this is not recommended for production: + +- It weakens separation of duties and least-privilege design. +- It makes monitoring and capacity planning harder. +- It mixes admin metadata and application-facing data in one place. + +Oracle and Debezium best practices recommend separating admin and user workloads into different tablespaces. + +### What is the XStream outbound server? + +The XStream outbound server is the component that streams database changes out of Oracle in a supported way. It: + +- Captures committed changes (INSERT, UPDATE, DELETE) from redo logs. +- Converts them into logical change records (LCRs). +- Exposes an API that external consumers such as Debezium/RDI use. + +**High-level architecture** + +```text +Oracle Database + + Redo Logs --> Capture Process --> Queue --> XStream Outbound Server (dbzxout) --> Debezium/RDI +``` + +**Key components** + +- *Redo logs*: Contain the physical change records for the database. +- *Capture process*: Mines redo logs and turns them into logical change records. +- *Queue*: Temporarily stores captured changes. +- *XStream outbound server* (for example `DBZXOUT`): + - Provides the streaming interface for consumers. + - Applies filters (schemas/tables) configured when you create it. +- *Connect user* (for example `C##DBZXSUSER` or `DBZXSUSER`): + - The user Debezium/RDI connects as. + - Reads changes from the outbound server. + +**Why it is needed** + +Without an XStream outbound server: + +- There is no supported, structured API for consuming change events. +- You would have to parse redo logs directly, which is complex and unsupported. +- You lose built-in filtering, transaction grouping, and restart/resume semantics. + +With an XStream outbound server: + +- Changes are available in near real time. +- You can capture only selected schemas/tables. +- Debezium/RDI uses Oracle’s supported XStream API. +- Transactions are preserved and grouped correctly. +- Offsets/positions allow clean resume after restarts. +- Multiple consumers can be attached to the same outbound server if needed. \ No newline at end of file From 295908f616bb78c2b5429a2c53bc4f6734ceb57a Mon Sep 17 00:00:00 2001 From: Andy Stark Date: Mon, 5 Jan 2026 11:51:04 +0000 Subject: [PATCH 5/7] Fixed section ordering --- .../data-pipelines/prepare-dbs/oracle.md | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index f8a3b4a77f..1f590b9586 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -38,12 +38,15 @@ You may find it helpful to use them to track your progress as you work through t **XStream** ```checklist {id="oraclexstreamlist"} -- [ ] [Configure XStream](#1-configure-xstream) -- [ ] [Create XStream users](#2-create-xstream-users) -- [ ] [Create an XStream outbound server](#3-create-an-xstream-outbound-server) -- [ ] [Add a custom Docker image for the Debezium server](#4-add-a-custom-docker-image-for-the-debezium-server) -- [ ] [Make RDI use the custom image](#5-make-rdi-use-the-custom-image) -- [ ] [Enable the Oracle configuration in RDI](#5-enable-the-oracle-configuration-in-rdi) +- [ ] [Configure recovery area](#1-configure-recovery-area) +- [ ] [Enable GoldenGate replication](#2-enable-goldengate-replication) +- [ ] [Configure XStream](#3-configure-xstream) +- [ ] [Enable supplemental logging](#4-enable-supplemental-logging) +- [ ] [Create XStream users](#5-create-xstream-users) +- [ ] [Create an XStream outbound server](#6-create-an-xstream-outbound-server) +- [ ] [Add a custom Docker image for the Debezium server](#7-add-a-custom-docker-image-for-the-debezium-server) +- [ ] [Make RDI use the custom image](#8-make-rdi-use-the-custom-image-vm-installation) +- [ ] [Enable the Oracle configuration in RDI](#9-enable-the-oracle-configuration-in-rdi) ``` **Optional: XMLTYPE Support** @@ -60,7 +63,7 @@ Follow the steps below to configure [LogMiner](https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/oracle-logminer-utility.html) and prepare your database for use with RDI. -### 1. Configure Oracle LogMiner (#1-configure-oracle-logminer) +### 1. Configure Oracle LogMiner The following example shows the configuration for Oracle LogMiner. @@ -391,7 +394,7 @@ Debezium and RDI. sqlplus sys/ as sysdba ``` -### Configure recovery area +### 1. Configure recovery area {{< multitabs id="oracle-recovery-area" tab1="non-RAC (single-instance)" @@ -446,7 +449,7 @@ For Oracle RAC (cluster) environments, the Fast Recovery Area (FRA) must be on * {{< /multitabs >}} -### Enable GoldenGate replication +### 2. Enable GoldenGate replication Check if `enable_goldengate_replication` is already set to `true`: @@ -482,7 +485,7 @@ ALTER SYSTEM SET enable_goldengate_replication=true SCOPE=BOTH; {{< /multitabs >}} -### 1. Configure XStream +### 3. Configure XStream Use the following SQL commands to configure XStream (using the [`chinook`](https://github.com/Redislabs-Solution-Architects/rdi-quickstart-postgres/tree/main) @@ -555,7 +558,7 @@ SQL> SELECT LOG_MODE FROM V$DATABASE; {{< /multitabs >}} -### 2. Enable supplemental logging +### 4. Enable supplemental logging {{< multitabs id="oracle-xstream-supplemental-logging" tab1="Container database (CDB)" @@ -614,7 +617,7 @@ above. Otherwise, only the original sync will be performed and no change data wi captured for the table. {{< /note >}} -### 3. Create XStream users +### 5. Create XStream users {{< multitabs id="oracle-xstream-user-creation" tab1="Container database (CDB)" @@ -709,7 +712,7 @@ For a non-container (non-CDB) Oracle database: - Application data is stored directly in the database. - You do not use `ALTER SESSION SET CONTAINER` statements or `CONTAINER=ALL` clauses. -### 1. Create XStream users and tablespaces (non-CDB) +**Create XStream users and tablespaces (non-CDB)**
Run the following script as the `sys` user: @@ -797,7 +800,7 @@ This script creates: {{< /multitabs >}} -### 4. Create an XStream outbound server +### 6. Create an XStream outbound server Create the outbound server with the following SQL. @@ -936,7 +939,7 @@ PROMPT ===================================================== {{< /multitabs >}} -### 4. Add a custom Docker image for the Debezium server +### 7. Add a custom Docker image for the Debezium server To support XStream connector, you must create a custom [Docker](https://www.docker.com/) image that includes the required Instant Client package libraries for Linux x64 from the Oracle website. @@ -988,9 +991,7 @@ To support XStream connector, you must create a custom [Docker](https://www.dock sudo k3s ctr images import dbz3.0.8-xstream-linux-amd.tar all ``` -### 5. Make RDI use the custom image - -#### 5.1. For VM installation +### 8. Make RDI use the custom image (VM installation) Edit the `rdi-operator` configmap: @@ -1015,7 +1016,7 @@ Save the configmap. Once it is saved, the operator will restart automatically an the changes to the configmap will be lost. You must repeat the above steps after each upgrade. {{< /note >}} -### 6. Enable the Oracle configuration in RDI +### 9. Enable the Oracle configuration in RDI Finally, you must update your `config.yaml` file to enable XStream. The example below shows the relevant parts of the `sources` section: @@ -1046,7 +1047,7 @@ See the [Debezium Oracle documentation](https://debezium.io/documentation/reference/stable/connectors/oracle.html#oracle-connector-properties) for a full list of properties you can use in the `advanced.source` subsection. -### 7. Configuration is complete {#xstream-complete} +### 10. Configuration is complete {#xstream-complete} After you have followed the steps above, your Oracle database is ready for Debezium to use. From e1de23fddb72724071914e1729cab6343dda769f Mon Sep 17 00:00:00 2001 From: Andy Stark Date: Mon, 5 Jan 2026 13:08:42 +0000 Subject: [PATCH 6/7] Rewrite first items in the FAQ section as questions --- .../data-pipelines/prepare-dbs/oracle.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index 1f590b9586..bca1591b0b 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -1002,8 +1002,8 @@ kubectl edit configmap rdi-operator -n rdi In the editor, find the collector section and change the image settings: ```yaml - collector: - image: + collector: + image: pullPolicy: IfNotPresent registry: docker.io # change this to `quay.io` repository: redislabs/debezium-server # Change this to `debezium/server` @@ -1012,7 +1012,7 @@ In the editor, find the collector section and change the image settings: Save the configmap. Once it is saved, the operator will restart automatically and will apply the changes. -{{< note >}}After upgrading to another RDI version +{{< note >}}After upgrading to another RDI version, the changes to the configmap will be lost. You must repeat the above steps after each upgrade. {{< /note >}} @@ -1173,7 +1173,7 @@ the XML data appears in your Redis target database: ## FAQ -### CDB vs Non-CDB differences +### How does CDB differ from Non-CDB? **CDB (Container Database – multitenant)** @@ -1191,7 +1191,7 @@ the XML data appears in your Redis target database: From an RDI/Debezium point of view, both models are supported; the main differences are in the user names you create and whether you need container-related clauses in the SQL. -### Single-instance vs RAC differences +### How does single-instance differ from RAC? **Single-instance** From b8f7711517001c82c651d4e5da2c75592cf375a5 Mon Sep 17 00:00:00 2001 From: Andy Stark Date: Mon, 5 Jan 2026 14:09:00 +0000 Subject: [PATCH 7/7] Replace ascii art with Mermaid diagrams --- .../data-pipelines/prepare-dbs/oracle.md | 60 ++++++++----------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md index bca1591b0b..018ea45d60 100644 --- a/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md +++ b/content/integrate/redis-data-integration/data-pipelines/prepare-dbs/oracle.md @@ -1230,39 +1230,21 @@ You may run client connection tests from multiple nodes, but the actual administ ### Why are two XStream tablespaces required? - XStream is not just reading your tables - it's storing its own data: -```text -Customer's Existing Tablespaces: -┌─────────────────────────────────┐ -│ USERS (or custom tablespace) │ -│ │ -│ - CUSTOMERS table │ -│ - ORDERS table │ -│ - PRODUCTS table │ -│ - TRANSACTIONS table │ -│ (Application data) │ -└─────────────────────────────────┘ - -XStream Admin Tablespace: -┌─────────────────────────────────┐ -│ XSTREAM_ADM_TBS │ -│ │ -│ - Capture process metadata │ -│ - Outbound server config │ -│ - Checkpoint information │ -│ - Position tracking │ -└─────────────────────────────────┘ - -XStream User Tablespace: -┌─────────────────────────────────┐ -│ XSTREAM_TBS │ -│ │ -│ - LCR Queue (change records) │ -│ - Buffered changes │ -│ - Transaction state │ -└─────────────────────────────────┘ +**Customer's existing tablespace**: + +```mermaid +graph TB + USERS["USERS

- CUSTOMERS table
- ORDERS table
- PRODUCTS table
- TRANSACTIONS table

(Application data)"] +``` + +**XStream tablespaces**: + +```mermaid +graph TB + ADM["XSTREAM_ADM_TBS

- Capture process metadata
- Outbound server config
- Checkpoint information
- Position tracking"] + USER_TS["XSTREAM_TBS

- LCR Queue change records
- Buffered changes
- Transaction state"] ``` #### Real Example: What Gets Stored Where @@ -1385,10 +1367,18 @@ The XStream outbound server is the component that streams database changes out o **High-level architecture** -```text -Oracle Database - - Redo Logs --> Capture Process --> Queue --> XStream Outbound Server (dbzxout) --> Debezium/RDI +```mermaid {width="100%"} +graph LR + RedoLogs["Redo Logs"] + Capture["Capture Process"] + Queue["Queue"] + Outbound["XStream Outbound
Server
"] + Consumer["Debezium/RDI"] + + RedoLogs --> Capture + Capture --> Queue + Queue --> Outbound + Outbound --> Consumer ``` **Key components**