.comment-link {margin-left:.6em;}

Thursday, August 04, 2005

Indices

Autor: Edna Gobbi
A Dúvida.

Marcio, boa tarde.

Voce pode me esclarecer esta duvida??
O índice e para melhorar o desempenho de acesso às tabelas.
Tendo como função reduzir o I/O em disco,
quando diz isto, quer dizer que a informação esta em cache de memoria ??

Qual tipo de memoria ele aloca???
O buffer_chache ou a library_cache??

Grata

Edna


Edna Gobbi


O índice pode melhorar ou não o desempenho quanto ao acesso às tabelas, depende de como ele é usado, portanto é preciso entender como ele funciona para saber usá-lo. Uma leitura neste artigo pode ajudar a começar a entender.

"Tendo a função de reduzir I/O" ... Mais uma vez, esta afirmação é verdadeira se o uso do índice for adequado. Caso contrário, o índice simplesmente provoca uma avalanche de IO.

Tomemos por analogia a leitura de um livro:
- sua leitura será o IO
- o livro que está lendo os datafiles
- e nesse livro (datafiles) temos os capítulos (segmentos de dados) e o índice remissivo (segmento de índice).

Se deseja achar um determinado assunto, terá maior facilidade se for ao índice, procurá-lo, encontrar a página, ir até ela e ler. Contudo, se estiver lendo o livro todo convencionalmente, e for através do índice, provalvemente terá muito mais trabalho. Imagine o esforço para completar a leitura! Necessitaría ainda, organizar a sequência da informação trazida do índice remissívo para que houvesse algum sentido, porque nele a organização é alfabética por assunto chave e não por capitúlos.

Assim como qualquer índice de livros nos ajuda rapidamente chegar a um tema, o índice das tabelas também rapidamente encontra pequenas porções de informação, porém devemos estar atentos quando usá-lo e não deixar nossa "leitura" mais difícil e demorada do que simplesmente abrir o livro na página um e ir até o final.

Quanto a memória alocada: a informação pode estar ou não na memória, segue o mesmo mecanismo dos blocos de dados com LRU/MRU como regra de manutenção de blocos no cache. A porção de memória que ele usa é a buffer cache. Na library cache estão armazenados, basicamente, as sql areas comum e privada, ou seja os plsql, cursores e códigos em java.

Wednesday, August 03, 2005

RSS - Rich Site Summary

A maioria dos sites atualmente (inclusive este) já dispõe desta facilidade para manter os leitores informados sobre novas atualizações, seja artigos, publicações, etc.
Como funciona o RSS. É uma distribuição no formato XML que envia resumo das novidades publicadas.

Para configurar é fácil, vá até seu client de e-mail, desse ponto em diante voce precisa consultar a configuração de cada cliente de e-mail, no Thunderbird, por exemplo, adicione uma nova conta do tipo RSS News & Blogs, atribua um nome a nova conta e pronto. Agora, na conta crie um diretório e nomei-o como "Blog do Márcio Portes" por exemplo, clique sobre o novo diretório e procure por gerencia de assinaturas, no campo URL Feed, inclua http://mportes.blogspot.com/atom.xml, esteja seguro de não trazer a página toda e pronto. Basta pedir as novas mensagens. Sempre virão as últimas atualizações.

Tuesday, August 02, 2005

Carreira: DBA

Autor: Alessandro Falanque
A Dúvida.

Boa tarde Marcio, tudo bem?
Primeiramente, parabens pelo seu blog, eh uma otima fonte de informação.

Bom deixe explicar o motivo pelo qual estou te escrevendo este e-mail.

Sou analista de sistemas senior e estou querendo uma promoção como DBA Oracle.

Só que não encontrei o melhor caminho ainda, fiz o curso na G&P mas ainda não fiz as provas da certificação pois não me sinto seguro.

Gostaria de um conselho seu sobre qual o melhor caminho a seguir, fazer um estagio? trabalhar como DBA junior? fazer umas aulas com algum DBA e depois partir pra um emprego?

