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.