Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DBZ-6993 Add support for JSON columns to Oracle connector #4973

Open
wants to merge 14 commits into
base: main
Choose a base branch
from

Conversation

shybovycha
Copy link
Contributor

Oracle 23 introduced a new column type, JSON.

In order to properly support it, Oracle JDBC driver requires a oracle.jdbc.jsonDefaultGetObjectType property to be set to one of the allowed values (Java classes).

I followed the same pattern as MySqlConnection and added an extra driver-level connector configuration option to allow users to change the jsonDefaultGetObjectType value.

Once the property is set, JSON columns can use the Json schema to be parsed by Debezium, which requires the proper jdbcType value to be set and handled by OracleValueConverters#schemaBuilder and OracleValueConverters#converter methods.

This proved to be a bit tricky, since by default the Column#jdbcType and Column#nativeType are set to generic values: jdbcType = oracle.jdbc.OracleTypes.OTHER (1111) and nativeType = -1. Hence had to set those based on the Column#typeName in OracleConnection#overrideColumn instead of resolveJdbcType or resolveNativeType, since that is the only method (among the three) which has access to an entire Column object (giving access to typeName value).

Copy link

github-actions bot commented Nov 2, 2023

Welcome as a new contributor to Debezium, @shybovycha. Reviewers, please add missing author name(s) and alias name(s) to the COPYRIGHT.txt and Aliases.txt respectively.

Copy link

github-actions bot commented Nov 2, 2023

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

@Naros
Copy link
Member

Naros commented Nov 2, 2023

Hi @shybovycha I see changes made specifically for LogMiner, did you get an opportunity to check whether any changes were needed for XStream or OpenLogReplicator adapters to support this data type?

I ask because I've hit a road block locally with GoldenGate and XStream on Oracle 23 Free, so was hoping if you had that you could share how you got XStream working on 23.

Copy link

github-actions bot commented Nov 2, 2023

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

@shybovycha
Copy link
Contributor Author

Hey, @Naros . Sorry, I did not test against XStreams or OpenLogReplication - in our setup we only test the LogMiner workflow as this is the main use case.

@Naros
Copy link
Member

Naros commented Nov 3, 2023

Ok thanks for confirming @shybovycha, it looks like atm I'm blocked testing this with Oracle XStream (see DBZ-5655). I'm going to start checking Oracle 23 with OLR now.

Copy link
Member

@Naros Naros left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall the code LGTM; however, I did leave one comment below. I also don't see an integration test in the test suite to actually test the JSON serialization. Could you please add one?

I went ahead and started working on these changes as I would like to include this as part of the 2.5.0.Beta1 this week. I'm working on the tests now. However, where can I find the Oracle Instant Client 23, I don't see this publically available on the Oracle downloads web page for Instant Clients.

Wow, talk about embedded in Oracle's website, took forever to find the Instant Client, but I found it, placing it here in case anyone else needs to fetch it: https://download.oracle.com/otn_software/linux/instantclient/23c/instantclient-basic-linux.x64-23.3.0.0.0.zip?source=:so:tw:or:awr:osec:,:so:tw:or:awr:osec:

@Naros
Copy link
Member

Naros commented Nov 29, 2023

Hi @shybovycha, so testing with Oracle FREE, it reports operations on JSON column types are unsupported and cannot be streamed by LogMiner. Did you happen to test this on another Oracle 23 platform that isn't publically available such as Exadata or Oracle Cloud?

@shybovycha
Copy link
Contributor Author

@Naros can you provide more context around the errors are you seeing?

If it is the errors from the build we are talking about

2023-11-29 03:08:08,725 ERROR  LogMinerHelperTest||test  Failed testing connection for {topic.prefix=dbserver1, database.dbname=oracle, database.user=pikachu, database.hostname=narnia, database.*** database.port=4321} with user '[database.user,null,[],[],true]'   [io.debezium.connector.oracle.OracleConnector]
java.lang.RuntimeException: Failed to resolve Oracle database version
	at io.debezium.connector.oracle.OracleConnection.resolveOracleDatabaseVersion(OracleConnection.java:191)
...
Caused by: java.sql.SQLException: ORA-17868: Unknown host specified.: narnia: Temporary failure in name resolution
https://docs.oracle.com/error-help/db/ora-17868/
...
Caused by: oracle.net.ns.NetException: ORA-17868: Unknown host specified.: narnia: Temporary failure in name resolution
https://docs.oracle.com/error-help/db/ora-17868/

