DBMS_LOGSTDBY.EDS_ADD_TABLE not supported in Oracle 19C (Logical Standby using EDS (Extend Datatype Support))

O EDS (Extend Datatype Support) é um recurso no Data Guard (logical) que nos permite replicar mudanças em tabelas com datatypes não suportados de forma nativa pelo SQL Apply de um banco de dados para outro. Seu funcionamento é basicamente o mesmo com a outra estratégia para este tipo de situação, que é baseada em criação de triggers de forma manual. Neste processo do EDS, uma “shadow table” é criada, e ela possui basicamente a mesma estrutura da tabela original, exceto pelas colunas que possuem datatypes não suportados, que são substituídos por colunas que são suportadas. Além disso, uma trigger é criada na tabela de origem para disparar toda vez que um processo de DML acontecer, alimentando a shadow table. Outra trigger no banco de destino (standby) é criada também para replicar todas as alterações da shadow table na tabela de destino. Neste artigo vou tentar simular este processo.

Podemos rodar a query abaixo no ambiente primary para identificar as tabelas candidatas para uso do EDS:

SQL> SELECT * FROM DBA_LOGSTDBY_EDS_SUPPORTED;
 
OWNER
--------------------------------------------------------------------------------
TABLE_NAME
--------------------------------------------------------------------------------
OE
CUSTOMERS
 
 
1 row selected.

Porém, ao tentar realizar o processo, a seguinte mensagem é reportada:

SQL> EXECUTE DBMS_LOGSTDBY.EDS_ADD_TABLE('OE', 'CUSTOMERS');
BEGIN DBMS_LOGSTDBY.EDS_ADD_TABLE('OE', 'CUSTOMERS'); END;
 
*
ERROR at line 1:
ORA-44610: DBMS_LOGSTDBY extended data type support is desupported.
ORA-06512: at "SYS.DBMS_LOGSTDBY", line 931
ORA-06512: at line 1

Eu fiquei boas horas tentando várias outras formas de fazer funcionar (alterando o datatype das colunas da tabela de exemplo, por achar que era algo relacionado com isso). Tentei encontrar alguma nota no MOS e também não achei nada. Apelei para os blogs alternativos (assim como o meu) e também não encontrei nada. Depois de muito tempo, reli o erro e percebi que talvez a minha versão de Oracle Database não suportasse mais essa procedure, apesar dela ser referenciada na package:

SQL> SELECT BANNER FROM V$VERSION;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 
SQL> DESC DBMS_LOGSTDBY;
PROCEDURE APPLY_SET
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 INNAME                         VARCHAR2                IN
 VALUE                          VARCHAR2                IN
PROCEDURE APPLY_UNSET
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 INNAME                         VARCHAR2                IN
PROCEDURE BUILD
FUNCTION DB_IS_LOGSTDBY RETURNS BINARY_INTEGER
PROCEDURE EDS_ADD_TABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 TABLE_OWNER                    VARCHAR2                IN
 TABLE_NAME                     VARCHAR2                IN
 P_DBLINK                       VARCHAR2                IN     DEFAULT
PROCEDURE EDS_EVOLVE_AUTOMATIC
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OPTIONS                        VARCHAR2                IN
PROCEDURE EDS_EVOLVE_MANUAL
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OPTIONS                        VARCHAR2                IN
 TABLE_OWNER                    VARCHAR2                IN
 TABLE_NAME                     VARCHAR2                IN
PROCEDURE EDS_REMOVE_TABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 TABLE_OWNER                    VARCHAR2                IN
 TABLE_NAME                     VARCHAR2                IN
PROCEDURE INSTANTIATE_TABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 TABLE_NAME                     VARCHAR2                IN
 DBLINK                         VARCHAR2                IN
FUNCTION IS_APPLY_SERVER RETURNS BOOLEAN
FUNCTION MAP_PRIMARY_SCN RETURNS NUMBER
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 PRIMARY_SCN                    NUMBER                  IN
PROCEDURE PREPARE_FOR_NEW_PRIMARY
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 FORMER_STANDBY_TYPE            VARCHAR2                IN
 DBLINK                         VARCHAR2                IN
PROCEDURE PURGE_SESSION
PROCEDURE REBUILD
PROCEDURE SET_TABLESPACE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 NEW_TABLESPACE                 VARCHAR2                IN
PROCEDURE SKIP
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STMT                           VARCHAR2                IN
 SCHEMA_NAME                    VARCHAR2                IN     DEFAULT
 OBJECT_NAME                    VARCHAR2                IN     DEFAULT
 PROC_NAME                      VARCHAR2                IN     DEFAULT
 USE_LIKE                       BOOLEAN                 IN     DEFAULT
 ESC                            CHAR(1)                 IN     DEFAULT
PROCEDURE SKIP_ERROR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STMT                           VARCHAR2                IN
 SCHEMA_NAME                    VARCHAR2                IN     DEFAULT
 OBJECT_NAME                    VARCHAR2                IN     DEFAULT
 PROC_NAME                      VARCHAR2                IN     DEFAULT
 USE_LIKE                       BOOLEAN                 IN     DEFAULT
 ESC                            CHAR(1)                 IN     DEFAULT
PROCEDURE SKIP_TRANSACTION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 XIDUSN_P                       NUMBER                  IN
 XIDSLT_P                       NUMBER                  IN
 XIDSQN_P                       NUMBER                  IN
 CON_NAME_P                     VARCHAR2                IN     DEFAULT
PROCEDURE UNSKIP
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STMT                           VARCHAR2                IN
 SCHEMA_NAME                    VARCHAR2                IN     DEFAULT
 OBJECT_NAME                    VARCHAR2                IN     DEFAULT
PROCEDURE UNSKIP_ERROR
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 STMT                           VARCHAR2                IN
 SCHEMA_NAME                    VARCHAR2                IN     DEFAULT
 OBJECT_NAME                    VARCHAR2                IN     DEFAULT
PROCEDURE UNSKIP_TRANSACTION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 XIDUSN_P                       NUMBER                  IN
 XIDSLT_P                       NUMBER                  IN
 XIDSQN_P                       NUMBER                  IN
 CON_NAME_P                     VARCHAR2                IN     DEFAULT

Olhando a documentação da versão 19C, também não encontro nada fazendo referência a esta procedure (link AQUI). Notem que a única referência que aparece é de erros ORA-:

E que não possuem nenhuma semelhança com o nosso erro:

Já nas versões posteriores (18C, 12.2 e 12.1) podemos encontrar a documentação fazendo o detalhamento técnico desta procedure:

Então concluimos que o objeto não é mais suportado na 19C, e que para este caso precisaremos fazer a replicação do objeto manualmente, ou seja, criando a tabela shadow e triggers. E obviamente pesquisar para ver se a Oracle não criou algum outro mecanismo semelhante ao EDS.

Leave a Comment

Your email address will not be published.