terça-feira, 17 de dezembro de 2019

Autonomous Health Framework (AHF) - Instalação



 Abaixo, temos os passos necessários para a instalação do
Autonomous Health Framework em seu exadata.


Preparando a instalação:

  • Fazer o download dos arquivos de instalação a partir do Doc ID 2550798.1 (Autonomous Health Framework (AHF) - Including TFA and ORAchk/EXAChk) do MOS;   
  •  Copiar o arquivo para o diretório /tmp do servidor onde o AHF será instalado;
  •  Criar o diretório /u01/app/oracle.ahf no servidor onde o AHF será instalado;
  •  Caso o cluster possua mais de um nó, criar os diretórios /u01/app/oracle.ahf e /u01/app/oracle.ahf/data nos outros nós do cluster;


Para realizar a instalação, devemos executar os passos abaixo em apenas um nó do cluster.  Os demais nós do cluster terão a ferramenta instalada no final do procedimento.
 
Observação: as informações em Laranja são os valores que devem ser informados durante a instalação do Autonomous Health Framework.



Com o ambiente preparado e as informações necessárias para a instalação da ferramenta, é hora de por a mão na massa e fazer a instalação do AHF....


1) Devemos ir para o diretório onde os arquivos de instalação foram copiados
 
          cd /tmp
 
2) Descompartar o arquivo ZIP da instalação

           unzip AHF-LINUX_v19.3.2.zip

3) Executar o arquivo de instalação

         ./ahf_setup

   Durante a instalação, serão feitos alguns questionamentos para a correta instalaçãodo AHF, onde devemos entrar com as informações necessárias, conforme exemplo abaixo:


  •    Do you want to change AHF Location (/opt/oracle.ahf) ? Y|[N] : Y
  •    Please Enter new AHF Location : /u01/app/oracle.ahf
  •    Choose Option [1 - 3] : 1      (1. /u01/app/oracle.ahf [Free Space : 91096 MB])
  •    Do you want to add AHF Notification Email IDs ? [Y]|N : N
  •    Do you want us to store the Password for Cells in Oracle Wallet: [Y]|N Y
  •    Is password same for all Cells: [Y]|N Y
  •    Please Enter Password for Cell: senha de root dos Cell Servers
  •    Please Confirm Password for Cell: senha de root dos Cell Servers
  •    Do you want to install/upgrade AHF on Cluster Nodes ? [Y]|N : Y

4) Conferir a versão instalada e o status da instalação

     tfactl -version  (Nos DB Nodes o TFA não é executado)
 
     exachk -v        
  • Em uma VM com a instalação do (Oracle Enterprise Manager) usar: orachk -v        
  • Nos demais DB Nodes usar: /u01/app/oracle.ahf/bin/exachk -v

     tfactl status     (Nos DB Nodes o TFA não é executado)



5) Excluir os arquivos utilizados na instalação

      rm -f /tmp/AHF-LINUX_v19.3.2.zip
      rm -f /tmp/ahf_setup


<<< Observações importantes >>>

Todos os comandos deste roteiro devem ser realizados com o usuário root;

O diretório padrão da instalação é no /opt, mas neste roteiro como o filesystem do opt possui pouco espaço e há uma recomendação de que o repositório do AHF tenha pelo menos 5Gb de espaço, a instalação foi realizada no diretório /u01/app/oracle.ahf;

Ao final da instalação, às vezes, o status do inventário do TFA aparece com alguma mensagem de erro. Convém aguardar até o dia seguinte porque muitas vezes ele "se resolve" sozinho.

Se por algum motivo ocorrer erro onde os nós do cluster não se reconheçam (não encontrem um ao outro), podemos executar o script abaixo:

/u01/app/oracle.ahf/tfa/bin/synctfanodes.sh

 Do you want to update this node list? [Y|N] [N]: Y
Enter Remote Node List (separated by space) : nome dos outros nós do cluster (informados no início deste script) separados por espaços em branco
 
tfactl status




Comandos que podem ser utilizados após uma instalação bem-sucedida do AHF.

1) Conferir tamanho do repositório do AHF

      tfactl print repository


2) Alterar tamanho do repositório do AHF

     tfactl set reposizeMB=10240


3) Alterar o diretório do repositório do AHF

     tfactl set repositorydir=<DIR>







