Scripts Úteis Para o Dia a Dia no Oracle (CANIVETE SUIÇO)

20 02 2009

Ola Galera,

Bom pra quem é dba sabe que não se vive sem aqueles scripts que nos auxiliam no dia a dia, afinal não é todo mundo que tem toad ou alguma ferramenta gráfica por perto ou mesmo homologado pela empresa.

Então .. La vai um pequeno canivete suíço para lidar com o oracle.

VARIAVEIS DE AMBIENTE

CONN SYSTEM@INSTANCIA
SPOOL C:\LOGS

SET ECHO ON
SET TIMING ON
SET LINES 1000
SET SQLBL ON

ALTER SESSION SET NLS_DATE_FORMAT = ‘DD/MM/YYYY HH24:MI:SS’;
SELECT SYSDATE FROM DUAL;
SHOW USER

– VERIFICA INSTANCIA

SELECT * FROM GLOBAL_NAME;

DUMP

– VERIFICAR QUAIS SÃO OS USUÁRIOS DO SISTEMA

SELECT USERNAME FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;

– CONTA OBJETOS DO SCHEMA

SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OWNER LIKE ‘USER%
GROUP BY OBJECT_TYPE;
SPOOL OFF

– NO TERMINAL LINUX

$export ORACLE_SID=INSTANCE

$exp system@INSTANCE BUFFER=1000000 FILE=EXP_INSTANCE_USER_DATA.DMP LOG=EXP_INSTANCE_USER_DATA.LOG OWNER=USUÁRIOS LISTADOS CONSISTENT=Y

gzip EXP_INSTANCE_USER_DATA*

DESATIVAÇÃO DE UM SCHEMA

– VERIFICAR SE TEM ALGUM USUÁRIO USANDO O SISTEMA

SELECT SADDR, SID, USERNAME, LOGON_TIME, STATUS, OSUSER, MACHINE, PROGRAM
FROM V$SESSION
WHERE USERNAME LIKE ‘USER%‘;

– VERIFICAR QUAIS SÃO OS USUÁRIOS DO SISTEMA

SELECT USERNAME FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;

– VERIFICA ATRIBUTOS DO USUÁRIO

SELECT * FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;
SELECT * FROM DBA_TAB_PRIVS
WHERE GRANTOR LIKE ‘USER%‘;

– VERIFICA PREVILEGIOS DO USUÁRIO

SELECT * FROM DBA_SYS_PRIVS
WHERE GRANTEE LIKE ‘USER%‘;
SELECT * FROM DBA_ROLE_PRIVS
WHERE GRANTEE LIKE ‘USER%‘;

– CONTA OBJETOS DO SCHEMA

SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OWNER LIKE LIKE ‘USER%
GROUP BY OBJECT_TYPE;

– DESATIVA USUÁRIO

ALTER USER USER ACCOUNT LOCK;
ALTER USER USER PASSWORD EXPIRE;

– VERIFICA STATUS DA CONTA

SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%’;
SPOOL OFF

DESATIVAÇÃO DE UMA INSTANCIA

– VERIFICAR SE TEM ALGUM USUÁRIO USANDO O SISTEMA

SELECT SADDR, SID, USERNAME, LOGON_TIME, STATUS,
OSUSER, MACHINE, PROGRAM
FROM V$SESSION;

– VERIFICAR QUAIS SÃO OS USUÁRIOS DO SISTEMA

SELECT USERNAME FROM DBA_USERS ;

– VERIFICA ATRIBUTOS DO USUÁRIO

SELECT * FROM DBA_USERS;

SELECT * FROM DBA_TAB_PRIVS;

– VERIFICA PREVILEGIOS DO USUÁRIO

SELECT * FROM DBA_SYS_PRIVS;

– VERIFICA PREVILEGIOS DE ROLE

SELECT * FROM DBA_ROLE_PRIVS;

– CONTA OBJETOS DO SCHEMA

SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE
FROM DBA_OBJECTS
GROUP BY OBJECT_TYPE;

– NO TERMINAL

EXPORT ORACLE_SID=INSTANCE

SQLPLUS / AS SYSDBA

SQL> SHUTDOWN IMMEDIATE;

EXECUÇÃO DE SCRIPT

– VERIFICAR QUAIS SÃO OS USUÁRIOS DO SISTEMA

SELECT USERNAME FROM DBA_USERS
WHERE USERNAME
LIKE ‘USER%;

– VERIFICA SE O OBJETOS JÁ EXISTE

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE,
CREATED, LAST_DDL_TIME, STATUS
FROM ALL_OBJECTS
WHERE OWNER LIKE ‘USER%
AND OBJECT_NAME = ‘OBJECT_NAME’;

– CONTA OBJETOS DO SCHEMA

SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OWNER LIKE ‘USER%
GROUP BY OBJECT_TYPE;

– CONTA OBJETOS INVALIDOS

SELECT COUNT (*)
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;

– VERIFICA OBJETOS INVALIDOS

SELECT OBJECT_TYPE, OBJECT_NAME, STATUS
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;

– EXECUTA O SCRIPT

CONN USER@INSTANCE

@C:\CAMINHO\SCRIPT.SQL

CONN SYSTEM@INSTANCE

– VERIFICA SE O OBJETOS JÁ EXISTE

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE,
CREATED, LAST_DDL_TIME, STATUS
FROM ALL_OBJECTS
WHERE OWNER LIKE ‘USER%
AND OBJECT_NAME = ‘OBJECT_NAME’;
SELECT * FROM DBA_TAB_PRIVS
WHERE GRANTOR LIKE ‘USER%’;

– CONTA OBJETOS DO SCHEMA

SELECT COUNT(OBJECT_TYPE), OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OWNER LIKE ‘USER%
GROUP BY OBJECT_TYPE;

– CONTA OBJETOS INVALIDOS

SELECT COUNT (*)
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;

– VERIFICA OBJETOS INVALIDOS

SELECT OBJECT_TYPE, OBJECT_NAME, STATUS
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;

– GERA SCRIPTS DOS OBJETOS INVALIDOS

SELECT ‘ALTER’||’ ‘|| OBJECT_TYPE ||’ ‘||OWNER ||’.'|| OBJECT_NAME || ‘ COMPILE;’
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;

– VERIFICA OBJETOS INVALIDOS

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE STATUS=’INVALID’
AND OWNER LIKE ‘USER%‘;
SPOOL OFF

CRIACAO DE USUÁRIO

– VERIFICAR SE EXISTE ESSE USUÁRIO NO SISTEMA

SELECT USERNAME FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;

– CRIAR A TABLESPACE PARA O USUÁRIO

CREATE TABLESPACE INSTANCE_SCHEMA_01
DATAFILE ‘CAMINHO/INSTANCE_SCHEMA.DBF’ SIZE 64M
AUTOEXTEND ON NEXT 1M
SEGMENT SPACE MANAGEMENT AUTO;

– VERIFICA SE TEM ALGUMA ROLE PARA ESSE USUÁRIO

SELECT * FROM DBA_ROLES WHERE ROLE LIKE ‘%USER%‘;

SELECT * FROM DBA_SYS_PRIVS WHERE LIKE ‘%USER%‘;

SELECT * FROM DBA_TAB_PRIVS WHERE LIKE ‘%USER%‘;

– CRIAR O USUÁRIO

CREATE USER USER
IDENTIFIED BY ‘SENHA
DEFAULT TABLESPACE INSTANCE_SCHEMA_01
TEMPORARY TABLESPACE TEMP;

– APLICA GRANT

GRANT RESOURCE, CONNECT TO USER;

– VERIFICAR SE O USUÁRIO FOI CRIADO

SELECT * FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;

– VERIFICA ROLES DO USUARIO CRIADO

SELECT * FROM DBA_SYS_PRIVS
WHERE GRANTEE LIKE ‘USER%‘;
SELECT * FROM DBA_ROLE_PRIVS
WHERE GRANTEE LIKE ‘USER%‘;

ALTERAR SENHA

– VERIFICAR OS USUÁRIOS DO SISTEMA

SELECT * FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;

– ALTERA A SENHA

ALTER USER USER IDENTIFIED BY ‘SENHA‘;

– VERIFICAR OS USUÁRIOS DO SISTEMA

SELECT * FROM DBA_USERS
WHERE USERNAME LIKE ‘USER%‘;
SPOOL OFF

E era isso ai pessoal, espero que seja útil !!
Se alguém tiver mais algum script bacana só postar lá nos comentários !!

Abraços
Kenia Milene





Procedimento de Instalação do Oracle 9i (9.2.0.7.0) no Red Hat Linux Enterprise AS4

28 10 2008

Pois é minha gente …. já estamos no 11G mas temos muitas bases de produção em 9i, e o que fazemos em um caso de crash do servidor onde temos que reinstalar sistema operacional, banco .. TUDO !!!!!!
Como diria o poeta Carlos Drummond de Andrade:

“ E agora, José?

A festa acabou,

a luz apagou,

o povo sumiu,

a noite esfriou,

e agora, José?

e agora, Você? …”

Agora amiguinho senta la na frente do servidor e mão na massa !!!!

Bom .. o Marcos Camargo – DBA Oracle me enviou um procedimento de instalação do Oracle 9i no Red Hat Enterprise (Case dele) que acho bacana publicar, afinal …. pode ser útil !!!!

