Alterando parâmetros do RMAN usando DBMS_BACKUP_RESTORE

This post is also available in: English

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.

Artigo Publicado na OTN: http://www.oracle.com/technetwork/pt/articles/database-performance/alterando-configuracoes-rman-2851498-ptb.html

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 precisa alterá-los 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 ALGOTITHM:

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>

O maior problema 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>

Ótimo. Verificando 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.

Gostou? Não deixe de comentar ou deixar um 👍!

2 comentários

  1. Olá Jorge boa tarde,

    Poderia informar, por favor, qual a taxa de compressão do rman? Você pode fazer o backup com 3 tipos de compressão, seria isso mesmo? E quanto maior a compressão, maior será a utilização de CPU?

    O default é o "basic"? Qual seria a taxa de compressão? Entre 60% a 80%?

    abraços,
    Sofia

    1. Oi Sofia,

      Todas as compressões exceto a BASIC necessitam do "Advanced Compression Pack".

      Por traz do pano, elas utilizam:

      HIGH = BZIP2 -9 (max compression)
      MEDIUM = ZLIB
      LOW = LZO
      BASIC = BZIP2

      Pela minha experiência a compressão média de todos eles fica em torno de 1/3 do total de um backupset sem compressão.

      Abcs,
      RJ

Deixe um comentário

Seu e-mail não será publicado.