Fonte:
Doc ID 2550798.1 (Autonomous Health Framework (AHF) - Including TFA and ORAchk/EXAChk) do MOS

sexta-feira, 23 de junho de 2017

Tamanho das tablespaces de um banco de dados Oracle

Com o comando abaixo, podemos listar todas as tablespaces de banco do dados obtendo as seguintes informações:


Nome da tablespace.......................: TABLESPACE_NAME
Tamanho total da tablespace:.............: TOTAL_MB
Quantidade em MB utilizada...............: USADO_MB
Quantidade em MB livre para utilização...: LIVRE_MB
Porcentagem de espaço livre na tablespace: PCT_LIVRE
Porcentagem de espaço usado na tablespace: PCT_USADO



set lines 200 pages 1000

COL TABLESPACE_NAME FORMAT A30
COL TOTAL_MB format 999,999,999
COL USADO_MB format 999,999,999
COL LIVRE_MB format 999,999,999
COL PCT_LIVRE format 999,999,999.99
COL PCT_USADO format 999,999,999.99

compute sum of TOTAL_MB on report
compute sum of USADO_MB on report
compute sum of LIVRE_MB on report
compute avg of PCT_LIVRE on report
compute avg of PCT_USADO on report

select a.tablespace_name, a.total TOTAL_MB, a.total - b.free USADO_MB,
       b.free LIVRE_MB, (b.free * 100) / a.total PCT_LIVRE,
       (100 - ((b.free * 100) / a.total)) PCT_USADO
from    (select sum(bytes)/1024/1024 total, tablespace_name from dba_data_files group by tablespace_name
         union
         select sum(bytes)/1024/1024 total, tablespace_name from dba_temp_files group by tablespace_name) a,
        (select sum(bytes)/1024/1024 free,  tablespace_name from dba_free_space group by tablespace_name) b
where   b.tablespace_name(+) = a.tablespace_name
order by 6 desc;




A partir do comando acima, podemos diversificar as consultas, como no exemplo abaixo onde podemos listar apenas as tablespaces com menos de 10% de espaço livre para utilização.


set lines 200 pages 1000

COL TABLESPACE_NAME FORMAT A30
COL TOTAL_MB format 999,999,999
COL USADO_MB format 999,999,999
COL LIVRE_MB format 999,999,999
COL PCT_LIVRE format 999,999,999.99
COL PCT_USADO format 999,999,999.99

compute sum of TOTAL_MB on report
compute sum of USADO_MB on report
compute sum of LIVRE_MB on report
compute avg of PCT_LIVRE on report
compute avg of PCT_USADO on report

select a.tablespace_name, a.total TOTAL_MB, a.total - b.free USADO_MB,
       b.free LIVRE_MB, (b.free * 100) / a.total PCT_LIVRE,
       (100 - ((b.free * 100) / a.total)) PCT_USADO
from    (select sum(bytes)/1024/1024 total, tablespace_name from dba_data_files group by tablespace_name
         union
         select sum(bytes)/1024/1024 total, tablespace_name from dba_temp_files group by tablespace_name) a,
        (select sum(bytes)/1024/1024 free,  tablespace_name from dba_free_space group by tablespace_name) b
where   b.tablespace_name(+) = a.tablespace_name
and     (trunc((b.free * 100) / a.total)) <= 10
order by 6 desc;


Utilização de CPU

Uma das formas de medição de consumo de banco de dados é a verificação da utilização de CPU por parte das aplicações no banco de dados.

Para obtermos essas informações, podemos utilizar o comando abaixo:


1) Para um banco de dados single instance:


SET PAGESIZE 60
SET LINESIZE 300

COLUMN username FORMAT A30
COLUMN sid FORMAT 9999999
COLUMN serial# FORMAT 9999999
COLUMN "utilização de cpu (seconds)"  FORMAT 999,999,999.0000

SELECT
   s.username,
   t.sid,
   s.serial#,
   SUM(VALUE/100) as "utilização de cpu (seconds)"
FROM
   v$session s,
   v$sesstat t,
   v$statname n
WHERE
   t.STATISTIC# = n.STATISTIC#
AND
   NAME like '%CPU used by this session%'
AND
   t.SID = s.SID
AND
   s.status='ACTIVE'
AND
   s.username is not null
GROUP BY username,t.sid,s.serial#
order by 4 desc;





2) Para banco de dados em cluster:

SET PAGESIZE 60
SET LINESIZE 300