01. Instalar o RedHat AS4 no servidor

Configuração de Hardware:

- ITAUTEC 1140S
- P4 2.8 (Ghz 200 x 14.0)
– RAM 512 MB
- BIOS 925 x/XENEO w705311cv1.7b

Verificar qual o tipo de Sistema Operacional

# uname –a
# rpm -qa –queryformat “%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n” | sort

02. Instalar os Componentes de SO Requeridos

Verificar a “Nota 303859.1 – Requirements for Installing Oracle 9iR2 on RHEL 4″

2.1. Minimum Software Requirement

Componentes de SO requeridos

- compat-db-4.1.25-9
- compat-gcc-32-3.2.3-47.3

- compat-gcc-32-c++-3.2.3-47.3

- compat-oracle-rhel4-1.0-3

- compat-libcwait-2.0-1
- compat-libgcc-296-2.96-132.7.2

- compat-libstdc++-296-2.96-132.7.2

- compat-libstdc++-33-3.2.3-47.3
- gcc-3.4.3-9.EL4
- gcc-c++-3.4.3-9.EL4

- gnome-libs-1.4.1.2.90-44
- gnome-libs-devel-1.4.1.2.90-44
- libaio-devel-0.3.102-1

- libaio-0.3.102-1

- make-3.80-5

- openmotif21-2.1.30-11

- xorg-x11-deprecated-libs-devel-6.8.1-23.EL
- xorg-x11-deprecated-libs-6.8.1-23.EL

Baixar o “Patch 4198954 – COMPATIBILITY PACKAGES FOR ORACLE ON RHEL 4″

- Descompactar e executar:

# unzip p4198954_40_LINUX.zip
# rpm -ihv compat-oracle-rhel4-1.0-5.i386.rpm
# rpm -ihv compat-libcwait-2.1-1.i386.rpm

Depois de instalar o Patch 4198954, alguns erros podem ocorrer no Shutdown e Startup do servidor.

2.2. Environment

Variável de configuração requerida

# export LD_ASSUME_KERNEL=2.4.19(.bash_profile do oracle)

Verificar os parâmetros dos semáforos
# cat /etc/sysctl.conf

Alterar as configurações do kernel em /etc/sysctl.conf

#nome do host completo !!
kernel.hostname = yourhost.yourdomain.com

#nome correto do domínio !!
kernel.domainname = yourdomain

fs.file-max = 327679

Semáforos requeridos do kernel:

# echo 100 > semmni
# echo 256 > semmns
# echo 100 > semopm
# echo 100 > semmsl
# echo 100 > shmmni
# echo 2097152 > shmall
# echo 2147483648 > shmmax

Para ativar as novas configurações

# sysctl -p

O comando deve mostrar o nome do host completo

# hostname
hostname.domainname

Os seguintes ajustes do ambiente são requeridos para o usuário do Unix que executa a instalação (por exemplo oracle)

# umask
0022

# echo $LD_ASSUME_KERNEL
2.4.19

Se algum pacote de Java estiver instalado no sistema, desconfigure todas as variáveis de ambiente de Java (por exemplo JAVA_HOME).

O usuário do Unix que executa a instalação (por exemplo oracle) não deve mandar o Oracle instalar as variáveis relacionadas ajustadas pelo defeito. Por exemplo, ajustando ORACLE_HOME, o PATH, LD_LIBRARY_PATH para incluir binários do Oracle em .profile , .bash_profile , .log na lima e /etc/profile.d devem completamente ser evitados.

Mover a biblioteca e alterar o path

# mv /usr/lib/libcwait.so /lib/libcwait.so

# cat /etc/ld.so.preload
/usr/lib/libcwait.so (*** Alterar esta linha para /lib/libcwait.so )

# vi /etc/ld.so.preload

Depois da alteração, o arquivo deverá mostrar:

# cat /etc/ld.so.preload
/lib/libcwait.so

Adicionar os parametros de semáforos

# cd /proc/sys/kernel

echo 100 32000 100 100 > sem
echo 2147483648 > shmmax
echo 4096 > shmmni
echo 2097152 > shmall
echo 65536 > /proc/sys/fs/file-max

ulimit -n 65536

echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range

ulimit -u 16384

Executar o comando para ativar estas novas configurações

# sysctl -p

03. Criar diretórios

# mkdir /ora9i

04. Copiar as mídias para o diretório

# cp /media/cdrom/ship_9204_linux_disk1.cpio.gz /ora9i/
# cp /media/cdrom/ship_9204_linux_disk2.cpio.gz /ora9i/
# cp /media/cdrom/ship_9204_linux_disk3.cpio.gz /ora9i/

05. Criar os usuários e grupos necessários para instalação e administração do Banco

