Pesquisar este blog

domingo, 13 de dezembro de 2009

Artigo sobre Bloqueios no ORACLE

O artigo de Hudson Santos fala sobre concorrência e consistência de dados explicando como usar a view v$locked_object para saber quais sãos os objetos que estão bloqueados pelos usuários. Através desta visão é possível ao DBA saber, por exemplo, quais tabelas estão bloqueadas, identificar o usuário e a sessão que está bloqueando algum recurso, para que possa ser finalizada com um alter system kill session.


Como se sabe, o mecanismo de lock dos bancos de dados relacionais são utilizados para resolver problemas de integridade, consistência e concorrência de dados, fazendo com que as transações não consigam atualizar os mesmos dados ao mesmo tempo, ou seja, somente uma transação pode, em determinado momento alterar algum recurso, a outra transação terá de aguardar.

quarta-feira, 9 de dezembro de 2009

terça-feira, 8 de dezembro de 2009

10g - Obtendo os últimos 10 waits de uma sessão

Para obter uma lista dos últimos 10 waits que ocorreram para uma sessão específica
utilize a view v$session_wait_history.

Por exemplo:

EVENT                                  P1         P2         P3  WAIT_TIME WAIT_COUNT                                   
------------------------------ ---------- ---------- ---------- ---------- ----------                                   
reliable message                790947952  790944384  791577936          0          1                                   
db file sequential read                 1      15004          1          1          1                                   
db file sequential read                 1      13117          1          1          1                                   
db file sequential read                 1      14938          1          0          1                                   
db file sequential read                 1        879          1          1          1                                   
SQL*Net message to client      1111838976          1          0          0          1                                   
SQL*Net message from client    1111838976          1          0          0          1                                   
SQL*Net message to client      1111838976          1          0          0          1                                   
log file sync                        1805          0          0          0          1                                   
enq: RO - fast object reuse    1380909062      65554          1          1          1                                   

10 linhas selecionadas.

domingo, 29 de novembro de 2009

Como obter somente a data no ORACLE

Esta dica é para obter somente a parte da data em um campo do tipo timestamp ou date do ORACLE, pois o mesmo armazena a data e a hora juntos.

Em uma expressão SQL, na parte where podemos encontrar as seguintes situações:

Situação 1: Não é o que você quer!

where DATA_COMPRA = TRUNC(SYSDATE)

ou

Situação 2: Funciona mas não usa índice!

where TRUNC(DATA_COMPRA) = TRUNC(SYSDATE)

ou

Situação 3: A forma correta

DATA_COMPRA BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 1 - 1/24/60/60

Explicação:

As três situações vão executar sem erro do Oracle, mas a primeira pode não retornar todos os registros pois existe a parte da hora armazenado no campo, o que faz com que a comparação resulte em True somente para os campos exatamente iguais em data e hora.

A segunda situação impede que o ORACLE utilize índices para agilizar as pesquisas. Mesmo se um índice for criado na coluna DATA_COMPRA, o ORACLE não poderá utilizar.


OBS.: Existe um tipo de índice baseado em função que permite que o ORACLE utilize um índice, mas não é interessante sobrecarregar o ORACLE com este tipo de situação.


A terceira situação, é a única forma de realizar a consulta de forma rápida, pois o ORACLE vai conseguir utilizar um índice, se existir é claro. A metodologia consiste em verificar se a data está no período compreendido entre a meia noite até o último segundo do dia.

Trabalhando com Tablespaces

Excelente artigo que mostra comandos e sintaxes para trabalharmos com tablespaces pode ser acesso em Oracle Tablespaces

sábado, 28 de novembro de 2009

Verificar códigos de erro do ORACLE

http://www.ora-code.com/

Configurar Linux para o Oracle

http://www.puschitz.com/TuningLinuxForOracle.shtml

domingo, 22 de novembro de 2009

Rede Oracle Tips and Tricks

1. Configurei um alias no arquivo tnsnames.ora chamado notafiscal mas ao executar tnsping, ocorre o erro: TNS-12541: TNS:no listener. O que está errado ?

A configuração do sqlnet.ora deve ter no parâmetro NAMES.DIRECTORY_PATH a opção TNSNAMES e está opção deve vir antes de EZCONNECT.

NAMES.DIRECTORY_PATH= (TNSNAMES,EZCONNECT)

Obs.: No 11g, é importante que TNSNAMES venha antes de EZCONNECT pois caso contrário tnsping falha.

Recriando o Repositório do Enterprise Manager

Um excelente artigo de como recriar o repositório do Enterprise Manager pode ser encontrado em Recriando o Repositório do Enterprise Manager de Bruno Murassaki.

A recriação do Repositório do Enterprise Manager pode ser necessária para o caso de algum erro na instalação o impeça de funcionar corretamente.

Consultando erros do ORACLE

Para consultar erros do ORACLE consulte este link: http://www.ora-error.com

Pode ser consultado tanto via código como via texto da mensagem de erro.

quarta-feira, 28 de outubro de 2009

Lidando com valores NULL

Um campo com valor null no padrão SQL indica que o valor é desconhecido. Null é diferente de vazio ou zero e dois valores null são diferentes entre si. Ao comparar um valor null com outro valor também null ou ainda, comparar um valor null com outros valores conhecidos sempre dará um resultado desconhecido (Unknown) porque não podemos determinar o valor de cada campo.

