sexta-feira, 27 de janeiro de 2017

Recriar o schema do AWR


Em alguns momentos, podemos ter a necessidade de recriação do AWR em nosso banco de dados.

Isto ocorre principalmente quando precisamos fazer uma manutenção na tablespace SYSAUX e/ou quando a geração de snapshots do AWR apresenta problema, não sendo gerado de forma adequada.

Antes de fazer a recriação do AWR, precisamos verificar a necessidade de guardarmos ou não os dados atuais do AWR, ou seja, os snapshots criados até este momento.

Se decidirmos por guardar, podemos fazer um extração dos dados e guardá-los em um arquivo para um possível retorno ou import em um outro ambiente.
Mas, para isso, precisamos fazer o export utilizando um script Oracle, que pode ser verificado nesse link:  http://oracle-sql-procedimentos.blogspot.com.br/2017/01/exportar-dados-do-schema-awr.html

Após feito o export e guardado nosso arquivo, vamos recriar o AWR seguindo os passos abaixo:


1) Verificar os parâmetros de configuração do banco de dados.

Antes de iniciarmos a recriação, precisamos obter algumas informações de configuração do banco de dados que serão úteis para o prosseguimento da atividade.

As informações mais inportantes nesse momento são:

- Ambiente é cluster ou single?
- Nível de estatística configurado.
- Valor atribuído ao SGA_TARGET
- Local do spfile


    sqlplus /nolog
    connect / as sysdba
    show parameter cluster_database
    show parameter statistics_level
    show parameter sga_target
    show parameter spfile


É recomendado salvar a versão atual do spfile, pois posteiormente iremos voltar o banco de dados para a configuração original.

    SQL> create pfile='/home/oracle/init.ora' from spfile;



2) Alteração de parâmetros do banco de dados

Para podermos recriar o AWR, os parâmetros abaixo do banco de dados devem ser alterados:

    alter system set shared_pool_size = 200m scope = spfile;
    alter system set db_cache_size = 300m scope = spfile;
    alter system set java_pool_size = 100 scope = spfile;
    alter system set large_pool_size = 50 scope = spfile;
    alter system reset sga_target scope= spfile;
    alter system reset memory_target scope= spfile;
    alter system reset memory_max_target scope=spfile;
    alter system set statistics_level=basic scope=spfile;


Se o banco de dados for um banco cluster, devemos alterar também o parâmetro abaixo:

    alter system set cluster_database=false scope=spfile;



3) Reiniciar o banco de dados

Após a alteração dos parâmetros, devemos reiniciar o banco de dados em modo restrito.

Se o ambiente for um cluster, devemos iniciar apenas uma instância, deixando as demais off-line.

    SQL> startup restrict


Após o banco de dados estar on-line, devemos verificar se os valores da sga_target e memory_target estão iguais a ZERO (0), caso não estejam, devem ser alteradas, conforme comandos abaixo:


    SQL> alter system set sga_target=0 scope= spfile;
    SQL> alter system set memory_target=0 scope= spfile;


IMPORTANTE:

Em alguns casos, durante a reinicialização do banco de dados, podemos receber o erro abaixo e o banco de dados não iniciar.

ORA-01078: failure in processing system parameters
ORA-00824: cannot set SGA_TARGET or MEMORY_TARGET due to existing internal settings
ORA-00848: STATISTICS_LEVEL cannot be set to BASIC with SGA_TARGET or MEMORY_TARGET

Se recebermos o erro acima e o banco não iniciar, devemos parar o banco de dados e novamente reiniciá-lo.

    sqlplus /nolog
    SQL> connect / as sysdba
    SQL> shutdown immediate
    SQL> startup restrict



4) Remover os objetos do AWR


Para remover os objetos do AWR devemos utilizar o script catnoawr.sql, conforme descrito abaixo:

    SQL> @?/rdbms/admin/catnoawr.sql

Em seguida, executar um flush na shared_pool:

    SQL> alter system flush shared_pool;


5) Verificar objetos do AWR