# groupadd dba
# groupadd oinstall
# groupadd oper
# useradd -c DBA -g oinstall -G dba oracle

Isto irá criar o user “oracle” com o grupo primário “oinstall” e secundário “dba”

06. Criar os diretórios do Oracle para instalação

# mkdir /u01 /u02
# chown oracle.dba /u01 /u02
# chmod 755 /u01 /u02

07. Criar uma senha para o usuário “oracle”

# passwd oracle

New UNIX password:
Retype new UNIX password:

08. Criar as variáveis de ambiente para o user oracle

# su – oracle

$ pwd
/home/oracle

$ ls –la

Editar .bash_profile e incluir as seguintes abaixo

$ vi .bash_profile
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/9.2.0.7.0

*** muda conforme o banco a ser criado ***
ORACLE_SID=prd

PATH=$PATH:$ORACLE_HOME/bin
LD_ASSUME_KERNEL=2.4.19
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/bin:$ORACLE_HOME/network/lib

export PATH ORACLE_BASE ORACLE_HOME ORACLE_SID
export LD_LIBRARY_PATH LD_ASSUME_KERNEL

09. Alterar o owner/grupo Recursivamente dos diretórios

# chown -R oracle.oinstall /ora9i
# chown -R oracle.oinstall /Download_Oracle9i

10. As Mídias

Descompactar as mídias em /ora9i como usuário oracle

$ gunzip ship_9204_linux_disk1.cpio.gz
$ gunzip ship_9204_linux_disk2.cpio.gz
$ gunzip ship_9204_linux_disk3.cpio.gz

queimar as mídias

$ cpio -idmv < ship_9204_linux_disk1.cpio
$ cpio -idmv < ship_9204_linux_disk2.cpio
$ cpio -idmv < ship_9204_linux_disk3.cpio

11. Executar a instalação com Oracle Universal Installer

** DESATIVE A TECLA NUM LOCK, SENÃO A INSTALAÇÃO FICA TRAVADA !!! ***
Essa foi uma indicação do suporte da Oracle !!!

** Por problemas causados pelo o dicionário de dados Oracle, o export/import não funciona corretamente. Deve-se instalar, atualizar e depois criar os bancos desejados. ***

$ cd /ora9i/Disk1
$ ll

$ ./runInstaller

Quando for solicitado, abrir outra janela e logar com root.

$ su – root
login:

Como root:

# cd /u01/app/oracle/product/9.2.0.7.0
# ./root.sh

12. Aplicar o patchset 9.2.0.7

$ mkdir /ora9i/patch_set_9207

Copiar do CD01 o arquivo p4163445_9207_LINUX.zip

$ cd /ora9i/patch_set_9207
$ unzip p4163445_9207_LINUX.zip
$ cd disk1

Selecionar o OraHome

$ ./runInstaller

Executar numa janela em separado

$ root.sh

13. Dicas úteis

* character set.: WE8ISO8859P1

* diretório_base: /u01/app/oracle/product/9.2.0.7.0

* grupo unix….: oinstall

* database file.: /u01/app/oracle/oradata

* ativar console:

$ cd $ORACLE_HOME/bin
$ oemapp console

* Verificar a configuração do listener.ora

* para ativar/desativar via dbstart/dbshut

* Comentar no sqlnet.ora

### SQLNET.AUTHENTICATION_SERVICES= (NTS) ### SR.6242748.993 – 08/04/2007 ###

É é isso ai pessoal ..

Marcos, Obrigado por contribuir com o Blog, e as duvidas que o pessoal postar fique a vontade pra responder !!!!

Kenia Milene





Backup Oracle com Recovery Manager (RMAN)

21 10 2007

Bom um assunto bastante delicado é backup …
Qualquer DBA que se preze faz backup né minha gente …..
Existem algumas formas de backup, como dump por exemplo, mas nesse caso vou falar um pouco do RMAN acho que pode ajudar galerinha ai ….

Bem antes de tudo é necessário colocar o banco em archivelog, senão nada acontece !!!!:

1 – Baixe o banco
shutdown immediate

2 – Suba o banco em mount
startup mount

3 – Ative o arquive log
Alter database archivelog;

4 – Suba o Banco
Alter database open;

5 – Verifique o status com:
archive log list

Agora o próximo passo é criar o catalogo. O catalogo é uma espécie de índice que vai armazenar as informações dos backup executados

6 – Inicie o serviço do banco como sys e crie o usuário RMAN. Esse é o usuário utilizado para o gerenciamento do backup.
sqlplus “sys/oracle@BANCO as sysdba”
create user rman identified by rman;
alter user rman default tablespace sysaux temporary tablespace temp;
alter user rman quota unlimited on sysaux;
grant connect, resource, recovery_catalog_owner to rman;