I will have a look today.

Re. running Oracle (locally, at least) I ran it in Docker (from the gvenzl/oracle-xe:latest image). Since I'm on Apple M1 machine, I had to use something called Colima in order to run it in Docker:

$ colima start --arch x86_64 --memory 4
$ docker run --name oracle -d -p 1521:1521 -e ORACLE_PASSWORD=password gvenzl/oracle-xe

@Naros
Copy link
Member

Naros commented Nov 30, 2023

Hi @shybovycha, so the issue/error is that while I can compile and run the code against Oracle 23, when LogMiner generates the rows in the V$LOGMNR_CONTENTS table, it reports that the operation is Unsupported with an OPERATION_CODE of 255.

I looked at the LogMiner documentation but didn't see any reference saying JSON was or was not supported by LogMiner. The column is successfully captured using the snapshot phase without any issue, it's only during streaming that the data does not seem to be present in V$LOGMNR_CONTENTS.

This PR does not include any IT for the column, so I was attempting to add one when I hit this issue.

I would suggest looking at the OracleRawDataTypeIT test class and introducing a similar OracleJsonDataTypeIT class that tests both the capturing of the JSON data type via a snapshot and another for streaming. Just be sure to annotate the class that should be skipped if the adapter is not LogMiner and that the test should be skipped for any database version less than 23.

Copy link

github-actions bot commented Dec 1, 2023

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

Copy link

github-actions bot commented Dec 1, 2023

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

@shybovycha shybovycha force-pushed the DBZ-6993 branch 2 times, most recently from aff6c93 to 0b9f963 Compare December 1, 2023 06:42
@shybovycha
Copy link
Contributor Author

@Naros I have been struggling to run the integration tests locally, for a variety of reasons.

The README seems to be quite different from what Github Workflow is doing - whilst README suggests running

$ mvn docker:build docker:start
$ mvn clean install -pl debezium-connector-oracle -Poracle-xstream,oracle-tests -Dinstantclient.dir=<path-to-instantclient>

Github Workflow runs

$ mvn clean install -B -pl debezium-connector-oracle -am -Pinfinispan-buffer,oracle-docker,oracle-tests -Ddocker.username="$QUAY_IO_USERNAME" -Ddocker.password="$QUAY_IO_PASSWORD"

(which by the way requires quay.io credentials and permissions for the rh_integration/dbz-oracle image)

The former fails to find Oracle connector (regardless of providing a path to the JAR on the CLASSPATH):

[ERROR] Failed to execute goal on project debezium-connector-oracle: Could not resolve dependencies for project io.debezium:debezium-connector-oracle:jar:2.5.0-SNAPSHOT: Could not find artifact com.oracle.instantclient:xstreams:jar:21.6.0.0 in confluent (https://packages.confluent.io/maven/)

The latter fails trying to run MongoDB ReplicaSet tests (which I guess is not needed for Oracle tests? anyways, fails on my M1 Apple silicon):

[ERROR] io.debezium.testing.testcontainers.MongoDbReplicaSetTest.testClusterWithPropertyPorRange -- Time elapsed: 44.21 s <<< ERROR!
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=REPLICA_SET, servers=[{address=172.23.0.4:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused (Connection refused)}}, {address=172.23.0.2:27019, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}, {address=172.23.0.3:27018, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.SocketTimeoutException: connect timed out}}]

Even after disabling the MongoDB ReplicaSet tests, replacing the Oracle Docker image with gvenzl/oracle-xe (which requires passing the ORACLE_PASSWORD env var and in my case platform has to be enforced to linux/amd64), the container startup still fails with

[INFO] DOCKER> [gvenzl/oracle-xe:21.3.0] "oracle1": Start container d83f96bd9a66
08:53:51.488 oracle1CONTAINER: starting up...
08:53:51.646 oracle1CONTAINER: first database startup, initializing...
08:53:51.646 oracle1CONTAINER: uncompressing database data files, please wait...
08:53:51.691 oracle1assertion failed [result.value != EEXIST]: VmTracker attempted to allocate existing mapping
08:53:51.691 oracle1(ThreadContextVm.cpp:47 mmap)
08:53:51.692 oracle1 /opt/oracle/container-entrypoint.sh: line 132:    13 Trace/breakpoint trap   7zzs x "${ORACLE_BASE}"/"${ORACLE_SID}".7z -o"${ORACLE_BASE}"/oradata/ > /dev/null

Apparently, this is solely due to the CPU architecture 😢

