Alterando as configurações do RMAN usando a package DBMS_BACKUP_RESTORE

Por Rodrigo Jorge
Postado em Dezembro 2015

Revisado por Marcelo Pivovar - Solution Architect

Neste artigo, vou mostrar como alterar as configurações do RMAN quando se está conectado a um BD Oracle, usando a package DBMS_BACKUP_RESTORE e suas procedures.

Modificar esses atributos do RMAN é uma tarefa fácil quando estamos conectados via utilitário do Oracle RMAN. Podemos simplesmente utilizar o comando CONFIGURE para alterar qualquer valor. No entanto, o que poucas pessoas sabem é que isso também pode ser feito através da package não documentada DBMS_BACKUP_RESTORE, usando a sua procedure SETCONFIG.

Essa é uma ferramenta poderosa especialmente quando temos alguma regra de negócio ou lógica de processo que precisamos alterar via PL/SQL.

Um caso onde esta abordagem seria útil, por exemplo, está na criação de uma trigger em um ambiente Data Guard, disparada na alteração da “ROLE” do Banco, que alteraria o valor do “ARCHIVELOG DELETION POLICY” dependendo se a instância é primary ou standby:

-  No Primary: CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
-  No Standby: CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO ‘SBT_TAPE’;

Vamos então ver como podemos utilizar esta package. Antes de mais nada, vou verificar as configurações padrões:

RMAN>  show all;
using  target database control file instead of recovery catalog
RMAN   configuration parameters for database with db_unique_name ORCL are:
CONFIGURE  RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE  BACKUP OPTIMIZATION OFF; # default
CONFIGURE  DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE  CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE  CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE  DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE  DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE  ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE  MAXSETSIZE TO UNLIMITED; # default
CONFIGURE  ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE  ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE  COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE    ; # default
CONFIGURE  ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE  SNAPSHOT CONTROLFILE NAME TO    '/u01/app/oracle/product/11.2.4/dbhome_1/dbs/snapcf_orcl.f'; # default

RMAN>

 

O “#default” ao final de cada linha significa que nada foi ainda alterado e a especificações estão todas originais.
Alterando BACKUP OPTIMIZATION para ON via PL/SQL:

SQL>  var a number
SQL>  exec :a := DBMS_BACKUP_RESTORE.SETCONFIG('BACKUP OPTIMIZATION','ON');

PL/SQL  procedure successfully completed.

SQL>  print :a

         A
----------
         1

SQL>

 

O número 1 retornado pela função é o ID desta configuração inserida. Podemos listar todas as configurações alteradas consultando a view v$rman_configuration:

SQL>  set lines 200
SQL>  col name format a40
SQL>  col value format a100
SQL>  select * from v$rman_configuration;

CONF#   NAME                                  VALUE
-----   ------------------------------------- --------------------------------
    1   BACKUP OPTIMIZATION                   ON

SQL>

 

Pelo RMAN, podemos nos certificar que ele foi modificado corretamente:

RMAN>  show backup optimization;

using  target database control file instead of recovery catalog
       RMAN    configuration parameters for database with db_unique_name ORCL are:
       CONFIGURE    BACKUP OPTIMIZATION ON;

RMAN>

 

Agora vou alterar o parâmetro COMPRESSION ALGORITHM:

SQL>  exec :a := DBMS_BACKUP_RESTORE.SETCONFIG('COMPRESSION ALGORITHM',
q'['HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE]');

PL/SQL  procedure successfully completed.

SQL>  print :a

         A
----------
         2

SQL>

 

Note que agora o ID 2 que foi inserido. Consultando na tabela de configurações:

SQL>    select * from v$rman_configuration;

CONF#  NAME                      VALUE
-----  ------------------------- ---------------------------------
    1  BACKUP OPTIMIZATION       ON
    2  COMPRESSION ALGORITHM     'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE

SQL>

 

No RMAN, tudo está OK.

RMAN>  show compression algorithm;

RMAN  configuration parameters for database with db_unique_name ORCL are:
CONFIGURE  COMPRESSION ALGORITHM 'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE;

RMAN>

 

Um dos pontos de atenção da procedure SETCONFIG é que ela não faz qualquer validação. Você pode simplesmente adicionar qualquer atributo com qualquer valor que desejar. Obviamente isso pode gerar uma inconsistência no dicionário de dados.

