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
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
Autor
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