Dropar um banco de dados no Oracle

Para dropar o banco de dados da instância do Oracle é preciso realizar algusn procedimentos além do DROP DATABASE, para realizar tal tarefa basta seguir os passos abaixo:

1 – Digite o comando shutdown abort

SYS@bd120 AS SYSDBA> shutdown abort;
ORACLE instance shut down.

2 – Inicie o banco no estado MOUNT:

SYS@bd120 AS SYSDBA> startup force mount;
ORACLE instance started.

Total System Global Area 1.0689E+11 bytes
Fixed Size 2265864 bytes
Variable Size 5.1808E+10 bytes
Database Buffers 5.4761E+10 bytes
Redo Buffers 323678208 bytes
Database mounted.

3 – Mudar o banco para o restricted mode através do comando alter system enable restricted session:

SYS@bd120 AS SYSDBA> alter system enable restricted session;

Verificar se o banco mudou o status:
SYS@bd120 AS SYSDBA> SELECT logins from v$instance;
LOGINS
———-
RESTRICTED

4 – O banco estando em MOUNT e RESTRICTED, basta digitar DROP DATABASE e aguardar o banco ser dropado:

SYS@bd120 AS SYSDBA> drop database;

Database dropped.

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

 

Esses são os passos necessários para dropar um banco de dados no ORACLE.

Limpeza/Purge de logs com ADRCI

Os logs do Oracle são salvos em sua grande maioria no arquivo alert.log! Com o passar do tempo esse arquivo vai acumulando informações e se torna muito grande,  dificultando sua leitura e compreensão não hora do troubleshooting. Já tive arquivos na casa dos GB e a melhor alternativa era copia-lo para a Área de Trabalho e editar com o notepad++.

Para limpar os arquivos de logs podemos utilizar o utilitário ADRCI. Com o usuário Oracle logado digite o seguinte comando:

[code lang=”sql”]
adrci
[/code]
Você receberá uma mensagem semelhante á essa:
[code lang=”sql”]
ADRCI: Release 12.1.0.1.0 – Production on Wed Dec 21 21:30:43 2016
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
ADR base = "/u01/app/oracle"
[/code]
Em seguida digite show homes e espera o S.O. listar os homes de cada log gerenciado:
[code lang=”sql”]
adrci> show homes;

ADR Homes:
diag/tnslsnr/server01/listener_scan4
diag/tnslsnr/server01/listener_scan1
diag/tnslsnr/server01/vs01
diag/tnslsnr/server01/listener_scan3
diag/asmtool/user_root/host_954678459_80
diag/rdbms/vs22/vs22
[/code]

Agora é preciso setar o homepath de qual arquivo você vai limpar. Para escolher o alert log digite no sqlplus:
[code lang=”sql”]
show parameter user_dump_dest
user_dump_dest string /u01/app/oracle/diag/rdbms/<strong>vs22/vs22/trace
[/code]
Com base na informação acima, sabemos que o homepath do alert.log é o diag/rdbms/vs22/vs22!
[code lang=”sql”]
set homepath diag/rdbms/vs22/vs22
[/code]
Depois de setar o homepath basta digitar o comando agora para limpar as entradas no alert.log, sendo que 1440 é referente á 1 dia (1440 minutos).
[code lang=”sql”]
PURGE -age 1440 -type ALERT
[/code]
Geralmente deixo os últimos 30 dias de logs para consulta, sendo assim ficaria 1440 x 30 = 43200:
[code lang=”sql”]
PURGE -age 43200 -type ALERT
[/code]
Feito isso o alert.log será limpo de acordo com o tempo que você desejar. É interessante criar uma rotina de expurgo para evitar fazer o serviço manualmente e por ventura esquecer de realizá-la periodicamente.

Alguns arquivos de AUDITORIA, cuja extensão é .aud são gerados constantemente no caminho informado no parâmetro: audit_file_dest ! Uma maneira simples de limpar esses arquivos é com o comando FIND, pois o rm -rf *.aud estoura a lista de argumentos do S.O. não permitindo a exclusão por inteiro. Abaixo segue o script que utilizo para limpar as pastas de audit:

[code lang=”sql”]
find /u01/app/oracle/admin/vs25/adump -name ‘*.aud’ -mtime +60 -exec rm -f {} \;
[/code]

Até a próxima

Solucionando o erro ORA-01591 – lock held by in-doubt distributed transaction

O erro: ORA-01591: lock held by in-doubt distributed transaction, ou em um bom português ORA-01591: bloqueio retido pela transação distribuída 3251.6.3549 geralmente é causado por problemas relacionados a DBLINKs.

A consulta por transações retidas ficam na tabela: DBA_2PC_PENDING. Um simples select nessa tabela retorna informações sobre as transações locais e globais:

[code lang=”sql”]
SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID,STATE,
‘EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘||””||LOCAL_TRAN_ID||””||’);’||chr(13)||’COMMIT;’
FROM DBA_2PC_PENDING
ORDER BY 1 ASC;
[/code]

Para limpar as transações, basta executar o comando abaixo, onde o @local_tran_id é o campo LOCAL_TRAN_ID e o @COMMIT# é o campo COMMIT# da tabela DBA_2PC_PENDING:

[code lang=”sql”]
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘@LOCAL_TRAN_ID’);
COMMIT;
[/code]

Em alguns casos é preciso realizar o rollback da transação através do comando ROLLBACK FORCE ‘@LOCAL_TRAN_ID’,’@COMMIT#’ ficando o script completo dessa maneira:

[code lang=”sql”]
ROLLBACK FORCE ‘@LOCAL_TRAN_ID’,’@COMMIT#’;
EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘@LOCAL_TRAN_ID’);
COMMIT;
[/code]

Para automatizar essa limpeza podemos utilizar o seguinte script no crontab ou no Oracle Scheduler e agendar da forma como seu ambiente se comporta, podendo ser diário, semanal ou mensal:

[code lang=”sql”]
declare
xid varchar2(22);
begin
for c1 in (select LOCAL_TRAN_ID FROM DBA_2PC_PENDING) loop
dbms_transaction.PURGE_LOST_DB_ENTRY(c1.LOCAL_TRAN_ID);
commit;
end loop;
end;
[/code]

Importante: Em situações que não for possível purgar a transação via pacote DBMS, o procedimento poderá ser feito de forma manual executando os 3 deletes abaixo:

[code lang=”sql”]
delete from sys.pending_trans$ where local_tran_id = ‘LOCAL_TRAN_ID’;

delete from sys.pending_sessions$ where local_tran_id = ‘LOCAL_TRAN_ID’;

delete from sys.pending_sub_sessions$ where local_tran_id = ‘LOCAL_TRAN_ID’;

commit;
[/code]

 

Há também situações mais graves em que sua transação não aparece nem nas V$ de controle do Oracle, e a solução é um pouco mais difícil, inclusive consegui a solução através desse link. Comece fazendo o select abaixo:

SELECT a.KTUXEUSN + ‘.’ + a.KTUXESLT + ‘.’ + a.KTUXESQN as “transação”, a.* FROM x$ktuxe a WHERE a.ktuxesta <> ‘INACTIVE’;