Após a execução do script catnoawr.sql e do flush na shared_pool, devemos verificar se ainda existe algum objeto do AWR no banco de dados, para isso, temos o SQL abaixo:

    SQL> select table_name from dba_tables where table_name like 'WRM$_%' or table_name like 'WRH$_%';

Se ainda existir algum objeto, devemo excluí-lo manualmente, conforme o exemplo abaixo:

     drop type AWR_OBJECT_INFO_TABLE_TYPE;
     drop type AWR_OBJECT_INFO_TYPE;
     drop table WRH$_PLAN_OPERATION_NAME;
     drop table WRH$_PLAN_OPTION_NAME;
     drop table WRH$_MV_PARAMETER;
     drop table WRH$_MV_PARAMETER_BL;
     drop table WRH$_DYN_REMASTER_STATS;
     drop table WRH$_PERSISTENT_QMN_CACHE;
     drop table WRH$_DISPATCHER;
     drop table WRH$_SHARED_SERVER_SUMMARY;
     drop table WRM$_WR_USAGE;
     drop table WRM$_SNAPSHOT_DETAILS;


Obs.:
- O Ideal é executar os comandos drop acima, mesmo que não apareçam no select anterior de verificação.
- Se aparecerem uma ou duas tabelas apenas e ao executar o drop aparecer a informação de que o objeto não existe, mesmo sendo exibido, devemos executar a lista de drop acima por completo, que todos os objetos serão removidos.

- Em bancos de dados Oracle 12c, além das tabelas informadas acima, também temos que remover as seguintes tabelas(que não existiam no 11g):

WRH$_REPLICATION_TBL_STATS
WRH$_REPLICATION_TXN_STATS
WRH$_SESS_SGA_STATS

Para isso, utilizaremos os comandos abaixo:

drop table WRH$_REPLICATION_TBL_STATS;
drop table WRH$_REPLICATION_TXN_STATS;
drop table WRH$_SESS_SGA_STATS;


6) Criar os objetos do AWR


Para criarmos os objetos do AWR, devemos executar o script catawrtb.sql, conforme descrito a seguir:

    SQL> @?/rdbms/admin/catawrtb.sql


Após a criação dos objetos, devemos recompilar todos os objetos utilizando o utlrp.sql

    SQL> @?/rdbms/admin/utlrp.sql


Em banco de dados 11G e 12C é necessário também executar o script execsvrm.sql

    SQL> @?/rdbms/admin/execsvrm.sql


A execução do script execsvrm.sql pode gerar os erros abaixo:

ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package body "SYS.DBMS_SWRF_INTERNAL" has been invalidated

Se isso ocorrer, devemos recompilar os seguintes objetos manualmente:

    SQL> alter package dbms_swrf_internal compile;
    SQL> alter package dbms_swrf_internal compile body;


Obs.: É extremamente importante que os objetos dbms_swrf_internal estejam como válidos.

Após esses objetos estarem válidos, devemos executar novamente o script execsvrm.sql



7) Fazer um shirink na tablespace SYSAUX

Após uma manutenção feita na tablespace SYSAUX, é interessante fazer um shrink, para que os dados sejam reordenados e o espaço livre liberado.

O shrink é feito por datafile (No Oracle 12c, podemos fazer por tablespace), portanto precisamos identificar os datafiles que pertencem a tablespace SYSAUX.

Para isso, podemos executar o SQL abaixo:

SQL> select FILE_NAME from dba_data_files where TABLESPACE_NAME='SYSAUX' order by 1;

FILE_NAME
------------------------------------------------
+DG_01/xpto/sysaux_01.dbf
+DG_01/xpto/sysaux_02.dbf
+DG_01/xpto/sysaux_03.dbf
+DG_01/xpto/sysaux_04.dbf


Em seguida, podemos verificar até quanto poderemos reduzir o tamanho dos datafiles, utilizando o SQL abaixo:


set lines 200
col file_name format a50