Registros com valor nulo geralmente indicam ausência de valores ou que os valores serão informados futuramente.

Neste artigo mostraremos uma série de consultas SQL e o resultado obtido quando tuplas contém valores nulo.

Para nossos exemplos segue nosso esquema:

SQL> desc dept
Nome Nulo? Tipo
------------------------------------
DEPT_NO NUMBER(38)
NOME VARCHAR2(20)

SQL> desc func
Nome Nulo? Tipo
-------------------------------------------
FUNC_NO NUMBER(38)
NOME VARCHAR2(20)
DEPTNO NUMBER(38)
SAL NUMBER(12,2)

SQL> select * from dept;

DEPT_NO NOME
---------- --------------------
1 RH
2 COMERCIAL
3 INFORMATICA

SQL> select * from func;

FUNC_NO NOME DEPTNO SAL
---------- -------------------- ---------- ----------
1 JOAO 1 1000
2 MARIA 2 1000
3 ZE
4 LEO 3 1000



NULLS em expressões escalares


Como sabemos, qualquer expressão escalar envolvendo nulo retorna null como resultado. A query a seguir exemplifica o que ocorre ao realizar um aumento de salário de R$ 100,00 para todos os funcionários:


SQL> select func_no, nome, deptno, sal+100 from func;

FUNC_NO NOME DEPTNO SAL+100
---------- -------------------- ---------- ----------
1 JOAO 1 1100
2 MARIA 2 1100
3 ZE
4 LEO 3 1100


Conclusão: O servidor do banco de dados não pode somar 100 reais a null e por isso o resultado é nulo. Se quisermos realizar está consulta e aparecer um valor de salário para todos os funcionários podemos utilizar a função Ansi coalesce, que substitui o null por zero antes de realizar o cálculo matemático. Claro que, utilizar coalesce vai depender muito da regra de negócio em questão, pois você certamente não vai querer sair colocando coalesce em tudo que é SQL. Talvez uma solução mais correta neste exemplo é alterar o esquema da tabela func para não permitir nulo no salário, forçando assim ter um salário válido.

A query a seguir repete a mesma consulta, mas usando a função Ansi Coalesce:

SQL> select func_no, nome, deptno, coalesce(sal,0)+100 from func;

FUNC_NO NOME DEPTNO COALESCE(SAL,0)+100
---------- -------------------- ---------- -------------------
1 JOAO 1 1100
2 MARIA 2 1100
3 ZE 100
4 LEO 3 1100

Neste exemplo, o servidor do banco de dados fez o que queríamos. Usar a função coalesce é muito importante para evitar erros nas consultas SQL. O Oracle ainda possui várias outras funções para lidar com null: nvl, nvl2, nullif. Vale a pena dar uma olhada nestas funções. Existe também a expressão case que pode ser muito útil também.

quinta-feira, 10 de setembro de 2009

Usando FTP

FTP significa File Transfer Protocol (Protocolo de Transferência de Arquivos), e é uma forma bastante rápida e versátil de transferir arquivos (também conhecidos como ficheiros), sendo uma das mais usadas na internet.

Segue alguns comandos úteis do comando ftp para Windows:


1. Conectar a um servidor FTP

ftp ip_host

Parâmetros:

ip_host -> ip do servidor ou nome do host ao qual desejamos nos conectar

OBS.: Após digitar este comando será pedido o nome do usuário e senha.

Ex.: ftp ftp.polidados.com

2. Configurar a sessão ftp para transferêcia de dados em binário:

binary

OBS.: Ao entrar com este comando, você diz ao servidor ftp que os dados transferidos são dados binários e não texto.

3. Como navegar entre os diretórios do servidor ftp

cd nome_pasta

Parâmetros:

nome_pasta -> nome da pasta que queremos acessar

Ex.: cd download

4. Como listar todas as pastas do servidor

dir

OBS.: Este comando exibe todas as pastas de forma semelhante ao comando DIR do Microsoft DOS. Pode ser utilizado também o comando ls.

5. Como fazer o download de um arquivo do servidor FTP

get nome_arquivo

Parâmetros

nome_arquivo -> nome do arquivo que queremos fazer download.

ATENÇÂO: O nome do arquivo é case sensitive, pois os servidores FTP geralmente estão hospedados em sistemas UNIX, Linux, BSD, etc.

Ex.: get PoliGestor.exe

6. Como fazer o upload de um arquivivo para o servidor FTP

send nome_arquivo

Parâmetros

nome_arquivo -> nome do arquivo que queremos fazer download.

ATENÇÂO: O nome do arquivo é case sensitive, pois os servidores FTP geralmente estão hospedados em sistemas UNIX, Linux, BSD, etc.

7. Como excluir arquivos do servidor FTP

del nome_arquivo

Parâmetros

nome_arquivo -> nome do arquivo que queremos excluir.

ATENÇÂO: O nome do arquivo é case sensitive, pois os servidores FTP geralmente estão hospedados em sistemas UNIX, Linux, BSD, etc.

8. Como encessar a sessão FTP

bye


Existem mais comandos disponíveis, mas estes são os mais comuns. Para obter ajuda sobre outros comandos ftp, digite o comando help.