Since I am unable to run the tests locally, I will have to rely on Github Actions instead.

One other thing worth clarifying: I think JSON columns were introduced in Oracle 21, so I went ahead and added annotations disabling the IT for database versions lower than 21 (major).

@shybovycha
Copy link
Contributor Author

@Naros could you please approve the pending workflows so that I can see if / how tests are failing?

@jpechane
Copy link
Contributor

jpechane commented Dec 8, 2023

/packit test --labels oracle

Copy link

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

@shybovycha
Copy link
Contributor Author

shybovycha commented Jan 29, 2024

Making some tests green: debezium/debezium-connector-vitess#179 and the latest commit to this branch - somehow the tests irrelevant to this change are failing. The DebeziumResourceIT#testTransformsEndpoint test should pass, but somehow the list of strings asserted has a lot of duplicates, so the length check and containsInAnyOrder assertion failed. Had to remove the length check and change to hasItems assertion. Might also need to add a fix for DB2 tests.

@Naros
Copy link
Member

Naros commented Jan 29, 2024

Hi @shybovycha, I appreciate the proactive approach for the REST tests; however, this is due to other things, and we shouldn't be altering that test. Could you please remove that change from this PR entirely, thanks.

@shybovycha
Copy link
Contributor Author

@Naros I am not entirely sure what's going on on the CI, but now I have 68 failed integration tests, mostly because timeouts. You reckon you could take a look at the CI?

@Naros
Copy link
Member

Naros commented Feb 13, 2024

The issue with Oracle 23 is that it's hugely CPU bound with the Free edition, so I suspect what has happened is that the infrastructure that supports PackIt was perhaps overloaded combined with the CPU limiting on the container by Oracle; this is creating this problem. I'll restart the tests once more and let's see if running them later in the day helps.

/packit test --labels oracle-23

@shybovycha
Copy link
Contributor Author

@Naros does not seem like running later in the day does the trick 😞 can we run the tests differently? or rather does main branch run them on a different hardware?

@Naros
Copy link
Member

Naros commented Feb 15, 2024

Hi @shybovycha, I'll try running locally, but otherwise that's the only alternative we have with Oracle 23. Are you not able to run these locally and validate at least the Oracle 23 JSON tests pass? I'm less concerned with the non-JSON tests.

@shybovycha
Copy link
Contributor Author

@Naros I've spent 2 full days trying to set up Oracle locally to work with the integration tests using the gvenzl/oracle-xe and gvenzl/oracle-free Docker images (since quay.io/rh_integration/dbz-oracle is unavailable). I managed to get the snapshot working and fixed the corresponding test, but the streaming still does not work for me - need to figure out the pluggable database vs non-pluggable database. Unfortunately, with my current project I don't have much spare time left to spend on this.

@Naros
Copy link
Member

Naros commented Feb 16, 2024

Hi @shybovycha, you should not need the quay.io/rh_integration/dbz-oracle image as the changes here are specific to Oracle 23 and the only Oracle 23 image we use is the one from Oracle's container registry, the FREE public version.

docker pull container-registry.oracle.com/database/free:latest

@Naros
Copy link
Member

Naros commented Feb 16, 2024

Evening, @shybovycha. I ran the test suite against Oracle 23 on my laptop, and the only test failures were with the JSON integration tests. By all accounts, Oracle LogMiner does not support JSON with the JSON column type, LogMiner reported those operations all as OPERATION_TYPE 255 or Unsupported.

Looking more closely at the supported data types for LogMiner in Oracle 23, I also don't see mention of JSON, see:
https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/oracle-logminer-utility.html#GUID-BA995486-041E-4C83-83EA-D7BC2A866DE3

It's plausible that the current Oracle 23 Free Developer Version, which is from Sept 2023, does not have integrated support in LogMiner for JSON, but it's also equally possible that Oracle is purposely only adding new data type support into GoldenGate, XStream, and Data Guard. Given the documentation, I'm really inclined to think it's most likely the latter and not the former.

Attached are the failures related to the JSON tests:

-------------------------------------------------------------------------------
Test set: io.debezium.connector.oracle.OracleJSONDataTypeIT
-------------------------------------------------------------------------------
Tests run: 4, Failures: 3, Errors: 1, Skipped: 0, Time elapsed: 1173 s <<< FAILURE! -- in io.debezium.connector.oracle.OracleJSONDataTypeIT
io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithNoPrimaryKeyWithJsonTypeColumn -- Time elapsed: 380.4 s <<< FAILURE!
java.lang.AssertionError: 

