MigraTI - Soluções em banco de dados

terça-feira, 27 de outubro de 2009

Criando triggers de login

Segue abaixo passos rapidos de como criar uma trigger de login.
Após este procedimento você poderá criar a trigger com quantos campos achar necessário, basta programar.


SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
lana

SQL> CREATE TABLE connection_lana (login_date DATE,user_name VARCHAR2(30));

Table created.

SQL> select * from connection_lana;

no rows selected

SQL> CREATE OR REPLACE TRIGGER teste_login after LOGON ON DATABASE
when (USER LIKE 'SYS')
DECLARE
v_sid number;
v_module varchar2(48);
BEGIN
INSERT INTO connection_lana
(login_date, user_name)
VALUES
(SYSDATE, USER);
END teste_login;
/

Trigger created.

SQL> select trigger_name,status from dba_triggers where trigger_name='TESTE_LOGIN';

TRIGGER_NAME STATUS
------------------------------ --------
TESTE_LOGIN ENABLED

SQL> conn / as sysdba
Connected.
SQL> select * from connection_lana;

LOGIN_DAT USER_NAME
--------- ------------------------------
27-OCT-09 SYS

SQL>

sexta-feira, 16 de outubro de 2009

Rman Parte 2

Bom dia.

A correria do dia a dia me impede de atualizar o blog todo dia. ;(

Bom conforme comentado no post antigo, segue a segunda parte do Rman.
Vou demonstrar como recuperar alguns archives do catalogo.

Primeiro você deve saber se o archive ainda esta Guardado, com a opção.

list archivelog all;


Se os archives estiverem com o status "AVAILABLE" é porque você ainda pode recuperar o arquivo.

Vamos aos comandos.

#Para restaurar apenas um archive da fita basta você utilizar o comando abaixo.
run {
allocate channel CANAL type SBP_TAPE;
set archivelog destination to "CAMINHO";
restore archivelog logseq=469 thread=1;
}

#Para você restaurar uma sequencia de archives você pode utilizar o famoso until, segue abaixo.
run {allocate channel CANAL type disk;
set archivelog destination to "CAMINHO";
restore archivelog from logseq 469 until logseq=475;
}

Este procedimento pode ser bem demorado, caso seu backup estiver sendo compactado (compress=Y) nos parametros do RMAN.

Breve Rman Parte 3.
Como duplicar uma base com o Rman.

quinta-feira, 1 de outubro de 2009

Rman Parte 1

Bom.

Muitos ambientes estão começando a utilizar esta funcionalidade do Oracle.
O que passa a oferecer no mercado um nicho de oportunidades para nos especializarmos.

Como o que eu mais faço aqui na empresa é trabalhar com backup, estou começando a fuçar nesta tecnologia.

Então vamos a alguns comandos muito uteis para nos entendermos neste aplicativo que para muitos pode ser considerado um bixode sete cabeças.


Para iniciarmos, começamos com o "show all"
Ete comando irá lhe mostrar todas as configurações pré setadas no catalogo de backup.
exmplo de uma configuração.


Vamos a parte pratica.

[oracle@machine archive]$ rman catalog=user/senha@instance target=user/senha@instance

Recovery Manager: Release 9.2.0.7.0 - 64bit Production

Copyright (c) 1995, 2002, Oracle Corporation. All rights reserved.

connected to target database: INSTANCE (DBID=268364877)
connected to recovery catalog database

RMAN> show all;

starting full resync of recovery catalog
full resync complete
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 15 DAYS;
CONFIGURE BACKUP OPTIMIZATION ON;
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'SBT_TAPE' TO '%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 1;
CONFIGURE DEVICE TYPE 'SBT_TAPE' PARALLELISM 1;
CONFIGURE CHANNEL 1 DEVICE TYPE 'SBT_TAPE' PARMS 'ENV=(TDPO_OPTFILE=/opt/tivoli/tsm/client/oracle/bin64/tdpo.opt)';
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/home23/oracle/backup/rman/files/%d_%s_%p';
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/home23/oracle/backup/rman/files/control-corp2-bkp.ctl';

RMAN>


[oracle@machine archive]$ rman catalog=user/senha@instance target=user/senha@instance

Você deve se perguntar o porquê desta linha complicada para conectar no rman.
Você tem de executar esta linha pelo seguinte motivo, o catalogo do Rman pode estar em outra instancia/maquina, por isso especifiquei no script onde exatamente ele vai conectar.

target esta igual ao catalog pois o target é o destino seria de qual banco que estou efetuando a conexão.

Digamos que tenho dois bancos.
o banco A tem o catalogo, mas é o banco B que quero efetuar o backup.
então a linha ficaria assim
[oracle@machine archive]$ rman catalog=user_do_banco_A/senha@instance_A target=user_do_banco_B/senha@instance_B

Alguns parâmetros estão tão explícitos que é desnecessário comentar, mas mesmo assim vamos lá.

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF [NDAYS] DAYS; --Janela de retenção dos backup´s é de 15 dias.
CONFIGURE BACKUP OPTIMIZATION ON|OFF; --Backup otimizado esta habilitado. Serve para só fazer backuo de uma tablespace se a mesma houve alguma alteração.
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE'|'DISK'; --Informa o dispositivo padrão de backup.
CONFIGURE CONTROLFILE AUTOBACKUP ON|OFF; --faz backup do control file automaticamente ou não.
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'SBT_TAPE' TO '%F'; --Formata o backup do control file para fita
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; --grava em disco de forma serial
CONFIGURE DEVICE TYPE 'SBT_TAPE' PARALLELISM 1; -- Grava em fita de forma serial
CONFIGURE CHANNEL 1 DEVICE TYPE 'SBT_TAPE' PARMS... --Configura o canal 1 do dispositivo de fita atrás são os parâmetros de configuração da fita.
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/home23/oracle/backup/rman/files/%d_%s_%p'; --Configura o canal de disco e o formato.
CONFIGURE MAXSETSIZE TO UNLIMITED; -- Configura o tamanho maximo dos arquivos do Rman.
CONFIGURE SNAPSHOT CONTROLFILE NAME TO ...; -- Configura o snapshot do controlfile do Rman.


Acho que é isso ;D

Logo logo parte 2.

quinta-feira, 24 de setembro de 2009

Show error

Após tentar recompilar algum objeto com erro de compilação o oracle não lhe mostra o erro?

Tente o select abaixo.

select line||'/'||position "LINE_COL",text "ERROR"
from dba_errors
where name = 'OBJECT_NAME'
and type = 'OBJECT_TYPE'
and owner = 'OWNER'
order by line;

Isto já me quebrou o ganlho.

quarta-feira, 23 de setembro de 2009

SQL Balada

A muito tempo atraz recebi isto por email e ao ler o post de meu amigo mailer http://www.andremailer.com.br/, sobre sexo em C++ resolvi ir pela linha dele, e fui procurar o email.

segue abaixo o comportamento do homem em uma balada escrito em SQL.


ÀS 23H - CHEGANDO NA BALADA...

SELECT MULHER FROM BALADA
WHERE(GERAL = 'LINDA'
OR GERAL = 'GOSTOSA')
AND BUNDA >= 95
AND PEITOS >= 80
AND IDADE BETWEEN '18' AND '30'
AND CARATER = 'SAFADA'
AND ESTADO = 'ESTUDANTE';


ÀS 0H - AINDA NÃO CONSEGUIU NINGUÉM E JÁ ESTÁ COM UMAS CERVEJAS NO SANGUE...


SELECT MULHER FROM BALADA
WHERE GERAL = 'GOSTOSA'
AND BUNDA >= 80
AND PEITOS >= 70
AND IDADE BETWEEN '16' AND '35'
AND CARATER = 'MAIS OU MENOS SAFADA'
AND ESTADO = 'SEM OCUPAÇÃO';

ÀS 1H30 - COMEÇANDO A FICAR DESESPERADO...

SELECT MULHER FROM BALADA
WHERE GERAL = 'AJEITADA'
AND BUNDA >= 70
AND PEITOS >= 40
AND IDADE BETWEEN '16' AND '40'
CARATER != 'SANTA'
AND ESTADO = 'LARGADA';

ÀS 3H00 - DESESPERADO!!!...

SELECT MULHER FROM BALADA
WHERE GERAL LIKE '&BAGULHO&'
AND BUNDA <> 0
AND PEITOS <> 0
AND IDADE ETWEEN '14' AND '50'
ESTADO = 'EMPREGADA';

ÀS 4H00 - NA FILA PARA PAGAR E IR EMBORA DA BALADA...

SELECT MULHER FROM BALADA;


;D

sexta-feira, 18 de setembro de 2009

AWR Ocupando espaço na Sysaux

Nas versões 10.2.0.3 existe um bug com o AWR.
O mesmo coleta informações de SQL Plan mais não deleta, existe uma configuração para este procedimento que cria uma data de retenção no banco, por padrão esta data é de 10 dias, porem o 10.2.0.3 não consegue deletar estes registros.

Para verificar este problema verifique o tamanho da tabela wrh$_sql_plan, e verifiue a retenção de dias de seu awr.

SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
10

Para Verificar desde qual dia não é deletado.

SQL> select min(timestamp) from sys.wrh$_sql_plan;


MIN(TIMES
---------
26-OCT-08


Conforme Bug 6522103 deverá ser efetuado limpeza manual da tabela wrh$_sql_plan .


Segue abaixo procedimento.



select min (snap_id) from sys.wrh$_sql_plan where timestamp=( select min(timestamp) from sys.wrh$_sql_plan);

1000


select max(snap_id) from sys.wrh$_sql_plan where timestamp < sysdate - 15 ;

2600



delete from WRH$_SQL_PLAN where SNAP_ID between &begin_id and &end_id;

begin_id=1000

end_id=1500

-- Recomendo a deletar de 500 em 500 para não impactar em performance.


Commit;

Alter table sys.wrh$_sql_plan move;

alter index SYS.WRH$_SQL_PLAN_PK rebuild;



Refazer os procedimentos acima até liberar a area desejada.



Números acima são fictícios.

sexta-feira, 11 de setembro de 2009

ORA-01555 - Snapshot to old

Erro clássico na vida de um DBA, pode acreditar você nunca vai escapar deste erro.

O problema é, quando acontece este erro, eu aumento a tablespace ou aumento a undo_retention?

Vou lhes mostrar uma query que vai lhe indicar o caminho correto a tomar.


set lines 156
set pages 30
column UNXPSTEALCNT heading "# UnexpiredStolen"
column EXPSTEALCNT heading "# ExpiredReused"
column SSOLDERRCNT heading "ORA-1555Error"
column NOSPACEERRCNT heading "Out-Of-spaceError"
column MAXQUERYLEN heading "Max QueryLength"

select inst_id,
to_char(begin_time, 'MM/DD/YYYY HH24:MI') begin_time,
UNXPSTEALCNT,
EXPSTEALCNT,
SSOLDERRCNT,
NOSPACEERRCNT,
MAXQUERYLEN
from gv$undostat
where begin_time between
to_date('07/28/2008 10:00', 'MM/DD/YYYY HH24:MI:SS') and
to_date('07/28/2008 14:30', 'MM/DD/YYYY HH24:MI:SS')
order by inst_id, begin_time;


Você tem de avaliar com atenção nas colunas:
# Expired|Reused
# UnexpiredStolen

As outras colunas podem lhe dar uma ajuda tbm.
Para isso favor verificar o doc id: 389554.1 ele poderá mostrar a você o resultado completo, o que infelizmente este editor não permite que eu faça.


# Expired|Reused: Indica falta de tempo para garantir toda a query, aumentar o tempo de retenção da UNDO_retention.
# UnexpiredStolen: Tamanho da undo pequeno, Aumentar o tamanho da UNDO.

OBS: o parametro de UNDO, undo_retention pode ser alterado dinamicamente não sendo necessário o restart do banco, segue abaixo.
alter system set undo_retention='valor desejado em segundos' scope=both;

Ainda se perde com os comandos do SRVCTL?

Segue abaixo alguns comandos que podem lhe ajudar com as sintaxes de start de ambientes em RAC.




Espero ter ajudado.



terça-feira, 14 de julho de 2009

Que tipo de DBA é você?

Bom me fizeram esta pergunta hoje e eu respondi!
Bom eu sou o DBA "moda foka"!
É meio que uma expressão minha. Mas não sabia que alguém havia criado classes de DBA´s.

Sou obrigado a concordar com o que o Rodrigo passou sobre esta função.

Gostaria apenas de defender um pouco mais "Tipo que sou de DBA".

Ao ler o artigo. Defino-me como DBA Google.

Pelo simples fato que falta experiência para me denominar outro tipo de DBA.
Trabalho em uma empresa de Consultoria em TI e provavelmente com muito estudo me tornarei um DBA de infra ou de projetos, logicamente se eu quiser seguir estes passos.

Acho que poderia ter uma classe para DBA´s com pouca experiência.

Achei muito interessante este artigo segue abaixo o link para que vocês possam ler e tirar suas conclusões.
Artigo Rodrigo Almeida

quinta-feira, 9 de julho de 2009

Gerenciando Objetos de Usuários II

Dia 4/06/2009 postei alguns scripts para gerenciar objetos de usuários.
Como mover de uma tablespace para outra etc...

Existia uma duvida em minha cabeça.
Será que o oracle 10G ainda não havia um modo de mover os campos LOB para outro local sem ser pelo famoso EXPDP?
Bom Pesquisando um pouco no metalink e no santo google da vida encontrei alguns procedimentos bem úteis.
Porem fiquei com a impressão de que não seria fácil.
No metalink eu encontrei o Doc ID: 386341.1, ele tem vários passos para efetuar a manutenção destes objetos.
Porem se você é contratado por uma empresa e você nunca nem olhou para os objetos daquela empresa você vai ficar na mão quanto a descobrir informações sobre o LOBSEGMENT.
então vou postar aqui alguns "passos" a mais que para quem não conhece a estrutura das tabelas possa se virar.


Este Select lhe mostrará quais os segmentos de lob estão na tablespace.
SELECT OWNER,SEGMENT_NAME,
SEGMENT_TYPE,TABLESPACE_NAME,BYTES/1024/1024
from dba_segments
where SEGMENT_TYPE='LOBSEGMENT'
and TABLESPACE_NAME='<>';

Pegando o nome do segmento vc inclui no select abaixo para descobrir qual tabela e qual coluna tem o campo lob.
SELECT TABLE_NAME,COLUMN_NAME,
SEGMENT_NAME,INDEX_NAME
FROM DBA_LOBS
WHERE SEGMENT_NAME='<>';


Após receber os dados deste dois select é só você alterar a tabela com o campo lob.

ALTER TABLE <>
MOVE LOB( <>) STORE AS (
TABLESPACE <> )
/

exemplo.

SQL> CREATE TABLE LANA_LOB (
id NUMBER
, xml_file CLOB
, image BLOB
);

Tabela criada.

SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,
TABLESPACE_NAME,BYTES/1024/1024
from dba_segments
where SEGMENT_TYPE='LOBSEGMENT'
and TABLESPACE_NAME='LANA';

OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES/1024/1024
------------- ---------------------------- ------------------ ------------------ ----------------
LANA SYS_LOB0000016287C00003$$ LOBSEGMENT LANA ,0625
LANA SYS_LOB0000016287C00002$$ LOBSEGMENT LANA ,0625
LANA SYS_LOB0000016282C00003$$ LOBSEGMENT LANA ,0625
LANA SYS_LOB0000016282C00002$$ LOBSEGMENT LANA ,0625



SQL> SELECT TABLE_NAME,COLUMN_NAME,
SEGMENT_NAME,INDEX_NAME
FROM DBA_LOBS
WHERE SEGMENT_NAME='SYS_LOB0000016287C00003$$';

TABLE_NAME COLUMN_NAME SEGMENT_NAME INDEX_NAME
------------- -------------- ------------------------------ ------------------------------
LANA_LOB IMAGE SYS_LOB0000016287C00003$$ SYS_IL0000016287C00003$$

SQL> CREATE TABLESPACE LANA_LOB
DATAFILE '/u01/app/oracle/oradata/lana/lana_LOB.DBF'
size 50m autoextend on next 50m maxsize 500m;

Tablespace criado.

SQL> ALTER TABLE LANA_LOB
MOVE LOB(image) STORE AS (
TABLESPACE LANA_LOB )
/

Tabela alterada.

SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,
TABLESPACE_NAME,BYTES/1024/1024
from dba_segments
where SEGMENT_TYPE='LOBSEGMENT'
and TABLESPACE_NAME='LANA';

OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES/1024/1024
--------- ----------------------------- ------------------ ------------------ ---------------
LANA SYS_LOB0000016287C00002$$ LOBSEGMENT LANA ,0625
LANA SYS_LOB0000016282C00003$$ LOBSEGMENT LANA ,0625
LANA SYS_LOB0000016282C00002$$ LOBSEGMENT LANA ,0625

SQL> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,
TABLESPACE_NAME,BYTES/1024/1024
from dba_segments
where SEGMENT_TYPE='LOBSEGMENT'
and TABLESPACE_NAME='LANA_LOB';

OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME BYTES/1024/1024
---------- ----------------------------- ------------------ ------------------ ----------------
LANA SYS_LOB0000016287C00003$$ LOBSEGMENT LANA_LOB ,0625

SQL>