Pesquisar este blog

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;