quarta-feira, 9 de setembro de 2009

Usando netstat

netstat (network statistic) é uma ferramenta muito útil para obter informações sobre conexões de rede, tabelas de roteamento e várias outras informações relacionadas com a rede.

Segue alguns comandos úteis do netstat versão Linux:

1. Obter todas as conexões TCP

netstat -ant

Parâmetros:
a -> obter todas as conexões
n -> não resolver nomes
t -> listar somente conexões TCP

2. Obter todas as conexões UDP

netstat -anu

Parâmetros:
a -> obter todas as conexões
n -> não resolver nomes
u -> listar somente conexões UDP


3. Obter todas as conexões TCP ou UDP

netstat -anut

Parâmetros:
a -> obter todas as conexões
n -> não resolver nomes
u -> listar conexões UDP
t -> listar conexões TCP

4. Obter somente as conexões (TCP ou UDP) com estado estabelecido (Conectado)

netstat -nut

Parâmetros:
n -> não resolver nomes
u -> listar conexões UDP
t -> listar conexões TCP

Obs.: Como não foi especificado a opção -a, somente as conexões que estão aberto foi exibido.

5. Listar a tabela de roteamento

netstat -r

Parâmetros:
r -> lista tabela de roteamento

Obs.: A tabela de roteamento pode ser exibida também com o comando route.

terça-feira, 25 de agosto de 2009

Configuração de Rede em Fedora e Ubuntu

Configurar uma rede de computador em Linux depende muito da distribuição sendo utilizada. Este artigo mostra como configurar a rede nas distribuições Fedora e Ubuntu. A distribuição Fedora é baseada na distribuição Red-Hat enquanto que Ubuntu em Debian, portanto, todas as demais distribuições que herdam destas duas terão basicamente, o mesmo procedimento de configuração.

Este artigo inicia com a configuração dos arquivos necessários para configuração da rede. Estes arquivos permitem que, ao iniciar o Linux, seja feita a configuração da rede automaticamente, sem precisar utilizar-se do comando ifconfig.


Configuração da Rede para Fedora através dos Arquivos de Configuração


Para configurarmos a rede no Fedora precisamos editar o arquivo ifcfg-eth0 na pasta /etc/sysconfig/network-scripts. Este arquivo contém toda configuração necessária como IP, Máscara de Rede, Endereço de Rede, Endereço de Broadcast, Endreço de Hardware (MAC), se a interface deve ser carregada ao iniciar o Linux, etc. Abaixo, segue um exemplo do arquivo ifcfg-eth0:

[root@localhost /]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
HWADDR=08:00:27:CF:05:A5
IPADDR=192.168.0.3
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes

Para cada dispositivo de rede disponível, pode existir um arquivo ifcfg-ethX, onde X representa uma a interface de rede específica (eth0, eth1, eth2, etc).

No Fedora, a configuração deste arquivo pode ser feita também através do utilitário system-config-network.

Configuração da Rede para Ubuntu através dos Arquivos de Configuração


No Ubuntu, o arquivo de configuração é encontrado em /etc/network/interfaces.

domingo, 23 de agosto de 2009

Flashback Database

Introdução


Flashback Database é um recurso disponível no ORACLE 10g que nos permite fazer um recover mas rápido do que o tradicional recovery. O Flashback Database utiliza-se de um log chamado Flashback database logs. O servidor ORACLE periodicamente, escreve before images dos arquivos de logs no Flashback database logs. Os blocos before images podem ser utilizados para voltar rapidamente as mudanças durante uma realização de Flashback.

Habilitando Flashback Database

Para habilitar o recurso de Flashback Database siga os seguintes passos:

  1. O banco deve estar em modo archive log. Utilize o seguinte comando
    para verificar se está em modo de arquivamento:
        
    SQL> archive log list


  2. Configure a área de recovery ajustando os parâmetros db_recovery_file_dest e db_recovery_file_dest_size:

    SQL> alter system set db_recovery_file_dest='/u1/flash_recovery_area/';
    SQL> alter system set db_recovery_file_dest_size=4G;


  3. Verifique se o banco de dados está com o Flashback Database habilitado consultando a visão de performance dinâmica v$database:

    SQL> select name, flashback_on from v$database;
    NAME FLASHBACK_ON
    ------------------
    XE NO

  4. Se não estiver, inicie o banco no estado MOUNT e habilite o Flashback Database com os comandos:

    SQL> startup mount
    SQL> alter database flashback on;


  5. Configure o tempo de retenção do flashback ajustando o parâmetro db_flashback_retention_target em minutos. O valor default é 1440 minutos, ou seja, 1 dia. O exemplo abaixo define a retenção para dois dias:

    SQL> show parameter db_flashback_retention_target

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    db_flashback_retention_target integer 1440

    SQL> alter system set db_flashback_retention_target=2880;

    Sistema alterado.

    SQL>

  6. Para desabilitar o Flashback Database:

    SQL> alter database flashback off;

terça-feira, 18 de agosto de 2009

ORACLE - RMAN Tips

1. Como faço para me conectar ao RMAN sem um recovery catalog ?

$ ORACLE_SID=XE; export ORACLE_SID;
$ rman target sys/oracle nocatalog

2. Como realizar backup completo do banco de dados ?

