Blog criado para ajudar profissionais a resolver problemas diversos com Banco de dados
terça-feira, 27 de outubro de 2009
Criando triggers 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
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
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
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
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
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
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?
terça-feira, 14 de julho de 2009
Que tipo de DBA é você?
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>