7 – É necessário também criar o schema CATALOG para armazenar o catalogo. No prompt:
rman catalog rman/rman@BANCO
create catalog tablespace sysaux;
exit;

8 – O próximo passo é registrar o banco no catalogo ja criado
rman catalog rman/rman@BANCO target sys/oracle@BANCO
register database;
exit;

9 – Conecte no catalogo para dar andamento nos outros procedimentos. No prompt ….
rman target sys/oracle@BANCO
connect catalog rman/rman@BANCO

10 – O próximo passo é configurar o paralelismo, ou seja, em quantos discos será gerado o backup (nesse caso 4 discos).
Report schema;
Configure device type disk parallelism 4;

10 – Na cópia indique o caminho onde serão gerados os discos, e o nome de cada um. (Lembrando que o diretório deve existir)
copy
datafile 1 TO ‘u01/oracle/product/10.2.0/rman/DISK1.DBF’,
datafile 2 TO ‘
u01/oracle/product/10.2.0/rman/DISK2.DBF’,
datafile 3 TO ‘
u01/oracle/product/10.2.0/rman/DISK3.DBF’,
datafile 4 TO ‘
u01/oracle/product/10.2.0/rman/DISK4.DBF’;

10 – Verifique se a cópia foi executada com sucesso
List copy;
Exit;

Espero que possa ajudar
Kenia Milene





Recuperar Tablespace no Oracle

15 10 2007

Outro dia ai eu postei como recuperar controfile.
Mas pode acontecer de termos problemas com a tablespace também.
Sendo assim segue como recuperar uma tablespace ….

1 – Tirar a supervisao da tablespaces

alter tablespace users offline

2 – Copie a tablespace do backup para a oradata

3 – Faça a recuperacao da tablespace logicamente

recover tablespace users

vai ser sugerido o o proximo arquive log de onde ele parou apartir do controfile.

4 – Coloque a tablespace no ar novamente.

alter tablespace users online;

5 – Faca um count para conferencia

select count(*) from scott.x;

Espero que seja útil

Kenia Milene





Export de Alguns Registros de Uma Tabela Oracle

11 10 2007

Essa é muito boa … e útil …

Imagina que você tenha aquela tabelinha bem pequena de uns 24 milhões de registros e ai eis que aquele ser iluminado pede o seguinte:

Preciso que seja exportado SOMENTE OS REGISTROS DE MAI/2007 e que seja importado em outra tabela …

Aeeeeee agora eu quero ver … exportar somente X quantidade de registros de uma tabela????

Isso pode ser feito de 2 formas:

1 – Chama o Chuck Norris e pede pra ele olhar feio pra tabela e dizer: “Registros de mai/2007 já pra fora !!!!!”

2 – Se não funcionar você pode usar o comando export com uma clausula WHERE.

[oracle@host ~]$ export user/senha@banco contraints=y indexes=y
grants=y tables=’oracle.grandetabela’ query=”WHERE dat LIKE “mai/2007”” file=export.dmp

Essa salvou o dia hein !!!!

Kenia Milene





Recuperar Controfile no Oracle

7 10 2007

Esse post é dedicado a todo que já tiveram um controfile corrompido e suaram frio como eu …

Quando um controfile é perdido ou corrompido, para o desespero do peão não é possível subir o banco sem ele e você terá a triste visão do erro ORA-00205 error in identifying control file, check alert log for more info.

O que fazer ??? pedir ajuda ai RMAN e restaurar o backup????
Bem pode ser, mas existe uma outra maneira menos desastrosa do que restore

1 – Abra o arquivo de alerta no BDUMP, por exemplo do alert_dbauxlog

2 – Procure a linha que contenha controfile

‘C:\Oracle\Product\10.0.1\oradata\DNAUX\control01.CTL’
ORA-27041: Unable to open file

3 – Nesse caso o controfile problemático é o número 1, faça uma copia do 2 e renomeie para 1

4 – Suba o banco

Viu …. não doeu nada ….
Boa Sorte
Kenia Milene





Verificar Objetos Invalidos no Banco Oracle

4 10 2007

Imagina a cena:

Um ser iluminado de um desenvolvedor liga e pede que você crie e execute uma package no banco.através de um santo script.

Eis que depois da execução o cara cisma que N objetos ficaram inválidos. E agora ??? como provar que estava inválidos antes do procedimento????

Eis que uma amiga minha uma heroína chamada Vilma Moreira tinha um script para evitar esse tipo de problema, ele verifica objetos inválidos no banco.

spool y:\execute\OBJETOS_INVALIDOS_ANTES.lst
set head off echo off feed off array 2
select ‘Global Name : ‘||global_name
from global_name
union
select ‘SysDate : ‘||to_char(sysdate, ‘Month dd, yyyy’)
from dual
union
select ‘SysTime : ‘||to_char(sysdate, ‘hh24:mi:ss’)
from dual
union
select ‘Username : ‘||username
from user_users
/