COLUMN username FORMAT A30
COLUMN sid FORMAT 9999999
COLUMN serial# FORMAT 9999999
COLUMN "utilização de cpu (seconds)"  FORMAT 999,999,999.0000

SELECT
   s.username,
   t.sid,
   s.serial#,
   SUM(VALUE/100) as "utilização de cpu (seconds)"
FROM
   gv$session s,
   gv$sesstat t,
   gv$statname n
WHERE
   t.STATISTIC# = n.STATISTIC#
AND
   NAME like '%CPU used by this session%'
AND
   t.SID = s.SID
AND
   s.status='ACTIVE'
AND
   s.username is not null
GROUP BY username,t.sid,s.serial#
order by 4 desc;



Dependendo das necessidades, podemos incrementar os comandos acima, solicitando por exemplo que sejam exibidas apenas as sessões que pertencem a mesma aplicação, utilizando o campo SERVICE_NAME, da seguinte forma:


SET PAGESIZE 60
SET LINESIZE 300

COLUMN username FORMAT A30
COLUMN sid FORMAT 9999999
COLUMN serial# FORMAT 9999999
COLUMN "utilização de cpu (seconds)"  FORMAT 999,999,999.0000

SELECT
   s.username,
   t.sid,
   s.serial#,
   SUM(VALUE/100) as "utilização de cpu (seconds)"
FROM
   gv$session s,
   gv$sesstat t,
   gv$statname n
WHERE
   t.STATISTIC# = n.STATISTIC#
AND
   NAME like '%CPU used by this session%'
AND
   t.SID = s.SID
AND
   s.status='ACTIVE'
AND
   s.username is not null
AND s.service_name like 'NOME_SERVICO'
GROUP BY username,t.sid,s.serial#
order by 4 desc;



Estes são apenas exemplos, onde podemos modificar o comando de acordo com as necessidades de momento.

Consultar sessões em espera / wait session

Com o comando SQL abaixo, podemos consultar as sessões que estão em execução em uma instância de banco de dados, ordenando essa consulta pelo tempo que essa sessão está em execução.

Abaixo, temos uma consulta onde selecionamos as sessões de banco de dados que estão em execução / aguardando um retorno por mais de 10 segundos e que o evento de espera não seja SQL*Net message from client.

Podemos, através deste comando fazer diversas consultas diferentes, de acordo com nossas necessidades de pesquisa.


set lines 300 pages 500
col wait_class for a15
col event for a32
col username for a15
col osuser for a15
col machine for a29
col program format a40

select w.SID, w.WAIT_CLASS, w.EVENT, w.SECONDS_IN_WAIT Second_Wait,w.wait_time Wait_Time,s.BLOCKING_SESSION,s.status ,s.BLOCKING_INSTANCE INST_BLOCK ,s.BLOCKING_SESSION_STATUS, s.sql_id, s.machine
from v$session_wait w, v$session s
where w.sid = s.sid
and w.SECONDS_IN_WAIT>10
and w.event <> 'SQL*Net message from client'
and w.wait_class<>'Idle'
order by w.SECONDS_IN_WAIT desc;

ORA-04063: view "SYS.DBA_REGISTRY" has errors



Após uma cópia do banco de dados feita a partir de um outro banco na mesma versão, mas utilizando a cópia de discos, nos deparamos com uma quantidade grande de objetos inválidos.

Após várias verificações identificamos que alguns componentes de banco de dados estavam inválidos e na tentativa de corrigir, acabamos por danificar o catálogo, onde ao executarmos um select na dba_registry era exibido o erro abaixo:

SQL> Select * from dba_registry;

ORA-04063: view "SYS.DBA_REGISTRY" has errors


ao tentarmos ver a descrição da view dba_registry, recebíamos o seguinte erro:


SQL> desc dba_registry

ORA-24372: invalid object for describe


As causas mais prováveis ​​para os componentes dba_registry tornarem-se inválidas, são:

  • Aplicação de um patch;
  • Instalação de um novo componente;
  • Os scripts catalog.sql ou catproc.sql não foram executados com sucesso após a criação do banco de dados.

Qualquer uma das atividades acima pode ter falhado em algum momento ou qualquer um dos objetos dependentes ficaram inválidos.


Normalmente, a solução é executarmos os scripts catalog.sql e, em seguida, catproc.sql como sysdba conforme a nota do metalink indicada nas referências.


