Curso de PL

É minha gente …. não teve jeito … tive que aprender PL.

Geralmente a codificação fica por conta do desenvolvedor, mas confesso que se o DBA tiver um bom conhecimento de PL, ele pode ajudar a otimizar as querys (conhecido como tuning de query).

Administrar somente a infra estrutura não é o suficiente para um bom DBA, é necessário conhecer o que esta sendo executado no banco.

Muitas vezes aquele select monstruoso pode se tonar um mini select onerando muito menos o Banco de Dados.

Ah !!! um conhecimento de como criar uma procedure que use uma biblioteca criada por voce em C, é o bicho hein !!!!

Poder criar uns pacotinhos que por exemplo execute comandos do shell, ou calculos mais complexos.

Executar comandos do shell pelo PL é muito útil quando se fala em LOG ou para obter algum tipo de informação específica sobre o Sistema Operacional.

O curso que ganhei da empresa la na DEXTRA foi de muita utilidade, aprendi muita coisa, mas o que mais gostei mesmo foi a criacao de pacotes com C e execuções de comando shell no pl.

Bem … meu cerebro ferveu pacas mas valeu a pena … o curso foi ministrado pelo Leonardo Cezar (monstro no desenvolvimento) que é mantenedor da lista de discussao PostgreSQL e trabalha ativamente para o Projeto.

É isso ai pessoal

Kenia Milene

Volumetria de Banco PostgreSQL

Tudo bem … já que fiz volumetria pro Oracle … segue a volumetria pro PostgreSQL !!!! (só pra não ficar com ciúmes).

O script do schema deu uma emperrada mas o Fabio Telles deu uma sugestão e a coisa saiu. Valeu Fabio !!!!

— Tamanho por tabela

SELECT n.nspname AS schemaname, c.relname AS tablename, C.reltuples::int AS Registros, pg_size_pretty(pg_relation_size(n.nspname ||’.’||c.relname)) as Tamanho
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
WHERE c.relkind = ‘r’::”char”
–AND n.nspname = ‘acc’
AND nspname NOT IN
(‘dbateste’,’information_schema’,’pg_catalog’,’pg_temp_1′,’pg_toast’,’postgres’,’publico’,’public’)
ORDER BY n.nspname

— Tamanho por schema

SELECT n.nspname, sum(c.reltuples)::int as Registros,
pg_size_pretty(pg_relation_size(n.nspname ||’.’||c.relname)) as Tamanho
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = ‘r’::”char”
AND nspname NOT IN
(‘dbateste’,’information_schema’,’pg_catalog’,’pg_temp_1′,
‘pg_toast’,’xmg’,’postgres’,’publico’,’public’)
GROUP BY n.nspname, c.relnamespace, c.relname

— Tamanho por TableSpace

SELECT spcname, pg_size_pretty(pg_tablespace_size (spcname))
FROM pg_tableSpace;

— Tamanho por Banco

SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database;

É Isso Ai !!!
Kenia Milene

Volumetria de Banco Oracle

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

Excluir (Deletar, Matar, Chutar, Explodir) Um Serviço do Windows

Essa vai ser de matar o peão ….

Um belo dia eu instalei o Oracle no meu notebook na partição windows pra teste e fiz o procedimento de criar toda a estrutura do banco na mão … inclusive o maldito serviço do Windows.

Eis que na hora em que eu fui criar o serviço estava passando uma cena bem interessante na TV … e o que aconteceu ??? criei o serviço com o nome errado.

E agora minha gente ??? alguém já teve a triste tarefa de excluir um serviço do Windows?????

Isso é um trabalho para o Super Homem???? Silvester Stallone ou Chuck Norris ?????

Depois de muito googlar … todo mundo mandando dar uma de Chuck Norris lançar logo uma voadora no register … eu achei uma maneira bem tosca estúpida e simples de fazer isso. Basta usar um comando bem simples para excluir o serviço:

sc delete service_name

Essa foi de matar hein !!!!

Kenia Milene

Oração do Administrador de Redes

DATA CENTER CHEIO DE LINK
GIGABITES CONVOSCO
BENDITO SOIS VOZ ENTRE OS 3COMS
BENDITO A ALTA DISPONIBILIDADE … DATACENTER
SANTO MONITORAMENTO DO DATACENTER MAE DO SUPORTE
ROGAI POR NOS ADMINITRADORES
ASSIM COMO NOS ADMINISTRAMOS NOSSAS MAQUINAS
E NAO NOS DEIXEI TRABALHAR DE MAGRUGADA
AGORA E NA HORA EM QUE ESTIVERMOS DORMINDO

AMEM

Kenia Milene

Clonar (Duplicar) Banco Oracle

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

DBA com Informações de Administrador de Redes

Bem, na maioria das empresas existe um DBA e um Sysadmin, cada um cuidando da sua parte.

Geralmente o DBA não tem senha de root nas maquinas e não tem acesso a N informações gerenciais do Sistema Operacional por ser um dever do Sysadmin.