set head on feed on pages 100 lines 120
select * from all_objects

where status <> ‘VALID’;

spool off

Execute esse script antes do procedimento que o desenvolvedor pediu, mude o nome para INVALIDOS_DEPOIS e execute novamente, ai então você pode comparar os objetos inválidos antes e depois.

Espero que seja útil como foi pra minha amiga Vilma (Amiga essa que me ajudou muito la na empresa). Obrigada por tudo viu Vilma.

Kenia Milene





Volumetria de Banco Oracle

25 09 2007

Uma bela tarde de sol se via da janela da empresa .. os passarinhos pipiuavam em seus ninhos tranquilamente e felizes quando derrepente toca o ramal:
”Boa Tarde, preciso da Volumetria do Banco de Produção pra ONTEM”

Tudo estava tão tranqüilo não é mesmo????

Bem … eu podia ter queimado a “muffa”, mas como o tempo era levemente curto, apelei para os amigos de trabalho. Eis que lá no 6º andar uma santa alma chamado Eduardo Tomazini tinha exatamente o que eu precisava…..

Obrigada a toda equipe da IBM …. aprendi muito com vocês !!!!!!

– Tamanho de Cada Tabela

SELECT owner, tablespace_name, segment_name,
round(sum(bytes/1024/1024),2) as Tamanho_MB –, extents as Num_extents
FROM dba_segments
WHERE owner = ‘SCOTT’
AND segment_type = ‘TABLE’
– AND segment_name like ‘DEPT%’
GROUP BY owner, tablespace_name, segment_name

– Tamanho das Tabelas Por Usuário

SELECT owner, round(sum(bytes/1024/1024),2) as Tamanho_MB –, extents as Num_extents
FROM dba_segments
GROUP BY owner

– Tamanho Total das Tabelas

SELECT round(sum(bytes/1024/1024),2) as Tamanho_MB –, extents as Num_extents
FROM dba_segments

– % de Uso das TableSpaces

SELECT a.TABLESPACE_NAME “TableSpace Name”,
round(a.BYTES/1024/1024) “MB Allocated”,
round((a.BYTES-nvl(b.BYTES, 0)) / 1024 / 1024) “MB Used”,
nvl(round(b.BYTES / 1024 / 1024), 0) “MB Free”,
round(((a.BYTES-nvl(b.BYTES, 0))/a.BYTES)*100,2) “Pct Used”,
round((1-((a.BYTES-nvl(b.BYTES,0))/a.BYTES))*100,2) “Pct Free”
FROM (SELECT TABLESPACE_NAME,
sum(BYTES) BYTES
FROM dba_data_files
GROUP BY TABLESPACE_NAME) a,
(SELECT TABLESPACE_NAME,
sum(BYTES) BYTES
FROM sys.dba_free_space
GROUP BY TABLESPACE_NAME) b
WHERE a.TABLESPACE_NAME = b.TABLESPACE_NAME (+)
ORDER BY ((a.BYTES-b.BYTES)/a.BYTES);

Kenia Milene





Clonar (Duplicar) Banco Oracle

20 09 2007

Imagina a seguinte situação…
Um ser iluminado empolgadíssimo liga no seu ramal e diz:

Preciso fazer uns testes no banco, rodar uns scripts …. POSSO ????”

Ai nesse momento você respira fundo, conta até 10, come um chocolatinho pra ficar feliz e pede educadamente (o educadamente é imprescindível !!!) pro ser iluminado te enviar os scripts só pra você ter uma ideia do tamanho do problema.

Bem nesse momento vc descobre que o cara quer fazer uns scan full somado a algumas coisas meios cabeludas e fedorentas naquenas tabelas que tem uma quantidade desesperadora de registros ….

OBS: Vamos imaginar que esse desenvolvedor não seja alguem experiente ok??? ele é mirim ainda …. mesmo porque um desenvolvedor experiente nunca faria um absurdo desses…

O que fazer??????

A – Da um tiro de bazuca na fuça do ser iluminado
Não é a melhor opção … não encontramos uma bazuca em qualquer lugar, a não ser que a sua gaveta seja bem comprida;

B – Faz um Tuning de Query
Isso é papo pra um outro post, mas é uma opção bem interesante e útil, que pode ajudar ao banco e ao desenvolvedor;

C – Clona o banco naquela maquina de testes que vc tem ai, e deixa o cara brincar, sem afetar a produção.
Hummm, vamos optar pela terceira opção, mesmo porque a gente monta o ambiente e deixa disponível pra testes ….