Expecting actual not to be null
	at io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithNoPrimaryKeyWithJsonTypeColumn(OracleJSONDataTypeIT.java:312)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:137)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:148)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:88)
	at org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:91)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1177)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1055)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:871)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:972)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:196)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:53)
	at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:152)
	at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:76)

io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldSnapshotTableWithJsonColumnType -- Time elapsed: 60.87 s <<< ERROR!
org.awaitility.core.ConditionTimeoutException: Condition with alias 'Streaming was not started on time' didn't complete within 1 minutes because condition with io.debezium.embedded.AbstractConnectorTest was not fulfilled.
	at org.awaitility.core.ConditionAwaiter.await(ConditionAwaiter.java:148)
	at org.awaitility.core.CallableCondition.await(CallableCondition.java:78)
	at org.awaitility.core.CallableCondition.await(CallableCondition.java:26)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:873)
	at org.awaitility.core.ConditionFactory.until(ConditionFactory.java:842)
	at io.debezium.embedded.AbstractConnectorTest.waitForSnapshotEvent(AbstractConnectorTest.java:1306)
	at io.debezium.embedded.AbstractConnectorTest.waitForSnapshotToBeCompleted(AbstractConnectorTest.java:1279)
	at io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldSnapshotTableWithJsonColumnType(OracleJSONDataTypeIT.java:89)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:137)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:148)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:88)
	at org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:91)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1177)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1055)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:871)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:972)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:196)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:53)
	at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:152)
	at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:76)
Caused by: javax.management.InstanceNotFoundException: debezium.oracle:type=connector-metrics,context=snapshot,server=server1
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1088)
	at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:640)
	at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:679)
	at io.debezium.embedded.AbstractConnectorTest.lambda$waitForSnapshotEvent$24(AbstractConnectorTest.java:1307)
	at org.awaitility.core.CallableCondition$ConditionEvaluationWrapper.eval(CallableCondition.java:99)
	at org.awaitility.core.ConditionAwaiter$ConditionPoller.call(ConditionAwaiter.java:203)
	at org.awaitility.core.ConditionAwaiter$ConditionPoller.call(ConditionAwaiter.java:190)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)

io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithJsonTypeColumnAndOtherNonJsonColumns -- Time elapsed: 366.7 s <<< FAILURE!
java.lang.AssertionError: 

Expecting actual not to be null
	at io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithJsonTypeColumnAndOtherNonJsonColumns(OracleJSONDataTypeIT.java:205)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:137)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:148)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:88)
	at org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:91)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1177)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1055)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:871)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:972)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:196)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:53)
	at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:152)
	at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:76)

io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithJsonColumnType -- Time elapsed: 364.5 s <<< FAILURE!
java.lang.AssertionError: 

Expecting actual not to be null
	at io.debezium.connector.oracle.OracleJSONDataTypeIT.shouldStreamTableWithJsonColumnType(OracleJSONDataTypeIT.java:133)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:61)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:316)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:240)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:214)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:155)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray2(ReflectionUtils.java:137)
	at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:148)
	at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:88)
	at org.apache.maven.plugin.surefire.InPluginVMSurefireStarter.runSuitesInProcess(InPluginVMSurefireStarter.java:91)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1177)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1055)
	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:871)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:972)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:293)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:196)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.apache.maven.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:53)
	at org.apache.maven.wrapper.WrapperExecutor.execute(WrapperExecutor.java:152)
	at org.apache.maven.wrapper.MavenWrapperMain.main(MavenWrapperMain.java:76)

In the test outputs I can see these entries in the logs:

2024-02-15 22:45:04,790 WARN   Oracle|server1|streaming  An unsupported operation detected for table 'FREEPDB1.DEBEZIUM.DBZ6993' in transaction 06001f0096020000 with SCN 3412797 on redo thread 1.   [io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor]
2024-02-15 22:45:04,790 WARN   Oracle|server1|streaming  An unsupported operation detected for table 'FREEPDB1.DEBEZIUM.DBZ6993' in transaction 06001f0096020000 with SCN 3412842 on redo thread 1.   [io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor]

Caused by: org.apache.kafka.connect.errors.ConnectException: Snapshotting of table FREEPDB1.DEBEZIUM.DBZ6993 failed
	at io.debezium.relational.RelationalSnapshotChangeEventSource.doCreateDataEventsForTable(RelationalSnapshotChangeEventSource.java:602)
	at io.debezium.relational.RelationalSnapshotChangeEventSource.lambda$createDataEventsForTableCallable$6(RelationalSnapshotChangeEventSource.java:524)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	... 5 common frames omitted