Se vc puder me dar uma luz agradeceria muito...
Obrigado...


-----------------------
- -
- Alessandro Falanque -
- -
-----------------------

O melhor caminho a seguir depende do momento da sua carreira, isso só quem pode determinar é você. Na minha opinião, em qualquer profissão, sorte é imprescindível. Estar no lugar certo na hora certa e, principalmente, ter a sorte de trabalhar com pessoas experientes. Ter um mentor no início da carreira é uma excelente oportunidade de aprender boa lógica, proatividade, leitura política, tranquilidade, administrar conflitos, saber priorizar tarefas, definir o que é importante, como se comportar sob pressão, etc.

O DBA precisa entender a área de desenvolvimento. No seu caso, você já tem essa vantagem por vir de lá. O principal objetivo do DBA é tornar as tarefas que dizem respeito ao banco fáceis de serem realizadas. Resumindo: disponibilidade, boa performance e administração.

Disponibilidade

Ter os dados disponíveis é ter um boa estratégia de backup e recovery. Se você já tem familiaridade com isso, mesmo assim não é o bastante. Volte aos estudos e pratique mais. Simule todos os cenários possíveis de desastre do banco e tente recuperá-los.

Boa Performance

Entender quais as ferramentas estão sendo usadas para desenvolvimento contra o banco de dados, facilitar o acesso aos traces e instrumentar o banco. Assim, é possível identificar pontos de gargalos e ajudar os desenvolvedores a construir SQLs eficientes e baratos para a aplicação. Quem determina o tempo de execução de uma transação deve ser o negócio e o DBA deve ajudar alcançar essa meta.

Administração

São as demais tarefas: instalação, aplicação de patches, verificação de vulnerabilidades, dimensionamento de hardware (memória/disco), configuração de rede (tns/listeners/dispatchers), capacity plan, configuração de clients, conectividade com servidor de aplicação, etc.
Eu evitaria vício em ferramentas gráficas, preferiria scripts ao invés. Por onde houver um Oracle, seguramente vai existir um SQL*Plus. Numa eventual visita externa, leve consigo seus scripts num pen drive (USB Flash memory) e pronto.

Não sei qual sua experiência em Oracle atualmente. É fato que estudar paras provas o ajudará, No entanto, o que levará você a se tornar um DBA é o hands-on. Tem que praticar, provar, investigar, não aceitar a palavra de ninguém, é preciso aprender a comprovar qualquer teoria no banco com scritps (reproduzindo). Ser um DBA vem com o tempo e experiência. Não tenha pressa.

Monday, August 01, 2005

Multiplexar Controlfile - OMF

Sobre o artigo de ontem, um colega de trabalho me disse: "Marcio, o texto está legal até onde você fala da multiplexação do controlfile através do OMF, a partir daí ficou um pouco vago". Perguntei se o vago dizia respeito ao fato de que não havia demonstração e ele me respondeu que sim. Depois, recebi um comentário do próprio autor da dúvida que me motivou a investigar essa técnica. Então resolvi publicá-la.

Na verdade, eu não demonstrei por julgar perigosa a operação de multiplexação de controlfile através do OMF. Entretanto, a técnica é interessante. IMPORTANTE! Só siga os passos seguintes se entender o que está fazendo e NUNCA replique isso em produção sem antes estressar em ambiente de teste. É preciso o usuário SYS para o teste.

ops$marcio@ORA10GR1> connect / as sysdba
Connected.
sys@ORA10GR1> create pfile='c:\tmp\init.ora' from spfile;

File created.

Acima criei um pfile (init.ora) para trabalhar como baseline do que já está no ambiente atualmente. Esse passo é importante para preservar todos os ajustes finos que eventualmente tenham sido feitos através dos parâmetros. É necessário editar o init.ora e livrar-se do parâmetro CONTROL_FILES. Segue abaixo o init.ora usado no exemplo. Vale lembrar que usando este técnica (OMF), se no momento do startup do banco ele encontrar o parâmetro control_files definido, o Oracle levanta o erro:

CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01276: Cannot add file (...) File has an Oracle Managed Files file
name.

Se esse erro aparecer em seu exercício, sugiro ir até o init.ora e verificar se o control_files não está dando o ar da graça. Seguindo...

sys@ORA10GR1> host type c:\tmp\init.ora
*.background_dump_dest='C:\oracle\admin\ora10gr1\bdump'
*.compatible='10.1.0.2.0'
*.core_dump_dest='C:\oracle\admin\ora10gr1\cdump'
*.db_block_size=8192
*.db_cache_size=25165824
*.db_create_file_dest='C:\oracle\oradata'
*.db_create_online_log_dest_1='C:\oracle\oramplx'
*.db_create_online_log_dest_2='C:\oracle\oradata'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='ora10gr1'
*.java_pool_size=0
*.job_queue_processes=10
*.large_pool_size=8388608
*.open_cursors=300
*.pga_aggregate_target=12582912
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=41943040
*.sort_area_size=65536
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='C:\oracle\admin\ora10gr1\udump'
*.utl_file_dir='c:\tmp'

Agora necessitamos do controlfile propriamente dito, então faremos um trace, o arquivo estará em user_dump_dest. Este caminho pode ser obtido através do comando show parameter user_dump_dest. Uma vez gerado o trace, precisamos editar o arquivo para eliminar os comentários e comandos não aplicados à multiplexação. Mais abaixo encontra-se o arquivo já editado.

sys@ORA10GR1> alter database backup controlfile to trace;

Database altered.

sys@ORA10GR1> host type c:\tmp\multplx_ctl.sql
set echo on
STARTUP NOMOUNT pfile="c:\tmp\init.ora"
CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 454
LOGFILE
GROUP 1 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_1_1GCW7HLG_.LOG' SIZE 10M,
GROUP 2 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_2_1GCW7JQT_.LOG' SIZE 10M,
GROUP 3 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_3_1GCW7KOC_.LOG' SIZE 10M
-- STANDBY LOGFILE
DATAFILE
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSTEM_1GCW7ODG_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_UNDOTBS1_1GCW99S4_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSAUX_1GCW9XS2_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_USERS_1GCWDQ43_.DBF',
'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_PAY_TBSP_1GK8ZWPX_.DBF',
'C:\TMP\A.DBF'
CHARACTER SET WE8MSWIN1252
;
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;