SELECT  file_name, CEIL((NVL(e.hwm, 1) * 8192)/1024/1024) as "Mb" FROM dba_data_files f
LEFT JOIN
    (SELECT file_id, max(block_id + blocks - 1) hwm FROM dba_extents GROUP BY file_id) e ON f.file_id = e.file_id
WHERE
    f.file_name like '%sysaux%';


FILE_NAME                       Mb
------------------------------ ------
+DG_01/xpto/sysaux_01.dbf      1024
+DG_01/xpto/sysaux_02.dbf      1024
+DG_01/xpto/sysaux_03.dbf      1024
+DG_01/xpto/sysaux_04.dbf      1024


Com as informações dos data files e o valor mínimo que poderemos diminuir cada data file, vamos fazer o shrink com o comando abaixo:

SQL> alter database datafile 'datafile' resize <VALOR>M;


alter database datafile '+DG_01/xpto/sysaux_01.dbf' resize 1024M;
alter database datafile '+DG_01/xpto/sysaux_02.dbf' resize 1024M;
alter database datafile '+DG_01/xpto/sysaux_03.dbf' resize 1024M;
alter database datafile '+DG_01/xpto/sysaux_04.dbf' resize 1024M;



8) Voltar parâmetros do SPFILE

Agora, que já recriamos o AWR e fizemos o shrink na tablespace SYSAUX, devemos voltar os parâmetros originais do SPFILE, conforme cópia feita no início da atividade, e para isso precisamos:

Parar o banco de dados

    SQL> shutdown immediate

Iniciar o banco com o arquivo pfile - criado no início das atividades

    sqlplus / as sysdba

    SQL> startup pfile='/home/oracle/init.ora' ;


Recriar o spfile original

    SQL> create spfile='+DG_01/xpto/spfile.ora from pfile='/home/oracle/init.ora' ;


9) Reiniciar o banco de dados

Reiniciar o banco de dados em modo normal, com os parâmetros originais

sqlplus /nolog
connect / as sysdba
shutdown immediate
startup


* Neste momento o banco de dados volta em seu modo normal. Se for um ambiente cluster, todas as instâncias de banco de dados deverão ser iniciadas.


10) Verificar objetos inválidos

Após o banco de dados iniciar em modo normal, devemos verificar se existe algum objeto inválido e para isso, podemos verificar os objetos inválidos no banco de dados com os sqls abaixo:


    select substr(comp_name,1,40) comp_name, status, substr(version,1,10) version from dba_registry order by comp_name;

    select substr(object_name,1,40) object_name,substr(owner,1,15) owner,object_type from dba_objects where status='INVALID' order by owner,object_type;

    select owner,object_type,count(*) from dba_objects where status='INVALID' group by owner,object_type order by owner,object_type ;


Se ainda existir objetos inválidos, devemos recompilá-los, manualmente ou através do utlrp.sql.


11) Executar snapshots

Nosso próximo passo é verificar se os snapshots do AWR são gerados de forma correta no banco de dados e para isso, podemos executar o comando abaixo:

    SQL> exec dbms_workload_repository.create_snapshot;

Esperar 5 minutos

    SQL> exec dbms_workload_repository.create_snapshot;




12) Gerar relatório AWR

Para finalizar, após ter gerado pelo menos 2 snapshots, iremos gerar um relatório AWR, e para isso devemos executar o script awrrpt.sql

    SQL> @?/rdbms/admin/awrrpt.sql



Obs.:

Após a recriação dos objetos do AWR ele voltará com as configurações padrão do Oracle para snapshots e tempo de retenção, sendo 1 snapshot a cada 1 hora e armazenamento desses snapshots por 7 dias.




Referência:

https://docs.oracle.com/cd/E18283_01/server.112/e17120/tspaces007.htm
http://stackoverflow.com/questions/15563408/shrink-permanent-tablespace-in-oracle-11g
How to Recreate The AWR ( AUTOMATIC WORKLOAD ) Repository ? (Doc ID 782974.1)
https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=306121842606596&id=782974.1&_adf.ctrl-state=l4f4s2ae5_110