Bom, chega de histórias vamos ao que interessa, vamos entender que nosso banco de produção se chama produção e o clonado vai se chamar teste

1 – Crie a estrutura de diretórios OFA
oracle@server: /> cd /oracle/u01/app/oracle/admin/
oracle@server:/oracle/u01/app/oracle/admin> mkdir bdump cdump create pfile udump
oracle@server:/oracle/u01/app/oracle/admin/teste > ls
bdump cdump create pfile udump

2 – Copiar o init do banco e o arquivo de senhas (orapwd) que já esta em produção para o novo banco

oracle@server:/oracle/u01/app/oracle/admin> cd /oracle/u01/app/oracle/product/8.1.7/dbs
o
racle@server:/oracle/u01/app/oracle/product/8.1.7/dbs > cp initproducao.ora
initteste.ora
o
racle@server:/oracle/u01/app/oracle/product/8.1.7/dbs > cp orapwproducao
o
rapwteste
o
racle@server:/oracle/u01/app/oracle/product/8.1.7/dbs > ls
i
nit.ora initdw.ora initproducao.ora initteste.ora lkserver lkteste orapwserver orapwteste

3 – Alterara as configurações init para o novo banco
oracle@server:/oracle/u01/app/oracle/product/8.1.7/dbs >
vi initteste.ora
#_system_trig_enabled=false
db_name = teste
db_domain = seudominio.com.br
instance_name = teste
service_names = teste.seudominio.com.br
control_files =
(“/oracle/u01/oradata/teste/control01.ctl”,
“/oracle/u02/oradata/teste/control02.ctl”)
db_block_size = 8192
db_block_buffers = 20000
db_file_multiblock_read_count = 64
shared_pool_size = 10000000
large_pool_size = 86507520
java_pool_size = 20971520
log_checkpoint_interval = 10000
log_checkpoint_timeout = 0
processes = 440
open_cursors = 660

sort_area_size = 262144

rollback_segments = (R01, R02, R03, R04)
max_enabled_roles=100
log_buffer = 5242880
# log_buffer = 1048576
timed_statistics = true
# max_dump_file_size = 10000 # limit trace file size to 5M each
log_archive_start = true
log_archive_dest_1 = ‘LOCATION=/oracle/u01/arch/teste
#log_archive_dest_2 = ‘SERVICE=standby_server reopen=60′
log_archive_dest_state_1 = enable
#log_archive_dest_state_2 = enable
log_archive_format = teste_%s.arc
# oracle_trace_enable = true
background_dump_dest = /oracle/u01/app/oracle/admin/teste/bdump
core_dump_dest = /oracle/u01/app/oracle/admin/teste/cdump
user_dump_dest = /oracle/u01/app/oracle/admin/teste/udump
db_block_size = 8192
### MRCN ###remote_login_passwordfile = exclusive
remote_login_passwordfile = shared
job_queue_processes = 6
job_queue_interval = 60
distributed_transactions = 100
open_links = 6
compatible = “8.1.7.4″
# optimizer_features_enable = 8.1.7
utl_file_dir = *

5 – Baixar banco de produção que vai ser duplicado
oracle@server:/> echo $ORACLE_SID
oracle@server:/> producao

SQL> shutdown immediate
ORACLE instance shut down.
SQL> exit

6 – Crie um novo diretório no oradata (diretório dos arquivos de dados) com o nome do novo banco
oracle@server:/oracle/u01/oradata> mkdir teste
oracle@server:/oracle/u01/oradata> cd teste
oracle@server:/oracle/u01/oradata/teste>

