Protecting replicated tables on the Logical Standby Database

Quando configuramos um Data Guard Logical Standby, a intenção primária é proteger as tabelas replicadas no ambiente standby para evitar que os usuários realizem alterações nelas, como DMLs e DDLs (uma vez que o banco de dados fica aberto neste cenário). Para isso, podemos utilizar no destino a propriedade “Guard”. Seu valor padrão está como ALL, o que significa que o Oracle impedirá que qualquer usuário (exceto o SYS) realize alterações em qualquer dado no logical standby database. Vejamos o exemplo abaixo que utiliza uma tabela usada pelo SQL Apply:

[oracle@fornix2 admin]$ sqlplus / as sysdba
 
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 2 06:09:57 2021
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> SELECT GUARD_STATUS FROM V$DATABASE;
 
GUARD_S
-------
ALL
 
SQL> conn SOE/soe
Connected.
SQL> SHOW USER;
USER is "SOE"
SQL> UPDATE SOE.MERCURIO SET NOME='BRUNO';
UPDATE SOE.MERCURIO SET NOME='BRUNO'
           *
ERROR at line 1:
ORA-16224: Database Guard is enabled

Vejamos que este valor não permite criação de novos objetos no Standby. É como se o banco estivesse em read-only, sem a necessidade de fazermos um shutdown no ambiente:

SQL> CREATE TABLE SOE.MERCURIO2 ( ID NUMBER PRIMARY KEY, NOME VARCHAR2(30)) ;
CREATE TABLE SOE.MERCURIO2 ( ID NUMBER PRIMARY KEY, NOME VARCHAR2(30))
*
ERROR at line 1:
ORA-16224: Database Guard is enabled

Caso mudemos o valor dessa propriedade para STANDBY, o Oracle não permitirá mudanças de nenhum usuário (exceto SYS) nas tabelas que são mantidas pelo SQL Apply. Façamos uma simulação:

[oracle@fornix2 admin]$ sqlplus / as sysdba
 
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 2 06:18:01 2021
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> ALTER DATABASE GUARD STANDBY;
 
Database altered.
 
SQL> conn SOE/soe
Connected.
SQL> sho user;
USER is "SOE"
SQL> UPDATE SOE.MERCURIO SET NOME='BRUNO';
UPDATE SOE.MERCURIO SET NOME='BRUNO'
           *
ERROR at line 1:
ORA-16224: Database Guard is enabled

Porém, os outros objetos que não estão sendo usados pelo SQL Apply, podem ser manipulados sem problemas:

SQL> CREATE TABLE SOE.MERCURIO2 ( ID NUMBER PRIMARY KEY, NOME VARCHAR2(30)) ;
 
Table created.
 
SQL> INSERT INTO SOE.MERCURIO2 VALUES (1, 'STRING A') ;
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL> DROP TABLE SOE.MERCURIO2;
 
Table dropped.

Caso mudemos o valor da propriedade para NONE, o Oracle respeitará os privilégios que os usuários possuem, ou seja, como se fosse o método típico que temos no primary:

[oracle@fornix2 admin]$ sqlplus / as sysdba
 
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 2 06:21:41 2021
Version 19.3.0.0.0
 
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
 
SQL> ALTER DATABASE GUARD NONE;
 
Database altered.
 
SQL> CONN SOE/soe
Connected.
SQL> SHOW USER;
USER is "SOE"
SQL> INSERT INTO SOE.MERCURIO VALUES (4, 'STRING D') ;
 
1 row created.
 
SQL> COMMIT;
 
Commit complete.
 
SQL> DELETE FROM SOE.MERCURIO WHERE NOME='STRING D';
 
1 row deleted.
 
SQL> COMMIT;
 
Commit complete.

Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.

Leave a Comment

Your email address will not be published.