Insira o valor que está na coluna transação nas seguintes tabelas:
[code lang=”sql”]
INSERT INTO sys.pending_trans$
(local_tran_id, global_tran_fmt, global_oracle_id, state, status, session_vector, reco_vector, type#, fail_time, reco_time)
VALUES
(‘19.5.14679063’, 306206, ‘XXXXXXX.12345.1.2.3’, ‘prepared’, ‘P’, HEXTORAW(‘00000001’), HEXTORAW(‘00000000’), 0, SYSDATE, SYSDATE);

INSERT INTO sys.pending_sessions$
VALUES
(‘19.5.14679063’,1,HEXTORAW(‘05004F003A1500000104′),’C’, 0, 30258592, ”, 146);

COMMIT;
[/code]

Após inserir os dados nas tabelas, execute o comando abaixo para fazer rollback da transação e verifique se os registros foram expurgados das views: sys.pending_trans$ e sys.pending_sessions$. Se sim, seu problema está resolvido, senão, faça o próximo procedimento!

[code lang=”sql”]
rollback force ‘19.5.14679063’;
COMMIT;

select * from sys.pending_sessions$ where local_tran_id= ‘19.5.14679063’;
select * from sys.pending_trans$ where local_tran_id= ‘19.5.14679063’
[/code]

Caso os registros ainda se encontrem nas views acima, execute o comando abaixo:
[code lang=”sql”]
EXEC dbms_transaction.purge_lost_db_entry(‘19.5.14679063’);
COMMIT;
[/code]

Se ainda sim, o registro ainda estiver nas views e bloqueando as execuções, abra um chamado na oracle para apoio.

É importante frisar que esse procedimento resolve os problemas das transações retidas e não elimina a causa raiz do problema, procure encontrar evidências no ALERT.LOG, no log do GRID para resolver o problema por completo.

 

Gerar relatório AWR no Oracle

O Automatic Workload Repository (AWR) é um relatório muito útil para identificar gargalos e problemas de lentidão no Oracle. Esse relatório é disponível para quem tem o pacote DIAGNOSTICS TUNING licenciado, para quem não possui tem o recurso STATSPACK. O AWR pode ser gerado através do SQLPLUS em 4 simples passos:

  1. Qual tipo do relatório a ser gerado. Pode ser em .txt ou html. Eu particularmente prefiro o HTML, facilita bem mais a leitura.
  2. O tempo a ser analisado. Esse tempo deve ser colocado em dias. Exemplo: se quiser ver dados de 1 mês, digitar 30, 2 meses, 60 e assim em diante.
  3. O snapshot id inicial
  4. O snapshot id final

Para iniciar a geração do relatório entre no SQLPLUS:

[SRV:bd01:/home/oracle]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Dec 12 16:47:26 2016

Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

1º Passo: executar o script awrrpt.sql, ele fica localizado no diretório $ORACLE_HOME/rdbms/admin/awrrpt.sql! Para executar um script dentro do SQPLUS basta colocar o @? e o caminho do arquivo, conforme script abaixo:

SYS@bd01 AS SYSDBA> @?/rdbms/admin/awrrpt.sql

Current Instance
~~~~~~~~~~~~~~~~

DB Id DB Name Inst Num Instance
———– ———— ——– ————
3534058528 bd01 1 bd01

2º Passo: Informe o tipo do relatório que será gerado: HTML ou TXT. Se você não digitar nada e apertar enter, o oracle assume o valor padrão e deixa como HTML:

Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter ‘html’ for an HTML report, or ‘text’ for plain text
Defaults to ‘html’
Enter value for report_type: html

 

 

3º Passo: Especificar o número de dias a considerar, no meu caso escolhi 90 dias

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing <return> without
specifying a number lists all completed snapshots.

Enter value for num_days: 90

Após digitar esse valor, o Oracle lista todos os snapshots disponíveis nesse range de data:

 

4º Passo: Informar o Snapshot inicial e final. No exemplo acima vamos colocar o snapshot 997 a 1001. Primeiro informe o Snapshot Id 997 e dê enter, depois informe o 1001 para o END Snapshot Id e dê enter novamente.

 

Após informar os ID’s, ele pede que você dê um nome ao arquivo, caso você ignore e aperte enter, ele será criado com o nome default: awrrpt_1_snapIdinicial_snapIdfinal.html !

Feito isso basta esperar o AWR ser gerado na pasta em que você estava antes de entrar no SQLPLUS, no meu caso, o usuário estava na pasta /home/oracle:

Ao abrir o AWR você terá algo do tipo:

Basicamente para gerar o AWR é seguir esses passos. Muitas vezes o suporte da Oracle solicita esse arquivo para análises de chamados e gargalos e durante o dia a dia o DBA pode utilizar para identificar problemas de desempenho.

Carregar mais