Esse problema também pode acontecer se você executar o catproc.sql primeiro e depois catalog.sql.

Abaixo segue a ordem correta de execução dos scripts.


$sqlplus "/as sysdba"

SQL> startup upgrade
SQL > @?/rdbms/admin/catalog.sql
SQL > @?/rdbms/admin/catproc.sql
SQL > @?/rdbms/admin/utlrp.sql



Referência:

Note: 457861.1 CATPROC - Packages and Types Invalid in Dba_registry

quinta-feira, 22 de junho de 2017

Verifica privilégios de usuários no banco de dados


Em alguns momentos, podemos ter a necessidade de identificar privilégios que usuários do banco de dados possuem e para isso, podemos utilizar os comandos abaixo:


1) Privilégios de sistema

Para consultar os privilégios de sistema, podemos usar os seguintes comandos:

    select GRANTEE,PRIVILEGE from dba_sys_privs where PRIVILEGE='<PRIVILEGIO>';
    select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE='<USUARIO>';

Exemplo:


a) Verificar quem possui um determinado privilégio de sistema

    select GRANTEE,PRIVILEGE from dba_sys_privs where PRIVILEGE='SELECT ANY DICTIONARY';


No comando acima, estamos informando o privilégio que queremos identificar, neste caso o SELECT ANY DICTIONARY



b) Verificar quais privilégios de sistema um determinado usuário possui

    select PRIVILEGE from dba_sys_privs where GRANTEE='XPTO';


Já neste comando, estamos informando o nome do usuário que queremos listar os privilégios de sistema concedidos.




2) Roles atribuídas para o usuário


Com os comandos abaixo, podemos identificar as ROLEs que foram atribuídas para um determinado usuário.

    select GRANTEE,GRANTED_ROLE from dba_role_privs;
    select GRANTEE,GRANTED_ROLE from dba_role_privs where GRANTED_ROLE='<ROLE>';
    select GRANTED_ROLE from dba_role_privs where GRANTEE='<USUARIO>';


a) Lista todos os usuários e as roles atribuídas

    select GRANTEE,GRANTED_ROLE from dba_role_privs;


b) Lista os usuários que possuem uma determinada role atribuída:

    select GRANTEE,GRANTED_ROLE from dba_role_privs where GRANTED_ROLE='SELECT_CATALOG_ROLE';
 

   select GRANTEE,GRANTED_ROLE from dba_role_privs where GRANTED_ROLE='DBA';


c) Lista as roles que um determinado usuário possui:

    select GRANTED_ROLE from dba_role_privs where GRANTEE='XPTO';



3) Privilégio em objetos


Podemos ainda obter informações sobre privilégios em objetos de banco de dados para determinado usuário.

Para isso, podemos utilizar a view dba_tab_privs.

Exemplo:

    select GRANTEE,TABLE_NAME,PRIVILEGE from dba_tab_privs where GRANTEE='XPTO';


Onde temos o GRANTEE sendo o usuário com a permissão concedida, o table_name é o objeto que o usuário tem permissão de acesso e o PRIVILEGE o privilégio que o usuário tem no acesso ao objeto identificado.


sexta-feira, 2 de junho de 2017

Diretórios (Oracle) - Remover


Quando não necessitamos mais da existência de um diretório dentro do banco de dados, podemos removê-lo e para isso, podemos seguir os passos abaixo:


a) Conectar no banco de dados como sysdba

$ sqlplus / as sysdba

SQL>


b) Listar o diretório em sua configuração atual (para conferência)

SQL> set lines 300
SQL> col OWNER format a15
SQL> col DIRECTORY_NAME format a15
SQL> col DIRECTORY_PATH format a30

SQL> SELECT * FROM dba_directories WHERE directory_name = 'DIR_XPTO';

OWNER      DIRECTORY_NAME   DIRECTORY_PATH
--------------- ------------------------------ ---------------------------------------------------------------------
SYS             DIR_XPTO                     /u01/xpto/admin



c) Remover o diretório


Sintaxe: DROP DIRECTORY <directory name>;

Exemplo:

SQL> DROP DIRECTORY DIR_XPTO;



d) Verificar se o diretório foi excluído

SQL> SELECT * FROM dba_directories WHERE directory_name = 'DIR_XPTO';

no rows selected




Referência:

https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_8012.htm#SQLRF01516