$ rman target sys/oracle nocatalog
RMAN> run {
2> backup database;
3> }

2.1 Como realizar backup completo do banco de dados incluindo archivelogs ?

$ rman target sys/oracle nocatalog
RMAN> run {
2> backup database plus archivelog;
3> }

3. Como executar os comandos do arquivo "backup_batch.bat" em modo Batch ?

$ rman target sys/oracle nocatalog @backup_batch.bat log backup.log

4. Como listar a configuração corrente do banco de dados alvo ?

RMAN> report schema;

5. Como listar quais arquivos necessitam de backup ?

RMAN> report need backup;

6. Como listar quais backups podem ser removidos (os backups obsoletos) ?

RMAN> report obsolete;

7. Como listar os arquivos que não foram recuperados por causa de operações não recuperáveis ?

RMAN> report unrecoverable;

8. Como faço para direcionar a saída do RMAN para um arquivo de log ao mesmo tempo que envio para saída padrão (console) ?

Utilize o comando Linux tee da seguinte forma:

$ ORACLE_SID=XE; export ORACLE_SID;
$ rman target / | tee ./log.txt

Neste exemplo será criado um arquivo de log no diretório corrente.

9. Como testar os scripts ou comandos no RMAN ?
Conecte ao RMAN usando o parâmetro checksyntax. Todos os comandos digitados serão apenas verificados quanto a erros e não serão realmente executados.

$ rman checksyntax

sexta-feira, 14 de agosto de 2009

ORACLE - Sessões Restritas

Muitas vezes precisamos tornar o acesso ao banco restrito somente para DBAs. Tornar o acesso restrito impede que novas sessões sejam criadas ao banco por usuários comuns mas permite novas sessões para administradores do banco.

Usuários que já estão acessando o banco não serão desconectados, quando o acesso restrito por habilitado, apenas novas sessões serão impedidas de ser criadas para os usuários comuns.

Abaixo segue algumas questões ao se trabalhar com sessões restritas.

1. Como saber se a instância está com login em modo restrito ?

select logins from v$instance;

2. Como habilitar sessões restritas ?

alter system enable restricted session;

3. Como desabilitar sessões restritas ?

alter system disable restricted session;

4. Como permitir o login a um usuário não DBA quando o acesso restrito está habilitado ?

Pode ser dado o privilégio de restricted session ao usuário.

5. Como abrir o banco de dados em modo restrito ?

startup restrict;

quinta-feira, 6 de agosto de 2009

Common Table Expressions - CTE

Common Table Expressions (CTE) são visões localmente definidas dentro de uma query que permitem a construção de selects incrivelmente complexos e úteis.

Sem este recurso, o trabalho para cria um relatório de referência cruzada, por exemplo, seria bastante trabalhoso. Felizmente muitos bancos de dados suportam o uso de CTE. CTE é parte do ANSI SQL-99 standard.

O exemplo exibido logo abaixo, é um SQL desenvolvido por mim, para um relatório de comissões de vendedores que mostra as comissões totalizadas para cada mês de um ano.

O exemplo faz parte do ERP PoliGestor - Gestão Empresarial da empresa POLIDADOS INFORMÁTICA TOTAL. O banco de dados utilizado foi o "Firebird 2.5".


/*
Lista comissões dos vendedores por mês

Autor: Everton de Vargas Agilar
Data: 06/08/2009

*/
with comissoes(idvendedor, mes, ano, vlr_vendas, valor_comissao)
as
(
select tbl.idvendedor,
extract(month from tbl.data) mes,
extract(year from tbl.data) ano,
sum(tbl.vlr_total) vlr_vendas,
sum(tbl.comissao_valor) comissao_venda
from orcamentos tbl
where tbl.filial = :filial and tbl.cancelado = 0 and
extract(year from tbl.data) = :ano
group by tbl.idvendedor, 2, 3
having sum(tbl.comissao_valor) > 0
)
select
id, nome_vendedor,
comissao_jan, comissao_fev,
comissao_mar, comissao_abr,
comissao_mai, comissao_jun,
comissao_jul, comissao_ago,
comissao_set, comissao_out,
comissao_nov, comissao_dez
from (
select
v.id,
v.nome nome_vendedor,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 1) as comissao_jan,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 2) as comissao_fev,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 3) as comissao_mar,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 4) as comissao_abr,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 5) as comissao_mai,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 6) as comissao_jun,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 7) as comissao_jul,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 8) as comissao_ago,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 9) as comissao_set,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 10) as comissao_out,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 11) as comissao_nov,
(select coalesce(c.valor_comissao, 0) from comissoes c
where c.idvendedor = v.id and c.mes = 12) as comissao_dez
from vendedores v
where v.filial = :filial
union all
select -1,
'Totais por mês ==>',
(select sum(c.valor_comissao) from comissoes c
where c.mes = 1) as comissao_jan,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 2) as comissao_fev,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 3) as comissao_mar,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 4) as comissao_abr,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 5) as comissao_mai,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 6) as comissao_jun,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 7) as comissao_jul,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 8) as comissao_ago,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 9) as comissao_set,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 10) as comissao_out,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 11) as comissao_nov,
(select sum(c.valor_comissao) from comissoes c
where c.mes = 12) as comissao_dez
from rdb$database
)
order by nome_vendedor nulls last;