column ctl_files NEW_VALUE ctl_files;
select concat('control_files=''',
concat(replace(value, ', ', ''','''), '''')) ctl_files
from v$parameter
where name ='control_files';
host "echo &ctl_files >> c:\tmp\init.ora"

set echo off

A última query do controlfile é para alimentar o init.ora com os novos nomes dos recém criados arquivos de controle. Isto será usado mais adiante para atualizar o spfile. Abaixo limpo os diretórios onde os controlfiles serão criados.

sys@ORA10GR1> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys@ORA10GR1> host del c:\oracle\oradata\ora10gr1\controlfile\*.ctl

sys@ORA10GR1> host dir c:\oracle\oradata\ora10gr1\controlfile\*.*
Volume in drive C has no label.
Volume Serial Number is 4064-FF3B

Directory of c:\oracle\oradata\ora10gr1\controlfile

08/02/2005 01:02 AM <DIR> .
08/02/2005 01:02 AM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 4,911,177,728 bytes free

sys@ORA10GR1> host del c:\oracle\oramplx\ora10gr1\controlfile\*.*
c:\oracle\oramplx\ora10gr1\controlfile\*.*, Are you sure (Y/N)? y

sys@ORA10GR1> host dir c:\oracle\oramplx\ora10gr1\controlfile\*.*
Volume in drive C has no label.
Volume Serial Number is 4064-FF3B

Directory of c:\oracle\oramplx\ora10gr1\controlfile

08/02/2005 01:03 AM <DIR> .
08/02/2005 01:03 AM <DIR> ..
0 File(s) 0 bytes
2 Dir(s) 4,924,219,392 bytes free

SHOWTIME!

sys@ORA10GR1> @c:\tmp\multplx_ctl
sys@ORA10GR1> STARTUP NOMOUNT pfile="c:\tmp\init.ora"
ORACLE instance started.

Total System Global Area 79691776 bytes
Fixed Size 787548 bytes
Variable Size 53476260 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
sys@ORA10GR1> CREATE CONTROLFILE REUSE DATABASE "ORA10GR1" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 454
7 LOGFILE
8 GROUP 1 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_1_1GCW7HLG_.LOG' SIZE 10M
9 GROUP 2 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_2_1GCW7JQT_.LOG' SIZE 10M
10 GROUP 3 'C:\ORACLE\ORAMPLX\ORA10GR1\ONLINELOG\O1_MF_3_1GCW7KOC_.LOG' SIZE 10M
11 -- STANDBY LOGFILE
12 DATAFILE
13 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSTEM_1GCW7ODG_.DBF',
14 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_UNDOTBS1_1GCW99S4_.DBF',
15 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_SYSAUX_1GCW9XS2_.DBF',
16 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_USERS_1GCWDQ43_.DBF',
17 'C:\ORACLE\ORADATA\ORA10GR1\DATAFILE\O1_MF_PAY_TBSP_1GK8ZWPX_.DBF'
18 CHARACTER SET WE8MSWIN1252
19 ;

Control file created.

sys@ORA10GR1> ALTER SYSTEM ARCHIVE LOG ALL;

System altered.

sys@ORA10GR1> ALTER DATABASE OPEN;

Database altered.

sys@ORA10GR1>
sys@ORA10GR1> column ctl_files NEW_VALUE ctl_files;
sys@ORA10GR1> select concat('control_files=''',
2 concat(replace(value, ', ', ''','''), '''')) ctl_files
3 from v$parameter
4 where name ='control_files';

CTL_FILES
---------------------------------------------------------------------------
control_files='C:\ORACLE\ORAMPLX\ORA10GR1\CONTROLFILE\O1_MF_1GYFWKWV_.CTL',
'C:\ORACLE\ORADATA\ORA10GR1\CONTROLFILE\O1_MF_1GYFWLB3_.CTL'


1 row selected.

sys@ORA10GR1> host "echo &ctl_files >> c:\tmp\init.ora"

sys@ORA10GR1>
sys@ORA10GR1> set echo off
sys@ORA10GR1> create spfile from pfile='c:\tmp\init.ora';

File created.

sys@ORA10GR1> startup force
ORACLE instance started.

Total System Global Area 79691776 bytes
Fixed Size 787548 bytes
Variable Size 53476260 bytes
Database Buffers 25165824 bytes
Redo Buffers 262144 bytes
Database mounted.
Database opened.
sys@ORA10GR1> connect /
Connected.
ops$marcio@ORA10GR1>

No final do artigo anterior há um resumo dos passos acima.

OMF - Oracle Managed Files

Inserido a partir da versão 9i, o Oracle-managed Files (OMF) elimina a necessidade do DBA ter que nomear datafiles, controlfiles e logfiles. O gerenciamento fica no nível do objeto dentro da base de dados, ou seja, quando for necessário eliminar uma tablespace, por exemplo, não é necessário ir no nível do sistema operacional e remover o arquivo, o OMF faz esse trabalho.

Para configurar o OMF e poder usufruir dessa facilidade, é preciso setar os seguintes parâmetros do spfile ou pfile:

DB_CREATE_FILE_DEST

DB_CREATE_ONLINE_LOG_DEST_n ( onde n vai de 1 a 5 )

O db_create_file_dest será o diretório onde serão criados os futuros datafiles, já o db_create_online_log_n server para apontar onde serão criados e/ou multiplexados os controlfiles e datafiles.

Se não houver valor em db_create_file_dest, a criação de uma tablespace necessita da cláusula explícita dos datafiles ou tempfiles.

ops$marcio@ORA10GR1> show parameter db_create_file_dest

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest string
ops$marcio@ORA10GR1> create tablespace tbs;
create tablespace tbs
*
ERROR at line 1:
ORA-02199: missing DATAFILE/TEMPFILE clause


ops$marcio@ORA10GR1>

Uma vez setado valor para a variável, basta criar a tablespace que os defaults serão assumidos, no caso de tablespace será criado um datafile com 100 Megabytes.
A criação do controlfile e redologfiles ocorre da mesma maneira, porém o único parâmetro mandatório para o OMF é o db_create_file_dest, porque no caso de ausência dos db_create_online_log_dest_n o OMF criará controlfile e logfile sobre db_create_file_dest.

Na versão 10g ainda temos organizado o diretório por SID e DATAFILE/CONTROLFILE/ONLINELOG - dependendo, obviamente, de qual o tipo de arquivo será criado. Abaixo, vamos setar o parametro db_create_file_dest e repetir o comando que falhou acima, iremos depois verificar o tamanho do datafile criado e onde.

ops$marcio@ORA10GR1> alter system set db_create_file_dest="C:\oracle\oradata";

System altered.

ops$marcio@ORA10GR1> create tablespace tbs;

Tablespace created.

ops$marcio@ORA10GR1> host dir /od C:\oracle\oradata\ora10gr1\datafile
Volume in drive C has no label.
Volume Serial Number is 4064-FF3B

Directory of C:\oracle\oradata\ora10gr1\datafile

07/27/2005 10:03 PM 20,979,712 O1_MF_TEMP_1GCWBB7T_.TMP
07/31/2005 11:50 PM 104,865,792 O1_MF_PAY_TBSP_1GK8ZWPX_.DBF
07/31/2005 11:50 PM 5,251,072 O1_MF_USERS_1GCWDQ43_.DBF
07/31/2005 11:50 PM 125,837,312 O1_MF_SYSAUX_1GCW9XS2_.DBF
07/31/2005 11:50 PM 209,723,392 O1_MF_UNDOTBS1_1GCW99S4_.DBF
07/31/2005 11:50 PM 314,580,992 O1_MF_SYSTEM_1GCW7ODG_.DBF
08/01/2005 12:35 AM <DIR> ..
08/01/2005 12:35 AM <DIR> .
08/01/2005 12:35 AM 104,865,792 O1_MF_TBS_1GVQP840_.DBF
7 File(s) 886,104,064 bytes
2 Dir(s) 4,842,160,128 bytes free

ops$marcio@ORA10GR1>

Em negrito está o arquivo recém criado com o default de 100MB e chegamos a ele porque conhecemos o db_create_file_dest (C:\oracle\oradata\), o nome da instância (ora10gr1) e o tipo de arquivo (datafile). Somando tudo temos: C:\oracle\oradata\ora10gr1\datafile

-o-

Motivado por uma dúvida em um forum, tentei multiplexar meu controlfile depois do banco rodando, eu já tinha um controlfile "vivo" e queria multiplexar. Isso me tomou algum tempo para interpretar a documentação e mesmo realizar o processo. Eu não recomendaria multiplexar controlfile usando OMF eu continuaria usando o método tradicional mesmo, fecha o banco, copia o controlfile, muda o init.ora e abre o banco. Para testar a multiplexação de controlfile, cheguei até a submeter uma dúvida na asktom.

Qual era meu erro até então? Eu sempre deixava o control_files com o valor inicial, então para multiplexar o controlfile, é preciso deixar o parâmetro control_files vazio. A seqüência foi:



column ctl_files NEW_VALUE ctl_files;
select concat('control_files=''', concat(replace(value, ', ', ''','''), ''''))
ctl_files from v$parameter where name ='control_files';
host "echo &ctl_files >>/opt/oracle/admin/ora10gr1/scripts/init.ora";


This page is powered by Blogger. Isn't yours?