Páginas

domingo, 19 de janeiro de 2014

[Oracle] - Script par extrair DDL de tablespaces


Bom pessoal, segue abaixo script para geração de SQL para criação de tablespaces no Oracle:

set pagesize 0
set feedback off
set linesize 1000
spool cre_tbs.sql
select 'create tablespace ' || df.tablespace_name || chr(10)
|| ' datafile ''' || df.file_name || ''' size ' || df.bytes
|| decode(autoextensible,'N',null, chr(10) || ' autoextend on maxsize '
|| maxbytes)
|| chr(10)
|| 'default storage ( initial ' || initial_extent
|| decode (next_extent, null, null, ' next ' || next_extent )
|| ' minextents ' || min_extents
|| ' maxextents ' || decode(max_extents,'2147483645','unlimited',max_extents)
|| ') ;'
from dba_data_files df, dba_tablespaces t
where df.tablespace_name=t.tablespace_name;
spool off
set pagesize 20
set feedback on
set linesize 150

A consulta não é de minha autoria e o original pode ser encontrado em:
http://toolkit.rdbms-insight.com/gen_cre_ts.php

[Oracle] - Uso nls_language em funções SQL

Poucas pessoas sabem que boa parte das funções SQL do Oracle suportam sobrepor as configurações da sessão no que tange o NLS (national language support), abaixo exemplos da utilização dessa sintaxe:

TO_DATE ('1-JAN-99', 'DD-MON-YY', 'nls_date_language = American') 
TO_CHAR (hire_date, 'DD/MON/YYYY',  'nls_date_language = French')  
TO_NUMBER ('13.000,00', '99G999D99', 'nls_numeric_characters = '',.''')  
TO_CHAR (salary, '9G999D99L', 'nls_numeric_characters = '',.''
                               nls_currency = '' Dfl''') 
TO_CHAR (salary, '9G999D99C', 'nls_numeric_characters = ''.,''
                               nls_iso_currency = Japan') 
NLS_UPPER (last_name, 'nls_sort = Swiss')  
NLSSORT (last_name, 'nls_sort = German')

Fonte: http://download.oracle.com/docs/cd/B10500_01/server.920/a96529/ch7.htm
http://oraclemais.blogspot.com.br/2010/09/uso-nlslanguage-em-funcoes-sql.html 

[Oracle] - Habilitando autoextend para datafiles


O DBA hoje em dia não precisa mais se preocupar com o overhead causado pela extensão automática dos datafiles. Soluções como gerenciamento local das tablespaces e infraestrutura de hardware mais competentes absorvem quase que totalmente o impacto. Sendo assim, habilitar esse recurso ajuda a deixar a administração do banco mais fácil.
Ex.:
alter database datafile '+DATA/dr/datafile/users.264.708874247' autoextend on next 256M;

Nesse exemplo estou habilitado a extensão automática para o datafile (autoextend on) e estou informando de quantos em quantos megas eu quero que isso aconteça (next 256M).

Para habilitar para todos os datafiles:

spool runts.sql

select
'alter database datafile '||
file_name||
' '||
' autoextend on;'
from
dba_data_files;

@runts


Fonte:
http://oraclemais.blogspot.com.br/2010/06/oracle-autoextend-on.html

[Oracle] - FKs apontando para as PKs e UKs de uma tabela


As vezes acontece o erro abaixo quando tentamos truncar ou deletar todas as informações de uma tabela. Pare resolver é necessário identificar quais tabelas apontam para a tabela que eu quero truncar e precisamos desabilitar essas FKs.

Erro Oracle:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

1 - Identificando as FKs:

SELECT owner,
table_name,
constraint_name
FROM all_constraints ci
WHERE ci.constraint_type = 'R'
AND (ci.r_owner , ci.r_constraint_name) IN
(SELECT owner,
constraint_name
FROM all_constraints c
WHERE owner = '&dono'
AND table_name = '&tabela'
AND constraint_type IN ('P','U')
)

2 - Desabilite as constraints retornadas:

ALTER TABLE owner.tabela DISABLE CONSTRAINT nome_constraint;

3 - Execute o truncate das tabelas filhas e pai:

TRUNCATE TABLE owner.tabela_filha;
TRUNCATE TABLE owner.tabela_pai;


4 - Habilite as constraints retornadas:

ALTER TABLE owner.tabela ENABLE CONSTRAINT nome_constraint;

Fonte:
http://oraclemais.blogspot.com.br/2010/11/fks-apontando-para-as-pks-e-uks-de-uma.html

[Oracle] - Verificando o andamento do Job do datapump(expdp/impdp)


Para saber o andamento de um job do datapump faça o seguinte select:

SELECT job_name "Nome",
owner_name "Dono" ,
workers ,
job_mode "Modo" ,
dp.state "Status" ,
ROUND((sofar*100)/totalwork,2) "% Completado"
FROM gv$session_longops sl, gv$datapump_job dp
WHERE sl.opname = dp.job_name
AND sofar != totalwork

Fonte:
http://oraclemais.blogspot.com.br/2009/07/datapump.html

[Oracle] - Job para gerar estatísticas para um schema

No Oracle nós temos o otimizador baseado em regra, que é o mais antigo e hoje na versão 10g nem é mais suportado, eo o basedo em custo. Esse último necessita de estatísticas geradas nos objetos, pois é baseado nelas que ele gera os planos de execução e quanto mais atualizadas elas estiverem teoricamente melhor serão os planos de execução gerados.

O script abaixo cria um job usando a dbms_job que gera estatíticas para um schema todos os dias as 3 da manhã:

O script:

declare
   l_job number;
begin
   dbms_job.submit(
      l_job,
      'dbms_stats.gather_schema_stats( ''SCOTT'' );',
      trunc(sysdate)+1+3/24,
      'trunc(sysdate)+1+3/24' );
end;
/

Explicando o start time e o interval:

trunc(sysdate)
pega o dia atual a meia noite (00:00)
trunc(sysdate)+1
Adiciona um dia quer dizer amanhã meia noite
trunc(sysdate)+1+3/24
Adiciona 3 horas (3/24) o que quer dizer que o job vai rodar pela primeira vez amanhã as 03:00 e nos dias subsequentes nesse mesmo horário.

quinta-feira, 16 de janeiro de 2014

[PostgreSQL] - Consultando e eliminando sessões ativas


Bom pessoal vou mostrar como listar/matar as sessões ativas no PostgreSQL . O sql a seguir lista todas as sessões ativas.
   
select datname,
       procpid,
       usename,
       application_name,
       client_addr,
       client_hostname,
       backend_start
  from pg_stat_activity


Obs: A coluna procid foi renomeada para pid a partir da versão 9.2 do PostgreSQL

Com a lista de usuário em mãos, podemos optar por "matar" a sessão de algum usuário ativo, para isto basta executar o comando abaixo, substituindo o "procpid' pelo valor retornado da consulta anterior.
   
select pg_terminate_backend(procpid);

E para eliminar todas as conexões ativas, menos a conexão atual.
   
SELECT pg_terminate_backend(procpid)
   FROM pg_stat_activity
  WHERE procpid <> pg_backend_pid();


Fonte:
http://fabriciodev.blogspot.com.br/2012/03/consultando-e-eliminando-sessoes-ativas_20.html

sexta-feira, 10 de janeiro de 2014

[LINUX] - Expandindo o volume de uma partição no Grupo do LVM

No exemplo desse post, o servidor foi instalado com um disco de 15gb, porém o disco foi expandido para 60gb.  O disco utilizado é o ‘/dev/xvda’.  É possível que adicionando o disco a operação seja semelhante. 

Crie a partição disponível

# cfdisk /dev/xvda