This post is also available in:
ERROR at line 1:
ORA-29548: Java system class reported: release of Java system classes
in the database (19.0.0.0.210420 1.8) does not match that of the oracle
executable (19.0.0.0.0 1.8)Esse erro aparece quando há uma divergência de versão entre o Java instalado no Oracle Home (sistema de arquivos) e o Java carregado no dicionário de dados. Em quase todos os casos, ele surge logo após a aplicação de um Release Update (RU) ou PSU que atualizou o binário do Oracle, mas não propagou a atualização para o JVM interno do banco.
💡 Na prática
O ORA-29548 não é um erro de aplicação — é uma consequência direta de um patch aplicado de forma incompleta. O opatchauto ou o opatch apply atualiza o Oracle Home, mas as classes Java do dicionário precisam ser atualizadas separadamente, via datapatch ou via script manual. Quando essa etapa é pulada ou falha silenciosamente, qualquer operação que acione o JVM interno do Oracle vai retornar esse erro.
Por que acontece
O Oracle mantém Java em dois lugares distintos:
- No Oracle Home (
$ORACLE_HOME/javavm/) — os binários no sistema de arquivos, atualizados pelo OPatch. - No dicionário de dados — as classes Java carregadas dentro do banco (
SYS.JAVA$CLASS$MD5$TABLEe estruturas relacionadas), que precisam ser sincronizadas separadamente.
Quando você aplica um RU/PSU, o componente (1) é atualizado. O componente (2) permanece na versão anterior até que a etapa de pós-patch seja concluída. O Oracle detecta essa divergência e lança o ORA-29548 em qualquer chamada que dependa do JVM interno.
Situações comuns onde isso ocorre:
- Aplicação de RU/PSU sem execução do
datapatchapós o restart do banco datapatchexecutado mas com erro silencioso no componente OJVM- Rollback de patch que incluía o componente OJVM
- Banco criado a partir de um Oracle Home já patcheado, sem execução de
datapatchna nova instância
Diagnóstico
Antes de corrigir, confirme a divergência de versão:
-- Versão no dicionário de dados
SELECT dbms_java.get_jdk_version() FROM dual;
-- Versão do executável no Oracle Home (rodar no shell)
-- $ORACLE_HOME/jdk/bin/java -versionSe o SELECT retornar ORA-29548, a divergência está confirmada. O output do erro já mostra as duas versões em conflito — use isso para validar após a correção.
Verifique também o status do patch no dicionário:
SELECT patch_id, version, action, status, description
FROM dba_registry_sqlpatch
ORDER BY action_time DESC
FETCH FIRST 10 ROWS ONLY;Se o último patch OJVM aparecer com status WITH ERRORS, o datapatch não concluiu corretamente — siga pela Solução 1 abaixo.
Solução
Solução 1 — Script manual (mais rápida e mais segura)
⚠️ Pré-requisito: O banco deve estar aberto (
OPEN), não emMOUNT. Execute comoSYS.
sqlplus / as sysdba
SQL> @?/javavm/install/update_javavm_db.sqlO script recarrega e sincroniza as classes Java do sistema. A execução pode levar de alguns minutos a dezenas de minutos dependendo do ambiente. Não interrompa.
Para ambientes CDB/Multitenant: o script precisa ser executado no CDB$ROOT e em cada PDB que apresentar o erro:
-- No CDB$ROOT
SQL> @?/javavm/install/update_javavm_db.sql
-- Conecte em cada PDB afetado e repita
SQL> ALTER SESSION SET CONTAINER = nome_do_pdb;
SQL> @?/javavm/install/update_javavm_db.sqlℹ️ Em ambientes RAC, o dicionário de dados é compartilhado. Basta executar o script uma vez, a partir de qualquer nó, com o banco em aberto.
Solução 2 — Via datapatch (abordagem correta para ambientes patcheados)
Se o banco foi patcheado com RU recente e o datapatch não foi executado corretamente, execute-o agora:
$ORACLE_HOME/OPatch/datapatch -verboseEm RAC, datapatch roda a partir de um único nó. O dicionário é compartilhado entre as instâncias.
ℹ️ Se o
datapatchfoi executado mas o ORA-29548 persiste, o OJVM pode não ter sido incluído no RU aplicado, ou houve um erro silencioso. Use a Solução 1 como fallback.
Validação
Após a correção, confirme que as versões estão sincronizadas:
SQL> SELECT dbms_java.get_jdk_version() FROM dual;
DBMS_JAVA.GET_JDK_VERSION()
--------------------------------------------------------------------------------
1.8.0_201
1 row selected.Se o SELECT retornar a versão sem erro, o JVM está sincronizado.
Checklist rápido
-- 1. Confirmar o erro
SELECT dbms_java.get_jdk_version() FROM dual;
-- 2. Verificar status do último patch OJVM
SELECT patch_id, version, action, status, description
FROM dba_registry_sqlpatch
ORDER BY action_time DESC
FETCH FIRST 5 ROWS ONLY;
-- 3a. Solução via script (banco aberto, como SYS)
@?/javavm/install/update_javavm_db.sql
-- 3b. Alternativa via datapatch (shell)
-- $ORACLE_HOME/OPatch/datapatch -verbose
-- 4. Validar
SELECT dbms_java.get_jdk_version() FROM dual;Referências
- Oracle Database Error Messages — ORA-29548
- Oracle Patching Documentation: Post-Patch SQL Actions (datapatch)
- MOS Note 1609718.1 — Using the datapatch Utility (verificar)