Conclusão: Common Table Expressions (CTE) é um recurso que merece ser explorado, principalmente porque permite a construção de selects complexos e muito performático, se comparado a outras alternativas. O mesmo relatório poderia ser desenvolvido utilizando outras alternativas, como views, procedures armazenadas no banco ou mesmo desenvolvido usando uma linguagem de programação tradicional.

Sintáxe para o CTE:

WITH [RECURSIVE]
CTE_A [(a1, a2, …)]
AS ( SELECT … ),

CTE_B [(b1, b2, …)]
AS ( SELECT … ),
...
SELECT ...
FROM CTE_A, CTE_B, TAB1, TAB2 ...
WHERE ...

Links Úteis sobre ORACLE

  • Visões Dinâmicas do ORACLE

  • http://www.adp-gmbh.ch/ora/misc/dynamic_performance_views.html

  • Blog sobre Backup, RMAN e Data Pump

  • http://orabackupandrecovery.blogspot.com

    ORACLE - Visões Úteis para Recovery

    -- Quais arquivos necessitam de recover.
    select * from v$recover_file;

    -- Quais archived logs são necessários para o processo
    -- de recovery completo de mídia.
    select * from v$recovery_log;

    -- Contém informações sobre tempo de recovery e sobre o
    -- parâmetro FAST_START_MTTR_TARGET
    -- que podem ser muito úteis para o DBA ter uma idéia da
    -- estimativa de tempo
    -- e trabalho que o ORACLE terá para fazer um
    -- recovery em caso de falha.
    select * from v$instance_recovery;

    -- Contém informações sobre flash recovery area.
    select * from v$recovery_file_dest;

    -- Contém informações estatísticas sobre o processo de
    -- recovery corrente.
    -- Disponível para o processo que está fazendo recovery.
    select * from v$recovery_status;

    -- Informações sobre status de backup dos datafiles.
    select * from v$backup;

    -- Informações sobre datafiles a partir do controlfile.
    select * from v$datafile;

    -- Informações dos datafiles a partir dos cabeçalhos dos datafiles.
    select * from v$datafile_header;

    segunda-feira, 3 de agosto de 2009

    ORACLE - Banco de Dados em modo Archiving

    1. Quais as implicações em se trabalhar em modo Noarchivelog ?

    • Redo logs são usados de forma circular.
    • Um redo log pode ser reutilizado imediatamente após um checkpoint.
    • Um vez que redo logs tenham sido sobrescritos, a recuperação só é possível até o último backup completo.

    2. Que opções de recuperação de mídia se tem em modo Noarchivelog ?

    • Devemos recuperar os data files, redo log files e control file do último backup completo do banco de dados.
    • Podemos utilizar export/import para fazer backup, mas isto resulta em uma recuperação imcompleta do banco de dados e transações podem ser perdidas.


    3. Quais implicações em se trabalhar em modo Archivelog ?

    • Banco protegido de perda de dados devido a falha de midia.

    • Pode ser feito backup do banco enquanto ele está online (alter tablespace begin/end backup).

    • Tablespaces (exceto a SYSTEM) podem ficar offline enquanto outras permanescem online. A Recuperação de uma tablespace pode ser feita enquanto o banco está no ar.

    4. Que opções de recuperação de mídia se tem em modo Archivelog ?

    • Pode ser restaurado o backup dos arquivos danificados e usar archived log files para trazer o data file para um estado atualizado enquanto o banco está online ou offline.

    • Pode ser restaurado o banco para um momento no tempo.

    • Pode ser restaurado o banco para o fim de um archived log file específico.

    • Pode ser restaurado o banco para um SCN específico.


    5. Como obter informações sobre Archivelog ?
    Utilize o comando "archive log list"

    sábado, 1 de agosto de 2009

    Trabalhando com Usuários no ORACLE

    1. Como o DBA pode listar quais usuários existem no banco ?

    select * from dba_users
    order by username;

    2. Como o DBA pode listar o status das contas (Aberta, Bloqueada ou Expirada) dos usuários que foram cadastrados no nos últimos 30 dias ?

    select username, account_status, lock_date, expiry_date, created
    from dba_users
    where created > to_date(sysdate-30)
    order by username;

    3. Como criar um profile para os analistas de sistemas com direito a cinco sessões no banco, auto desconexão em 30 minutos de inatividade e bloqueio de senha em três tentativas ?

    create profile analista limit
    sessions_per_user 5
    idle_time 30
    failed_login_attempts 3;


    4. Como criar um novo usuário com senha expirada e quota ilimitada na tablespace users ?

    create user agilar
    identified by "12345"
    default tablespace users
    temporary tablespace temp
    quota unlimited on users
    profile analista
    password expire;

    5. Como criar uma role para gerenciar os direitos dos analistas em vez de atribuir os direitos a cada analista de sistema no banco ?

    create role analista
    not identified;

    grant create session, create table, create trigger, create view, create sequence,
    create procedure, create synonym
    to analista;

    6. Como listar os direitos de sistema atribuidos a role analista ?

    select * from role_sys_privs
    where role = 'ANALISTA';

    ou

    select * from dba_sys_privs
    where grantee = 'ANALISTA';

    7. Como atribuir a role para o usuário Agilar ?

    grant analista to agilar;

    8. Como o DBA pode saber quais roles um usuário possui ?

    select * from dba_role_privs
    where grantee = 'AGILAR';

    9. Como um usuário pode saber quais roles possui na sua sessão ?

    select * from session_roles;

    10. Com um usuário pode saber quais privilégios (sistema e objeto) possui na sua sessão ?

    select * from session_privs;

    11. Como o DBA pode listar os privilégios de sistema atribuidos diretamente para o usuário agilar ?

    select * from dba_sys_privs
    where grantee = 'AGILAR';

    12. Como o DBA pode listar os privilégios de objeto atribuidos diretamente para o usuário agilar ?

    select * from dba_tab_privs
    where grantee = 'AGILAR';

    13. Como o DBA pode saber quais roles existem no banco ?

    select * from dba_roles;

    14. Como listar os usuários que possuem privilégio de sessão ?

    select * from dba_sys_privs
    where privilege = 'CREATE SESSION'
    order by grantee;

    OBS.: Alguns usuários podem ter o privilégio "create session" indiretamente se possuir roles habilitadas.

    15. Como o DBA pode definir roles default para um usuário ?

    alter user agilar default role analista;

    alter user agilar default role all except gerente;

    16. Como o usuário pode habilitar ou desabilitar roles ?

    set role connect
    identified by estoquista;

    set role analista;

    set role none;

    terça-feira, 21 de julho de 2009

    Utilizando SQLPlus

    1. Como conectar via console um banco ORACLE

    sqlplus usuario/senha@banco

    2. Como visualizar tabelas ou objetos do usuário ?

    Você pode visualizar as tabelas e objetos do usuário
    através das tabelas user_tables, user_objects e user_catalog.

    Pode ser utilizado também os sinônimos TAB ou CAT.

    Ex.: select tname
    from user_tables;

    select tname
    from tab;


    3. Visualizar a estrutura de 1 tabela

    desc nome_tabela


    4. Visualizar as constraints de uma tabela

    select constraint_name, constraint_type
    from user_constraints
    where table_name = 'FUNC';

    5. Tabelas úteis para consulta

    user_indexes
    user_sequences

    quarta-feira, 15 de julho de 2009

    Oracle / PostgreSQL SQL Tips


    DICAS ORACLE / POSTGRESQL

    1. Como renomear uma tabela ?

    PostgreSQL

    alter table clientes
    rename to func;

    ORACLE

    rename clientes to func;

    ou

    alter table clientes
    rename to func;


    2. Como adicionar constraint após tabela criada ?

    alter table tabela
    add [constraint] restricao;

    Ex: alter table clientes
    add constraint check (limite >= 0);


    3. Fazer a constraint ser verificada apenas ao comitar transação

    ORACLE

    alter table tabela
    add [constraint] restricao deferrable;

    Ex: alter table clientes
    add check (limite >= 0) deferrable;


    4. Como criar uma função que retorna 1 tabela ?

    PostgreSQL

    create or replace function lista_func(ACidade varchar(100)) returns setof func
    as '
    declare
    registro record;
    begin
    for registro in select * from func
    where cidade = ACidade
    loop
    return next registro;
    end loop;
    end;
    '
    language 'plpgsql';

    USO:

    select * from lista_func();


    5. Excluir um campo de uma tabela

    ORACLE

    alter table clientes
    drop column nome;


    6. Adicionar uma constraint unique para um campo

    PostgreSQL

    alter table func
    add constraint nome_uk unique(nome);

    ORACLE

    alter table func
    add constraint nome_uk unique(nome);

    ou

    alter table func
    modify nome unique;


    7. Criar uma tabela com o conteúdo de uma tabela existente

    create table func_temp as
    select * from func;

    create table func_temp as
    (select * from func);


    8. Adicionar campo com integridade referêncial

    alter table func
    add dept_id integer references dept;

    alter table func
    add dept_id integer references dept(id);


    9. Realizar consultas com relações derivadas (select from select)

    PostgreSQL


    // Retorna a lista de departamentos em que a
    // quantidade de funcionários é maior que 1

    select nome, count
    from(
    select dept.nome,
    (select count(1)
    from func
    where func.dept = dept.id)
    from dept
    ) as dept(nome, count)
    where count > 1;


    ORACLE

    select nome, count
    from(
    select dept.nome,
    (select count(1)
    from func
    where func.dept = dept.id) as count
    from dept
    )
    where count > 1

    10. Qual a ordem de precedência na avaliação dos operadores ?

    ESQUERDA->DIREITA

    1 - operadores de comparação
    2 - not
    3 - and
    4 - or


    OBS.: Por clareza, sempre use parênteses.


    11. Exemplos de funções single row para caracter


    Largura da string:

    select length('ORACLE') from dual;

    Localizar string em outra string:

    select instr('everton agilar', 'a') from dual;

    Preencher uma string com zeros a esquerda

    select lpad('7891237812', 13, '0') from dual;

    Preencher uma string com zeros a direita

    select rpad('7891237812', 13, '0') from dual;


    12. Exemplos de funções single row para data/hora


    Obter data atual

    select sysdate from dual; -- somente ORACLE
    select current_date from dual;
    select current_timestamp from dual;

    Obter hora atual
    select current_time from dual; -- Somente PostgreSQL


    Obter a data/hora em formato texto

    select to_char(current_date-1, 'dd/mm/yyyy') from dual;
    select cast(current_date as varchar(15)) from dual; -- ANSI

    Obter parte da data/hora

    select to_char(current_date, 'MONTH') from dual;
    select to_char(current_date, 'dd') from dual;

    -- ANSI
    select extract(month from current_date) from dual;
    select extract(day from current_date) from dual;


    13. Converter string de dígitos para número

    ORACLE
    select to_number('190.83') from dual;

    select cast('190.83' as numeric(12, 2)) from dual;

    PostgreSQL

    select cast('190.83' as numeric(12, 2)) from dual;


    14. Formatar números

    Formata valor monetário
    select to_char(190.83, '99999D99') from dual;

    Formata código de barra com zeros a esquerda
    select to_char(7891231212, '0999999999999') from dual;


    15. Trocar valor nulo por outro valor em uma expressão

    ORACLE

    select coalesce(telefone, celular) from cliente;

    select coalesce(null, null, null, 2) from dual;

    select nvl(null, 2) from dual;

    select nvl2(null, 1, 2) from dual;

    PostgreSQL

    select coalesce(telefone, celular) from cliente;

    select coalesce(null, null, null, 2) from dual;


    16. Comentar uma tabela ou coluna de tabela

    -- comentário para tabela
    comment on table clientes is 'Tabela de clientes';


    -- comentário para coluna de tabela
    comment on column clientes.tipo is 'F=Fisica J=Juridica';


    17. Visualizar a estrutura de uma tabela

    ORACLE (sqlplus.exe)

    desc nome_tabela

    PostgreSQL (psql.exe)

    \d nome_tabela


    18. Excluir os dados da tabela de forma rápida

    truncate table nome_tabela;

    OBS.: Este comando não permite desfazer alterações (rollback) e
    é executado muito mais rápido que um delete.


    19. Utilizando SEQUENCES

    ORACLE

    -- criar a sequence
    create sequence seq_func
    start with 100
    increment by 10
    nocache;

    -- gerar sequencia
    select seq_func.nextval from dual;

    -- obter valor atual
    select seq_func.currval from dual;


    PostgreSQL

    -- criar a sequence
    create sequence seq_func
    start with 100
    increment by 10
    nocache;

    -- gerar sequencia
    select nextval('seq_func') from dual;

    -- obter valor atual
    select currval('seq_func') from dual;


    OBS.: A diferença do PostgreSQL para o ORACLE é a
    utilização de funções nextval() e currval().
    O SQL ANSI é utilizada a expressão NEXT VALUE FOR.

    20. Como reconstruir um índice ?

    ORACLE

    // refaz o índice na mesma tablespace
    alter index dept_nome_uk rebuild;

    // refaz o índice em outra tablespace.
    alter index dept_nome_uk rebuild tablespace indx;

    20. Como fazer para retornar parte de uma string ?

    ORACLE
    select substr('Oracle 10g', 1, 6) from dual;

    retorna Oracle



    domingo, 12 de julho de 2009

    Linux Knowledge base


      1. Listar a tabela de interrupções de um computador
      2. Listar os dispositivos USB conectados ao computador
      3. Descompactar um arquivo compactado com gzip
      4. Alterar data e hora no Linux
      5. Desligar o computador ou agendar desligamento
      6. Reiniciar o computador ou agendar reboot
      7. Fazer Backup da MBR (Master Boot Record) antes de instalar o Linux




    1. Listar a tabela de interrupções de um computador

    cat /proc/interrupts


    2. Listar os dispositivos USB conectados ao computador

    lsusb


    3. Descompactar um arquivo compactado com gzip

    gzip -d arquivo.gz

    gunzip arquivo.gz


    4. Alterar data e hora no Linux

    date 071312592009

    Parâmetros: mes dia hora minuto ano



    5. Desligar o computador ou agendar desligamento

    shutdown -h now

    shutdown -h 10

    O primeiro comando desliga imediatamente, já o segundo comando passa como parâmetro os minutos que o Linux aguarda antes de iniciar o desligamento.


    6. Reiniciar o computador ou agendar reboot

    shutdown -r now

    shutdown -r 10

    O primeiro comando reinicia imediatamente, já o segundo comando passa como parâmetro os minutos que o Linux aguarda antes de reiniciar.


    7. Fazer Backup da MBR (Master Boot Record) antes de instalar o Linux

    Fazer um backup da MBR é útil quando queremos fazer uma instalação dual boot de Linux e Windows. Se algo der errado na instalação do Linux, podemos facilmente recuperar a MBR e ter acesso ao Windows novamente. É útil também para recuperar a MBR depois de instalado o Windows em um computador com Linux, pois o Windows substitui o bootstrap, programa necessário para carregar o sistema operacional, e que está gravado no MBR.

    dd if=/dev/hda of=mbr.backup bs=512 count=1

    Parâmetros:

    if - dispositivo que queremos fazer backup (no exemplo, primeiro HD do computador)

    of - arquivo que será gravado o MBR.

    bs - quantos bytes será lido

    count - quantas vezes será lido

    Para recuperar a MBR em caso de perda, utiliza-se o seguinte comando:

    dd if=mbr-backup of=/dev/hda bs=512 count=1

    Para recuperar somente o bootstrap sem alterar a tabela de partição utiliza-se o seguinte comando:

    dd if=mbr-backup of=/dev/hda bs=446 count=1




    quarta-feira, 8 de julho de 2009

    Dicas ao Fazer Casos de Uso

    O modelo de casos de uso é uma representação das funcionalidades externamente observáveis do sistema e dos elementos externos (atores) ao sistema que interagem com ele. Este modelo é parte integrante da especificação de requisitos. Deve ser utilizado para moldar os requisitos funcionais do sistema.

    Segue algumas dicas ao fazer casos de uso:


    Quando usar: Quando precisar mostrar os objetivos dos atores. Não utilize para representar funcionalidades do sistema, mas para representar os objetivos dos atores.


    Independência de Interface Gráfica: Escreva os casos sem os detalhes da interface gráfica. Isto é chamado de caso de uso essencial.


    O que o caso de uso representa: Um caso de uso representa as interações entre os atores e o sistema, sem considerar o comportamento interno do sistema.


    Casos de Usos Essenciais e Caso de Uso Reais: Casos de uso essenciais não fazem menção a técnologia utilizada enquanto que caso de uso reais fazem.

    Como escolher o tipo de relacionamento: Depende da prática. Use inclusão quando o mesmo caso de uso se repete em mais de um caso de uso; Use extensão, quando um comportamento opcional tiver de ser descrito; Use herança para reutilização.


    Como identificar casos de uso: Casos de usos representam os processos da empresa que estão sendo automatizados pelo sistema de software. Faça as seguintes perguntas para descobrir os casos de uso:

    1. Quais são as necessidades e objetivos de cada ator
      em relação ao sistema ?

    2. Que informações o sistema deve exibir ?

    3. O sistema deve realizar alguma ação que deva ocorrer
      regularmente no tempo ?

    4. Para cada requisito funcional, existe um ou mais caso(s) de uso
      para atendê-lo ?



    Diferença entre casos de uso primário e secundário: Caso de uso primário são os que identificam os objetivos dos atores. Os casos de uso secundário são os que não trazem nenhum objetivo aos atores mas que são necessário para que o sistema funcione adequadamente.

    Por onde começar: Considere os casos de uso mais arriscados primeiro!

    Os benefícios: Casos de uso devem trazer benefícios para equipe. Se não trazer, descarte-o


    domingo, 5 de julho de 2009

    Trabalhando com Pacotes RPM

    Pacotes RPM é um arquivo que contém informações necessárias para instalação de programas de computador para Linux baseadas na distribuição Hed-Hat. Geralmente é composto por executáveis, documentos e scripts, ou seja, tudo que for necesário para instalação de uma determinada aplicação.

    Pacotes RPM oferecem muita flexibilidade na instalação, atualização, consulta e remoção de softwares, pois elimina a necessidade de configuração e compilação, tornando a instalação de programas mais fácil e organizada em ambientes Linux.


    Segue abaixo uma lista de tarefas comuns que são realizadas por um operador Linux:

    1. Instalar novos programas

    2. rpm -i nome_do_pacote.rpm

    3. Atualizar um programa para versão mais nova

    4. rpm -U nome_do_pacote.rpm

    5. Remover um programa já instalado

    6. rpm -e nome_do_pacote

      OBS: Não coloque a extensão "rpm"!

    7. Para ver a lista de programas (pacotes) instalados em seu sistema

    8. rpm -qa

    9. Para ver se algum programa está instalado em seu sistema

    10. rpm -qa | grep nome_do_pacote

      OBS: Não coloque a extensão "rpm"!

      EXEMPLO: Ver se o openoffice está instalado: rpm -qa | grep openoffice

    11. Para ver quais arquvos um pacote instalou no meu sistema e em que local estão

    12. rpm -ql nome_do_pacote

      EXEMPLO:

      rpm -ql openoffice.org-writer-3.1.0-11.3.fc11.i586

      rpm -ql openoffice.org-writer (perceba que aqui não estou informando o nome completo do pacote)

    13. Para ver quais arquivos um pacote que ainda não está instalado possui

    14. rpm -qlp nome_do_pacote

      OBS.: Note o parâmetro "p"

    15. Obter informações de um pacote instalado

    16. rpm -qi nome_do_pacote

      EXEMPLO: rpm -qi postgresql-server

    17. Obter informações de um pacote não instalado

    18. rpm -qip nome_do_pacote.rpm

      EXEMPLO: rpm -qip pidgin-2.5.7-1.fc11.i586.rpm

      OBS.: Note o parâmetro "p"

    19. Reinstalar ou atualizar um programa existente

    20. rpm -U nome_do_pacote.rpm

      rpm -U --replacedpkgs nome_do_pacote.rpm

    21. Instalar um pacote sem verificação de dependências

    22. rpm -i --nodeps nome_do_pacote.rpm

      OBS.: Esta opção não é recomendada!

    23. Simular instalação de um pacote para ver se tudo vai ocorrer sem problemas

    24. rpm -i --test nome_do_pacote.rpm

    25. Reconstruir a base de dados RPM

    26. rpm --rebuilddb ou

      rpm --initdb

    27. Obter mais informações sobre o comando rpm

    28. man rpm