Caused by: java.sql.SQLException: Invalid column type: getOracleObject not implemented for class oracle.jdbc.driver.T4CJsonAccessor
	at oracle.jdbc.driver.GeneratedAccessor.getOracleObject(GeneratedAccessor.java:1221)
	at oracle.jdbc.driver.JsonAccessor.getObject(JsonAccessor.java:200)
	at oracle.jdbc.driver.GeneratedStatement.getObject(GeneratedStatement.java:196)
	at oracle.jdbc.driver.GeneratedScrollableResultSet.getObject(GeneratedScrollableResultSet.java:334)
	at io.debezium.jdbc.CancellableResultSet.getObject(CancellableResultSet.java:255)
	at io.debezium.jdbc.JdbcConnection.getColumnValue(JdbcConnection.java:1539)
	at io.debezium.jdbc.JdbcConnection.rowToArray(JdbcConnection.java:1555)
	at io.debezium.relational.RelationalSnapshotChangeEventSource.doCreateDataEventsForTable(RelationalSnapshotChangeEventSource.java:565)

2024-02-15 22:52:11,144 WARN   Oracle|server1|streaming  An unsupported operation detected for table 'FREEPDB1.DEBEZIUM.DBZ6993' in transaction 01001a007b020000 with SCN 3415232 on redo thread 1.   [io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor]
2024-02-15 22:52:11,144 WARN   Oracle|server1|streaming  An unsupported operation detected for table 'FREEPDB1.DEBEZIUM.DBZ6993' in transaction 01001a007b020000 with SCN 3415319 on redo thread 1.   [io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor]

I should note that this used the oracle-23 profile, which uses the Instant Client 23.3.0.0 and JDBC driver version 23.3.0.23.09.

@Naros
Copy link
Member

Naros commented Feb 16, 2024

One thing to note, @shybovycha, is that we probably should explicitly add driver.oracle.jdbc.jsonDefaultGetObjectType with the appropriate value to the JSON test configs since this is mandatory for JSON. That may likely at least fix the issue with the snapshot failures; however, that likely won't affect the streaming issues with unsupported operation types.

UPDATE
I set this on the test for shouldSnapshotTableWithJsonColumnType and it had no effect using:

Configuration config = getDefaultConfig()
                .with(OracleConnectorConfig.TABLE_INCLUDE_LIST, "DEBEZIUM\\.DBZ6993")
                .with("driver.oracle.jdbc.jsonDefaultGetObjectType", "oracle.sql.json.OracleJsonValue")
                .build();

@shybovycha
Copy link
Contributor Author

@Naros so what is the plan here? should we spend more time and try to fix the tests for XStream mode only? n.b.: i was not able to run integration tests in XStream mode locally 😞

the other option (not saying it is good, but it is an option 🤷 ) is to ignore or remove the integration test for the moment being

@Naros
Copy link
Member

Naros commented Mar 4, 2024

Hi @shybovycha, I'm not a fan of just disabling the tests and adding a new code like this because it exposes liability on the team, and without being able to test this against Oracle 23, we have no fallback on how to help users if they face problems or this introduces some regression.

As for XStream - Oracle 23 changed how this is to be configured, and I opened this StackOverview post four months ago without any help from the Oracle community on what I could have been doing wrong to get Oracle 23 XStream working. Perhaps you have some idea?

If we can at least test this with XStream, then we can guard this as an XStream feature only, but until we can verify that it works with one adapter, I'm not comfortable merging this into main.

@Naros
Copy link
Member

Naros commented Mar 4, 2024

One idea to consider @shybovycha could be to focus on the JSON feature sets of Oracle 19c and 21c rather than 23. This way we can at least verify the basics around JSON and have a solution that satisfies those two versions; and then build on top of that for Oracle 23. wdyt?

Copy link

github-actions bot commented Mar 4, 2024

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

1 similar comment
Copy link

github-actions bot commented Mar 4, 2024

Hi @shybovycha, thanks for your contribution. Please prefix the commit message(s) with the DBZ-xxx JIRA issue key.

@shybovycha
Copy link
Contributor Author

@Naros unfortunately we can only handle JSON properly after Oracle 23, since before there is no way to configure JDBC driver on how to fetch the JSON data

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
3 participants