Porém nós DBAs temos apenas os servidores de banco para cuidar, e os Sysadmins tem apenas TODOS os servidores para cuidar, seja ele qual for (Eu já fui Sysadmin, acredite .. a coisa é feia !!!).

Muitas vezes temos problemas de lentidão no banco ou alguma coisa que empaca no meio do caminho, ai perdemos um considerável tempo no banco procurando o motivo, quando na verdade pode ser falta de espaço em disco ou a memória que já foi … e da-lhe swap (que deixa o servidor mais lento).

Pois bem em alguns casos é mais dificil conseguir esse tipo de informação do Sysadmim, pois o volume de trabalho do mesmo não é pouco não é?

Para facilitar a vida, segue 2 scripts bem simples que nos envia por email uma mensagem com o espaçamento em disco e o consumo de memória. Com isso temos a informação que precisamos sem ter que depender do Sysadmin, basta colocar o script para se executado no cron e pronto !!!!!

espaco_disco.sh

#!/bin/bash
#Cria as variáveis com a informação de uma coluna específica
#do comando df (Exibe o espaço em disco), nesse caso a coluna
#contendo o nome da partição
pgbackup_desc=`df -h /dev/sda5 | tail -1 |awk ‘{print $6}’`
pgteste_desc=`df -h /dev/sda6 | tail -1 |awk ‘{print $6}’`
postgres_desc=`df -h /dev/sdb1 | tail -1 |awk ‘{print $6}’`

#Cria as variáveis com a informação de uma coluna específica
#do comando df, nesse caso a coluna contendo o espaço livre em
#MB da partição

pgbackup_livre=`df -h /dev/sda5 | tail -1 | awk ‘{print $4}’`
p
gteste_livre=`df -h /dev/sda6 | tail -1 | awk ‘{print $4}’`
p
ostgres_livre=`df -h /dev/sdb1 | tail -1 | awk ‘{print $4}’`

#Cria as variáveis com a informação de uma coluna específica
#do comando df, nesse caso a coluna contendo o espaço utilizado
#em % partição

pgbackup_porc=`df -h /dev/sda5 | tail -1 | awk ‘{print $5}’`
p
gteste_porc=`df -h /dev/sda6 | tail -1 | awk ‘{print $5}’`
p
ostgres_porc=`df -h /dev/sdb1 | tail -1 | awk ‘{print $5}’`

#Cria as variáveis com a informação de uma coluna específica
#do comando df, nesse caso a coluna contendo o espaço utilizado
# em MB

pgbackup_usado=`df -h /dev/sda5 | tail -1 | awk ‘{print $3}’`
p
gteste_usado=`df -h /dev/sda6 | tail -1 | awk ‘{print $3}’`
p
ostgres_usado=`df -h /dev/sdb1 | tail -1 | awk ‘{print $3}’`

tamanho_maximo=”80%”
host=`hostname`

#Se o valor do resultado da % usada for maior que o limite
#estipulado, é enviado um email notificando a situação crítica,
#com os valores dos tamanhos atuais

if [ $pgbackup_porc \> $tamanho_maximo ] ;
then
echo `date` > mail.txt
echo “Espaço na partição $pgbackup_desc no servidor $host está
crítico” >> mail.txt
echo “Permissão máxima de utilização = 80% ” >> mail.txt
echo “Espaço Utilizado = $pgbackup_porc ($pgbackup_usado) ” >>
mail.txt
echo “Espaço disponível = $pgbackup_livre” >> mail.txt

elif [ $pgteste_porc \> $tamanho_maximo ] ;
then
echo `date` > mail.txt
echo “Espaço na partição $pgteste_desc no servidor $host está
crítico” >> mail.txt
echo “Permissão máxima de utilização = 80% ” >> mail.txt
echo “Espaço Utilizado = $pgteste_porc ($pgteste_usado) ” >>
mail.txt
echo “Espaço disponível = $pgteste_livre” >> mail.txt

elif [ $postgres_porc \> $tamanho_maximo ] ;
t
hen
e
cho `date` > mail.txt
e
cho “Espaço na partição $postgres_desc no servidor $host está
crítico” >> mail.txt
e
cho “Permissão máxima de utilização = 80% ” >> mail.txt
e
cho “Espaço Utilizado = $postgres_porc ($postgres_usado) ” >>
mail.txt
e
cho “Espaço disponível = $postgres_livre” >> mail.txt
mail -s “ESPAÇO EM DISCO NO SERVIDOR $host ESTÁ CRÍTICO” dba@dominio.com.br < mail.txt

else

echo `date` > mail.txt
echo “O Espaço nas partições $pgbackup_desc, $pgteste_desc,
$postgres_desc no servidor $host estão OK” >> mail.txt
echo “Permissão máxima de utilização = 80% ” >> mail.txt
echo “Espaço Utilizado em $pgbackup_desc = $pgbackup_porc
($pgbackup_usado) ” >> mail.txt
echo “Espaço Utilizado em $pgteste_desc = $pgpgteste_porc
($pgteste_usado) ” >> mail.txt
echo “Espaço Utilizado em $postgres_desc = $postgres_porc
($postgres_usado) ” >> mail.txt
echo “Espaço disponível em $pgbackup_desc = $pgbackup_livre” >>
mail.txt
echo “Espaço disponível em $pgteste_desc = $pgteste_livre” >>
mail.txt
echo “Espaço disponível em $postgres_desc = $postgres_livre” >>
mail.txt