Neste exemplo, vou alterar o parâmetro CONTROLFILE AUTOBACKUP para MAYBE (note que este valor de opção na verdade não existe).

SQL>  exec :a := DBMS_BACKUP_RESTORE.SETCONFIG('CONTROLFILE AUTOBACKUP','MAYBE');

PL/SQL  procedure successfully completed.

SQL>  print :a

         A
----------
         3

SQL>

 

O parâmetro foi inserido sem qualquer validação. Se verificarmos agora no RMAN, veremos que o dicionário ficou corrompido:

RMAN>  show controlfile autobackup;

RMAN   configuration parameters for database with db_unique_name ORCL are:
       RMAN-00571:    ===========================================================
       RMAN-00569:    =============== ERROR MESSAGE STACK FOLLOWS ===============
       RMAN-00571:    ===========================================================
       RMAN-03002:    failure of show command at 12/10/2015 10:35:47
       RMAN-06466:    error parsing configuration string (CONFIGURE CONTROLFILE AUTOBACKUP MAYBE;)
       RMAN-01009:    syntax error: found "identifier": expecting one of: "clear,    format, off, on"
       RMAN-01008:    the bad identifier was: MAYBE
       RMAN-01007:    at line 1 column 34 file: Configuration Row

RMAN>

 

E os dados foram adicionadas na tabela de configuração do RMAN.

SQL>    select * from v$rman_configuration;

CONF#  NAME                       VALUE
-----  -------------------------- --------------------------------
    1  BACKUP OPTIMIZATION        ON
    2  COMPRESSION ALGORITHM      'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE
    3  CONTROLFILE AUTOBACKUP     MAYBE

SQL>

 

Para limpar este problema, podemos simplesmente usar a procedure DELETECONFIG passando como parâmetro o ID da linha que quer ser deletada.

SQL>  EXEC DBMS_BACKUP_RESTORE.DELETECONFIG(3);

PL/SQL  procedure successfully completed.

SQL>

 

Se verificarmos no RMAN e na tabela de configuração, a inconsistência foi resolvida.

SQL>  select * from v$rman_configuration;

CONF#  NAME                       VALUE
-----  -------------------------- --------------------------------
    1  BACKUP OPTIMIZATION        ON
    2  COMPRESSION ALGORITHM      'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE

SQL>

 

Mas e se quisermos alterar o valor de um parâmetro já cadastrado na tabela?

Se simplesmente usarmos o SETCONFIG para definir este novo valor, a procedure vai gerar uma nova linha na tabela. Desta forma, teríamos 2 valores para um único parâmetro, o que levaria a mais uma inconsistência.

A solução é remover o parâmetro antes de adicionar um novo valor para ele. Vamos como exemplo desligar o BACKUP OPTIMIZATION.

SQL>  exec DBMS_BACKUP_RESTORE.DELETECONFIG(1);

PL/SQL  procedure successfully completed.

SQL>  exec :a := DBMS_BACKUP_RESTORE.SETCONFIG('BACKUP OPTIMIZATION','OFF');

PL/SQL  procedure successfully completed.

SQL>  print :a

         A
----------
         1

SQL>

 

Verificando na tabela de configurações.

SQL>  select * from v$rman_configuration;

CONF#  NAME                       VALUE
-----  -------------------------- --------------------------------
    1  BACKUP OPTIMIZATION        OFF
    2  COMPRESSION ALGORITHM      'HIGH' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD FALSE

SQL>

 

Também é possível utilizar a procedure RESETCONFIG se quiser limpar todos os parâmetros definidos. Isto é bem útil especialmente para voltar os parâmetros aos seus valores de fábrica.

SQL>  exec DBMS_BACKUP_RESTORE.RESETCONFIG;

PL/SQL  procedure successfully completed.

SQL> select * from v$rman_configuration;
no rows selected

SQL>

 

Ótimo! Agora você já pode criar triggers/procedures/jobs que podem consultar e alterar as configurações do RMAN.

 


Rodrigo de Araujo Jorge é um profissional Oracle Sênior com mais de 8 anos de experiência industrial em tecnologias de ponta da Oracle. Ele esteve envolvido com várias plataformas soluções de alta disponibilidade e experiência na implantação de soluções de recuperação de desastres para o Oracle compliant MAA, através da construção de RAC e aplicações de espera ligado. Atualmente ele está trabalhando como um consultor sênior da Oracle em Amdocs.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.