7 – Fazer cópia de todos os arquivos de dados e redos
oracle@server:/oracle/u01/oradata/teste >
cp /oracle/u01/oradata/producao/* .
o
racle@server:/oracle/u02/oradata/teste >
cp /oracle/u02/oradata/producao/* .

8 – Remova os controfiles pois eles serão criados automaticamente
ora
cle@server:/oracle/u01/oradata/teste > rm – rf control01.ctl control02.ctl

9 – Exporte a variável ORACLE_SID com a nova instância
o
racle@server:/oracle/u01/app/oracle/admin/teste/>
export ORACLE_SID= teste
o
racle@server:/oracle/u01/app/oracle/admin/teste/>
echo $ORACLE_SID
t
este

10 – Prepare o arquivo que vai gerar o novo banco, como no exemplo abaixo
(
Não esqueça da permissão de execução)
o
racle@server:/> cd /oracle/u01/app/oracle/admin/teste/create
o
racle@server:/oracle/u01/app/oracle/admin/teste/create >
v
i teste.sql

STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE “TESTE” RESETLOGS
NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 2
MAXDATAFILES 240
MAXINSTANCES 1
MAXLOGHISTORY 113

LOGFILE
GROUP 1 (
‘/oracle/u01/oradata/teste/redo01a.dbf’,
‘/oracle/u02/oradata/teste/redo01b.dbf’
) SIZE 50M,

GROUP 2 (
‘/oracle/u01/oradata/teste/redo02a.dbf’,
‘/oracle/u02/oradata/teste/redo02b.dbf’
) SIZE 50M,

GROUP 3 (
‘/oracle/u01/oradata/teste/redo03a.dbf’,
‘/oracle/u02/oradata/teste/redo03b.dbf’
) SIZE 50M,

GROUP 4 (
‘/oracle/u01/oradata/teste/redo04a.dbf’,
‘/oracle/u02/oradata/teste/redo04b.dbf’
) SIZE 50M REUSE

DATAFILE
‘/oracle/u01/oradata/teste/system01.dbf’,
‘/oracle/u02/oradata/teste/table01.dbf’,
‘/oracle/u02/oradata/teste/table02.dbf’,
‘/oracle/u02/oradata/teste/table03.dbf’,
‘/oracle/u02/oradata/teste/table04.dbf’,
‘/oracle/u01/oradata/teste/indice01.dbf’,
‘/oracle/u01/oradata/teste/indice02.dbf’,
‘/oracle/u01/oradata/teste/indice03.dbf’,
‘/oracle/u01/oradata/teste/indice04.dbf’
‘/oracle/u01/oradata/teste/rbs01.dbf’,
‘/oracle/u02/oradata/teste/oem_repository01.dbf’ REUSE

CHARACTER SET WE8ISO8859P1;

11 – Logue no slqplus com : sqlplus “/ as sysdba” e execute o arquivo teste.sql para criar a nova base de dados
oracle@server:/oracle/u01/app/oracle> sqlplus “/ as sysdba”
SQL*Plus: Release 8.1.7.0.0 – Production on Tue Jul 24 17:04:08 2007
(c) Copyright 2000 Oracle Corporation. All rights reserved.

Connected to an idle instance.

SQL> @teste .sql
ORACLE instance started.
Total System Global Area 295825568 bytes
Fixed Size 73888 bytes
Variable Size 126660608 bytes
Database Buffers 163840000 bytes
Redo Buffers 5251072 bytes

Control file created.

12 – O conteúdo dos logs são descartáveis, para limpa-los use o comando abaixo

SQL> ALTER DATABASE OPEN RESETLOGS;Database altered.

13 – Adicione a tablespace temporária
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE
‘/oracle/u01/oradata/teste/temp01.dbf’ REUSE;

Tablespace altered.

14 – Pronto, agora só verifique o statis da instância criada
SQL> set linesize 10000
SQL> select instance_name,version,status,database_status from v$instance;

INSTANCE_NAME VERSION STATUS DATABASE_STATUS
—————- —————– ——- —————–
teste 8.1.7.4.0 OPEN ACTIVE

15 – Faça um teste de select na base
SQL> select nome from x.agencias
2 where codigo = 10;

NOME
——————–
CENTRO ADMINISTRATIV

É isso ai, sua base de testes esta prontinha, agora é só entregar para o desenvolvedor e voltar a tranquilidade.

Kenia Milene





Desabilitar Constraints no Oracle

14 09 2007

Sabe quando o desenvolvedor pede pra dar uma carga nas tabelas ??? e ai voçê tem que sair truncando tudo que é tabela ??? Pois é !!!

No caso do PostgreSQL (versões até 8.1.2) não é possivel desabilitar a constraint. É minha gente infelizmente tem que dropar a infeliz e recriar…

Poréééém no Oracle podemos desabilitar.

Agora eu pergunto: como saber todas as Fks das tabelas a serem truncadas ???? sai caçando uma por uma ?????

Nããão, é só rodar esse scriptizinho abaixo que ele retorna todas as FKs !!!

e depois ??? sai digitando desesperadamente TRUNCATE TABLE ??? também não, pra facilitar a vida já vai junto um scriptizinho que já gera os códigos para o truncate.

Exibe as Constraints:

SELECT constraint_name, constraint_type,status, owner
F
ROM dba_constraints
W
HERE OWNER = ‘ORACLE’
A
ND CONSTRAINT_TYPE = ‘R’
A
ND TABLE_NAME like ‘CAD_%’;

Gera código para desabilitar as constrainsts:

SELECT ‘ALTER TABLE’ || ‘ORACLE.’ || TABLE_NAME || ‘DISABLE CONSTRAINT’ || CONSTRAINT_NAME ||’;’
F
ROM dba_constraints
W
HERE owner = ‘ORACLE’
A
ND TABLE_NAME like ‘CAD_%’
A
ND CONSTRAINT_TYPE = ‘R’;


Até Outro Dia !!!
K
enia Milene