fi

ger_memoria.sh

#!/bin/bash
#Cria as variáveis com a informação de uma coluna específica
#do comando free (Exibe a memória ram usada e a memória SWAP)

free -m > memoria.txt
swap_usada=`awk ‘NR == 4 {print $3}’ memoria.txt`
swap_livre=`awk ‘NR == 4 {print $4}’ memoria.txt`
ram_usada=`awk ‘NR == 2 {print $3}’ memoria.txt`
ram_livre=`awk ‘NR == 2 {print $4}’ memoria.txt`
ram_total=`awk ‘NR == 2 {print $2}’ memoria.txt`
swap_total=`awk ‘NR == 4 {print $2}’ memoria.txt`
ram_minima=`expr $ram_total / 4`
ram_limite=`expr $ram_total – $ram_minima`

# Se a memória usada for maior que a estipulada, envia um email
# com os valores atuais
if [ $ram_usada \> $ram_limite ] ;
then
echo `date` > mail2.txt
echo “Uso da Memória Ultrapassou 75%” >> mail2.txt
echo “Permissão máxima de utilização = 75% ” >> mail2.txt
echo “Memória Total = $ram_total MB” >> mail2.txt
echo “Memória Utilizada = $ram_usada MB” >> mail2.txt
echo “Memória Livre = $ram_livre MB” >> mail2.txt
echo “Swap Usada = $swap_usada (Total da Swap = $swap_total MB)” >> mail2.txt
mail -s “USO DE MEMÓRIA ULTRAPASSOU 75%” dba@dominio.com.br <
mail2.txt

else
echo `date` > mail2.txt
echo “Uso da Memória OK” >> mail2.txt
echo “Permissão máxima de utilização = 75% ” >> mail2.txt
echo “Memória Total = $ram_total MB” >> mail2.txt
echo “Memória Utilizada = $ram_usada MB” >> mail2.txt
echo “Memória Livre = $ram_livre MB” >> mail2.txt
echo “Swap Usada = $swap_usada (Total da Swap = $swap_total
MB)” >> mail2.txt

fi

Espero que tenha ajudado!!
Kenia Milene

Contar Registros em Banco PostgreSQL

La vamos nós novamente …
H
oje me fizeram a seguinte pergunta.. :

QUANTOS REGISTROS NÓS TEMOS EM TODO O BANCO DE DADOS?”

Perguntinha difícil essa não???? pois bem, consegui depois de muito queimar a “muffa” fazer um script pra isso, e pra ajudar acabei criando mais outros com informações mais específicas:

Saber quantidade de registros no banco inteiro:
SELECT sum(C.reltuples)::int
FROM pg_class C
WHERE c.relkind = ‘r’::”char”

Saber quantidade de registros por tabela:
SELECT n.nspname AS schemaname, c.relname AS tablename, C.reltuples::int AS Registros
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
WHERE c.relkind = ‘r’::”char”
AND nspname NOT IN
(‘dbateste’,’information_schema’,’pg_catalog’,’pg_temp_1′,’pg_toast’,’postgres’,’publico’,’public’)
ORDER BY n.nspname

Saber quantidade de registros por schema:
S
ELECT n.nspname, sum(c.reltuples)::int
F
ROM pg_class c
L
EFT JOIN pg_namespace n ON n.oid = c.relnamespace
W
HERE c.relkind = ‘r’::”char”
A
ND nspname NOT IN
(‘dbateste’,’information_schema’,’pg_catalog’,’pg_temp_1′,’pg_toast’,’postgres’,’publico’,’public’)
G
ROUP BY n.nspname

Saber quantidade de registros de um determinado schema
SELECT n.nspname, sum(c.reltuples)::int
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = ‘r’::”char”
AND nspname = ‘aaa’
GROUP BY n.nspname

Até Mais
Kenia Milene

Desabilitar Constraints no Oracle

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

Funções Que Facilitam a Vida !!!!!

É minha gente tem certas coisas que são um saco nao é mesmo ????
C
omo por exemplo quando é necessário logar em algum servidor pelo SSH temos que escrever aquela looonga linha:

ssh -v -C servidor -l usuario

E se eu dissesse que é possivel logar com apenas uma palavra???
P
ara isso basta criar uma função no .bashrc para esse comando.
V
ejam um exemplo abaixo:

function server
{
ssh -v -C server -l usuario
}

Com isso basta digitar a palavra server que ele vai executar o ssh.
P
ara facilitar a vida ainda mais exporte as chaves para que nao seja necessário nem digitar a senha.
Como essa é possivel criar varios tipos de funções para facilitar a vida!!

Kenia Milene