Debian 5.0 Lenny já é estável!
23 de Fevereiro de 2009, 0:00 - sem comentários aindaSim senhores, no dia 14/02/2009 foi lançado oficialmente o Debian 5.0, ou Lenny. Já estava usando o Testing há algum tempo e posso dizer que está realmente muito bom. O Debian Installer continua me surpreendendo e emocionando sysadmins em todo o mundo, o número de pacotes e plataformas suportadas continua crescendo, a qualidade no empacotamento continua a mesma.
Ciclo de desenvolvimento
Tem algo que continua a mesma coisa: a demora no lançamento. 22 meses de desenvolvimento não é pouco. Enquanto existem distribuições que lançam uma versão a cada 6 meses, o Debian tem uma política que é uma das coisas que só poderiam acontecer no mundo do Software Livre e que eu adoro repetir: Só é lançada oficialmente a versão quando fica pronta. Para o Debian, isto significa que a contagem de bugs críticos tem que chegar em ZERO. Isto significa que você não precisa esperar o primeiro “pacote de correções” para começar a utilizar o Debian, embora praticamente todas as semanas você tenha atualizações de segurança sendo lançadas. Ou seja, você pode usar de olhos fechados e dormir tranquilo. E olha que isso vem da boca de alguns dos sysadmins mais paranóicos que eu já conheci (sim, por incrível que pareça, existem profissões onde os paranóicos são valorizados).
Debian Live
Outra coisa que eu estou abandonando definitivamente são os live-cds de outras distribuições. Carregar um live-cd no bolso era algo fundamental para os evangelistas do Sofware Livre há poucos anos atrás, hoje é considerada uma ferramenta de trabalho indispensável. Ocorre que já usei muito o Knoppix e até o Ubuntu (quem é que não teve meia dúzia de CDs do Ubuntú em alguma gaveta perdida?). Ocorre que em alguns servidores, quem me salvou a vida foi o Instalador do Debian mesmo. Ele tem uma funcionalidade que permite abrir um shell no meio do caminho e consegue reconhecer muito bem os mais diversos dispositivos de discos, me permitindo fazer ajustes de emergência quando um servidor se nega a subir por causa de algum desastre. Então estou migrando definitivamente para o Debian Live, que vem com vários sabores também, além de uma infraestrutura para tornar simples você criar o seu próprio live cd
Obrigado a todos os desenvolvedores do Debian e demais colaboradores que realizaram mais um excelente trabalho.Que venha agora a próxima versão do Debian, Mr. Squeeze!
TOP TOP - monitoramento em modo texto!
22 de Fevereiro de 2009, 0:00 - sem comentários aindaO top é um velho amigo dos usuários do mundo *nix. Para quem não sabe, ele serve para verificar os processos que estão consuminto mais recursos (particularmente memória ou CPU). Praticamente todo Unix que eu já utilizei tem o top, com exceção de uma versão do AIX que tinha o topas. Se você perder alguns minutos olhando as páginas do man do top, vai descobrir uma série de recursos que tornam o top mais poderoso e agradável. Enfim o top é o comando que está no bash_history de 9 entre 10 usuários de *nix.
Mas… o povo não parou por aí. Não mesmo. Existem uma infinidades de ferramentas inspiradas no estilo do top:
- htop - interactive processes viewer - é o top com outro estilo de visualização e manipulação;
- atop - AT Computing’s System & Process Monitor - lembra o top, mas se concentra apenas nos processos ativos, e monitora CPU, memória, swap, discos e rede;
- iotop - simple top-like I/O monitor - uso de I/O (todo DBA deveria usar)
- slabtop - display kernel slab cache information in real time - uso do cache a partir de /proc/slabinfo;
- itop - simple top-like interrupt load monitor - uso de interrupções do processador de /proc/interrupts;
- iftop - display bandwidth usage on an interface by host - uso das interfaces de rede;
- jnettop - View hosts/ports taking up the most network traffic - outra ferramenta para monitorar o uso das interfaces de rede;
- ntop - display top network users - uso da rede e exibe via navegador web;
- sntop - top-like console network status tool - verifica se uma lista de destinos de rede estão ativos usando o ping;
- dnstop - displays various tables of DNS traffic on your network - tráfego de DNS numa interface ou na rede local;
- powertop - program to analyze power consumption on Intel-based laptops - uso de enegia elétrica;
- xrestop - monitor server resources used by X11 clients - uso de recursos por aplicações gráficas;
- virt-top - show stats of virtualized domains - um top para máquinas virtuais;
- apachetop - display real-time web server statistics - sessões do Apache;
- mtop - MySQL terminal based query monitor - sessões do MySQL;
- mytop - top like query monitor for MySQL - outro monitorador de sessões do MySQL;
- pg_top - display and update information about the top cpu PostgreSQL processes - sessões do PostgreSQL.
Bom, estas foram as ferramentas toplike que encontrei em menos de 2 minutos de pesquisa. Conhece outra? Comente por aqui. De qualquer forma, a vida em modo texto é realmente tranquila e trabalhar sobre ssh é realmente uma tranquilidade na vida de qualquer sysadmin. Nada contra as zilhões de ferramentas gráficas de monitoramento, mas quando você precisa atender rapidamente um cliente que está do outro lado do planeta, a dupla ssh + top é imbatível. Claro, existem também o vmstat, o sar, etc, etc, etc…
Acho que um dia vou escrever uma ferramenta assim para o Oracle.. minha vida seria mais fácil.
Qual sistema de arquivos devo utilizar no meu banco de dados?
21 de Fevereiro de 2009, 0:00 - sem comentários aindaA pergunta clássica que todos sempre fazem em listas de discussão, fóruns e bate-papos no IRC é “Qual o melhor sistema de arquivos eu devo utilizar para o meu banco de dados”? Para variar, fizeram novamente esta pergunta na lista do PostgreSQL.org.br
E lá fui eu responder o que para muitos é óbvio, mas para muitos não. Em primeiro lugar, deixe-me dizer que estou falando, é claro, de sistemas de arquivos em Linux. Para outros sistemas operacionais, a coisa funciona mais ou menos assim:
- Windows » NTFS
- Mac OS X » HFS+
- OS/2 » HPFS
- Solaris » ZFS
- AIX » JFS2
- FreeBSD » UFS2
- HP-UX » VxFS
- IRIX » XFS
É claro que boa parte dos sistemas operacionais acima também tem suporte para outros sistemas de arquivos. Mas o uso de outro sistema de arquivo é algo mais raro e atende a necessidades específicas. Também não estou falando aqui de sistemas de arquivos com propósitos especiais, otimizados para clusters, servidores de arquivos, discos SSD, etc. De fato existe uma grande variedade de sistemas de arquivos por aí. Mas é no Linux em que encontramos uma quantidade grande de sistemas de arquivos maduros e que funcionam muito bem, com poucas ou nenhuma limitação. E é aí que a confusão está armada.
Entre os mais comuns estão o EXT2, EXT3, JFS, XFS e ReiserFS. Todos eles são bons sistemas de arquivos e levam alguma vantagem uns sobre os outros em alguma coisa. O ReiserFS é muito bom em lidar com uma grande quantidade de arquivos pequenos. O XFS é bom em lidar com arquivos grandes, e por aí vai. Existem milhares de testes e brigas intermináveis apontando qual deles é o melhor.
O Fato é que tirando a distribuição SUSE, o EXT3 é o sistema de arquivo padrão das grandes distribuições Linux. É também o único sistema de arquivos que a Oracle homologa para a instalação dos seus bancos de dados, tirando é claro o OCFS2, mas que é um sistema de arquivos para cluster, que é outra história.
Antes de mais nada, é preciso entender que em geral todos são bons e apresentam boa velocidade e segurança (ok, tirando o EXT2 neste ponto). O fato é que para cada tipo de aplicação, existe uma forma peculiar de usar os discos. E digo mais, bancos de dados de fornecedores diferentes usam o disco de forma diferente. Mais ainda, um banco de dados do mesmo fornecedor pode utilizar o disco de forma completamente diferente dependendo do tipo de aplicação que o utiliza.
Como eu já demonstrei bem antes por aqui, um banco de dados não deve em situação ideal contar apenas com uma única partição e um único disco. O SO deve ficar num lugar, os logs de transação em outro, os dados em outro lugar e por aí vai. Assim, cada um destes discos são utilizados de forma completamente diferente. Vejamos alguns pontos notáveis:
- O Sistema Operacional tem um perfil de uso mais comum e não é crítico em termos de desempenho. Em termos de segurança, você irá ficar muito tempo indisponível se tiver que instalar tudo novamente, mas de fato não vai perder nenhuma informação crítica. É o caso de utilizar o sistema de arquivos padrão e não tentar nenhuma configuração especial;
- Os logs de transação possuem um perfil bem específico, gravação sequencial em arquivos de tamanho bem definido. É claro que a gravação só vai ser sequencial mesmo se o disco físico (não o volume lógico) for utilizado apenas para isso e não tiver nenhuma outra operação paralela. Já comentei antes que os logs de transação são um ponto crítico no desempenho e na segurança de um banco de dados com grande volume de atualizações, ou OLTP. Você poderia escolher um sistema de arquivos com uma configuração bem específica só para os logs de transação;
- Uma partição contendo tablespaces com dados históricos sem atualizações, pode utilizar um sistema de arquivos com opções mais agressivas reforçando apenas a leitura e sem preocupações com segurança como a jornalização;
- Uma partição com índices que podem ser recriados sem prejuízo para os negócios (a recriação dos índices pode levar várias horas ou até dias) pode dispensar também preocupações com a segurança, mas não com desempenho em gravação;
Tirando estes pontos notáveis, existem algumas considerações de ordem genérica que podemos citar:
- Embora alguns digam que em bancos de dados você pode utilizar EXT2 ou outros sistema de arquivos sem jornalização, uma vez que você já tem a “jornalização” dos logs de transação do sistemas de arquivos, a afimação só é válida se:
- Você realiza backup físico e não apenas lógico (dump) do banco de dados periodicamente;
- Você realiza um backup dos logs de transação arquivados para outro disco e para outro servidor/fita, com período de retenção superior ao intervalo entre os backups físicos;
- Você está disposto a perder os últimos dados contidos do log de transação ativo, que se for perdido não poderá ser recuperado, afinal não foi arquivado e você não tem cópia em outro disco dele;
- Você não se importa de perder tempo recuperando backups, seu banco de dados tem suporte ao PITR e você sabe utiliza-lo bem.
- Todo sistema de arquivos destinado a guardar dados deverá lidar em geral com arquivos grandes, beirando sempre a casa do Gigabyte. Isto geralmente exclui o ReiserFS como sistema de arquivos predileto para bancos de dados. Isto não significa que ele não seja ótimo em outras situações;
- Se você estiver com um Data Mart ou um Data Warehouse onde o perfil de uso é de cargas em lotes agendadas e poucas consultas monstruosas, utilizar tamanhos de bloco maior do que o padrão pode ser vantajoso. Mas só é vantagem neste tipo de situação, fora destas condições o efeito é o inverso;
- Os ganhos de desempenho ao escolher o sistema de arquivos mais rápido com as configurações mais agressivas são da ordem de 5 a 20%;
- Os ganhos de desempenho no ajuste mais agressivo num sistema de arquivos onde ficam tablespaces de uso geral podem ser de cerca de 20% em determinadas operações, mas a perda em outras operações pode ser de mais de 60%;
Se preocupe com segurança de verdade
Todo DBA que já foi acordado de madrugada para ir recuperar um banco de dados corrompido já ouviu a mesma frase “mas em X anos que eu estou aqui na mesma empresa isso nunca aconteceu”. E não raro X chega a ser maior que 5 ou até 10 anos. A verdade é que o fato de você utilizar um bom hardware, um sistema operacional estável e um bom banco de dados não significa que não vai acontecer. E só quem é chamado para consertar os desastres que ocorrem por aí pode ter uma noção de que tipo de sistemas de arquivos é mais ou menos perigoso. Você não acha que porque está X anos numa mesma empresa usando o sistema de arquivos XPTO isto significa que ele é seguro, acha?
Tudo isso para dizer claramente e em bom tom:
NÃO TROQUE SEGURANÇA POR DESEMPENHO
Pode surgir o momento em que você terá de fazer alguns ajustes de desempenho. Eles existem sim. Mas não é qualquer um sabe utilizar isso de forma segura. De fato, conheço poucas pessoas com bom conhecimento técnico que se arriscam a utilizar este tipo de coisa em ambientes realmente críticos. Então, antes de partir para o tuning do seu sistema de arquivos, tenha em mente que você tem coisas muito mais importantes que podem melhorar o desempenho do seu banco de dados:
- Normalização e refatoração das tabelas (ganhos de 100% a 10.000%)
- Reescrever consultas mal escritas (ganhos de 10% a 10.000% na consulta alterada);
- Configurar adequadamente o sistema operacional e o banco de dados adequadamente (ganhos de 10% a 400%);
- Separar o log de transação em discos a parte (ganhos de 20% a 40%);
- Usar RAID 0+1 ao invés de RAID 5 (ganhos de 30% a 60%);
- Dobrar o número de discos do seu RAID (ganho de 60% a 80%)
Ok, não leve muuuito a sério as porcentagens utilizadas aqui. Não tenho nenhuma pesquisa científica para comprovar estes dados. Um DBA mais experiente poderia discordar um pouco dos números apresentados, mas a proporção entre os itens não iria mudar muito. E de qualquer forma ele iria provavelmente concordar com a ordem de importância apresentada aqui.
Se você procura uma forma de ganhar desempenho sem ter que mexer na aplicação, os parâmetros de configuração do seu sistema operacional (particularmente limites de memória e semáforos), e do seu banco de dados (memória, checkpoints e outros) podem ter um impácto enorme. Mas o problema é que são muitos parâmetros, particularmente no banco de dados e os testes não são tão simples. O ajuste ideal pode levar meses no ambiente de produção.
De qualquer forma, sempre haverá o momento em que para aumentar o desempenho você terá que abrir mão da segurança ou colocar a mão no bolso. Muitos parâmetros e configurações que aumentam o desempenho tem impacto muito negativo na segurança . Se você não está disposto a correr riscos então saiba que o preço dos discos não é mais tão assustador quanto antigamente. Mas se você está numa daquelas empresas que não investe nem em espaço extra para guardar os dados, esta não será uma opção viável. De qualquer forma, aumentar o desempenho do hardware, costuma mascarar os problemas na aplicação. Mas é claro, que apesar da aplicação ser o primeiro alvo de otimização, em geral ele é o último a ser atacado. Seja porquê a aplicação é um pacote escrito por terceiros, ou porquê os seus desenvolvedores estão ocupados com uma nova aplicação, o fato é que falar de remodelagem e normalização de uma aplicação em produção para um desenvolvedor é pior do que ofender a mãe. Bom… na verdade dá trabalho para todo mundo, e muitas vezes até o DBA acaba fazendo vista grossa.
O mito dos discos que não falham e da luz que não acaba
É fato que os discos de hoje em dia são muto bons. Muito longe dos discos que vinham com um software para fazer formatação física pois a mídia ia se deteriorando progressivamente. Mas um dia eles podem falhar, particularmente se já estiverem em uso 24/7 há mais de 3 ou 4 anos. Mesmos os melhores discos falham e tem mais, os discos com número de série iguais tem o hábito de falhar na mesma época… como lâmpadas num grande galpão que vão queimando todas juntas. Contra a queima do disco, o seu sistema de arquivo não tem muito o que fazer, a não ser que ele tenha embutido um mecanismo de espelhamento como o ZFS tem. Usando LVM, você também consegue este tipo de funcionalidade, que pode ser uma alternativa para aqueles que não dispõem de uma boa controladora que faça espelhamento por Hardware. Há quem até prefira o RAID por software embora isso esteja longe de ser um consenso. Em todo caso, um bom storage costuma ser a resposta ideal, com monitoramento remoto e tudo o mais.
Mas há algo em que a maioria dos sistemas de arquivos são vulneráveis, a perda de energia. A jornalização foi criada exatamente para você que já viu uma falha de energia corromper todo o seu sistema de arquivos com o seu banco de dados junto. A jonalização não é perfeita, mas melhora muito o nível de segurança. Vale citar que cada sistema de arquivos implementa a jornalização de uma forma diferente, e que o EXT2 simplesmente não o faz. Mais que isso, algumas opções de montagem dos sistemas de arquivos como o ‘writeback’ tem impacto positivo na performance, mas negativo na segurança da jornalização. Outros parâmetros como o ‘noatime’ costumam ser mais seguros de se utilizar, e trazem algum ganho de desempenho.
Então chega uma das perguntas que produzem lembranças divertidas em muitos, mas que não foram tão divertidas na época em que ocorreram: “Se eu tenho nobreak, por que eu tenho que me preocupar com jornalização?”. Vejamos alguns bons motivos:
- Nobreaks quebram;
- Nobreaks que estão fora da garantia e não tem contrato de manutenção podem já estarem quebrados e você nem desconfia;
- Nem todos testam os seus nobreaks da foram correta;
- Nem todos habilitam o agente do nobreak para desligar gentilmente o servidor quando a bateria está no fim;
- Um banco de dados pode demorar horas para ser desligado gentilmente quando tem muitos usuários conectados simultaneamente ou rodam longas transações;
- As baterias do nobreak tem vida útil curta, em 2 ou 3 anos você tem
que trocar. Tem gente que “esquece de trocar”; - Um nobreak com isolação total (onde a alimentação ocorre sempre
diretamente das baterias) tem baterias com uma vida útil de pouco mais
de 1 ano; - Em muitos lugares é comum haver falta de energia por mais de 3
horas. Não tem nobreak que aguente isso. Nos final de semana a
concessionária de energia adora fazer manutenção sem aviso prévio; - Você pode ter uma manutenção na rede elétrica interna do prédio e
ficar sem energia. O pessoal da manutenção pode ter esquecido de lhe
avisar; - Mesmo que você tenha um gerador, pode ocorrer de você não estar com a manutenção do gerador em dia, ou ele simplesmente estar sem
combustível; - O número de equipamentos ligados ao nobreak e gerador pode ter aumentado nos últimos meses e o nobreak e/ou gerador podem não suportar a carga adicional;
- Os servidores ou o sistema operacional podem travar de repente. Se o servidor for um Windows ele pode (e vai) pegar um vírus;
- Alguém pode desligar um servidor acidentalmente no CPD. Há não muito tempo atrás, os teclados vinham com uma infame tecla chamada “power”, que ficava ao lado da tecla delete. Você não precisava estar dentro do CPD para fazer uma besteira, bastava numa conexão remota apertar a tecla “power” sem querer….
- Algumas vezes, mesmo quando o sistema operacional é desligado gentilmente, o banco de dados não está configurado para ser desligado gentilmente antes;
- Agora para matar definitivamente: você sabia que todos os storages tem um nobreak adicional embutido?
O Que há de novo no mundo dos sistemas de arquivos?
Bom, a esta altura eu já poderia estar escrevendo assim:
- Espelho, espelho meu, existe sistema de arquivos melhor que o XPTO? - Caro sysadmin, é carnaval, vai tomar uma cerveja e deixa o sistema de arquivos aí.Mas é claro que no último e-mail da conversa na lista de discussão que deu origem ao texto que você esta lindo aqui, o Sr. Fernando Ike estragou a piada infame. Na verdade eu já estava esperando a posição dele que acabou fechando a conversa. Para quem não sabe, o Sr. Fernando Ike é um sysadmin que foi para o PGCon2008 no Canadá apresentar um trabalho de pesquisa feito junto com o Sr. Euler Taveira sobre testes de desempenho no PostgreSQL utilizando diferentes configurações de sistemas de arquivos. Vale a pena conferir aqui. E o que foi que mestre fike disse? Num futuro próximo teremos EXT4 e Btrfs.
Bom, por uma questão de sanidade mental, minha e dos meus leitores, vou deixar isso para o próximo post. Mas fiquem antenados, o mundo continua girando e as coisas estão mudando…
Seja produtivo, não use Windows!
4 de Fevereiro de 2009, 0:00 - sem comentários aindaBom, já faz um mês que estou de emprego novo. Muita coisa mudou de uns tempos para cá. Muita coisa aconteceu na família e na vida como um todo.
É muito pouco tempo para emitir qualquer opinião sobre o novo trabalho. Muita coisa nova. Ao invés de ficar como DBA fixo num único cliente, vou a cada dia num cliente diferente. Uma vida completamente nova. Notebook debaixo do braço e um universo diferente a cada dia.
Mas devo dizer que andar com notebook debaixo do braço é algo complicado:
- Falem o que quiserem, mas se acostumar com o teclado e com touch pad do notebook é chato. Mas você sobrevive a isso;
- Usar modem 3G não é igual aos comerciais da TV. Tem lugar que não pega, tem lugar não pega 3G e fica uma carroça e tem lugar que a conexão cai com frequência. Mas você sobrevive a isso;
- Digam o que disserem, mas o peso, o tamanho da tela e a duração da bateria ainda são as coisas mais importantes de um note. Quanto maior a tela e a bateria, maior o peso para carregar. Mas você sobrevive a isso;
Agora, usar Windows… isso não tem preço. Um amigo comprou um note da Apple e disse que o Windows iria continuar a dominar o mercado e que a qualidade deles melhorou muito e coisa e tal. Vou te dizer amigo, usar Unix é muito diferente:
- As conexões SSH funcionam muito melhor, você recorta e cola de lá para cá sem precisar usar o mouse;
- Shell com abas… isso parece besteira até você ficar sem;
- Se você tem que usar Wireless + RJ45 + Modem 3G + VPN em cada lugar de um jeito, o windows tem um jeito maluco de lidar com tudo isso. Você liga uma coisa e outra cai… pode ser inabilidade minha, mas com Unix você tem as coisas na sua mão.
- Em duas semanas uma coleção enorme de vírus se instalaram por aqui. Tem um circo com diversos sabores. E eu não navego em sites suspeitos ou abro e-mails estranhos. Sim, eu atualizo o antivírus, o antispyware e o Windows. Mesmo assim eles brotam…
- Instalar o SP3 dá um trabalhão, tem que instalar e atualizar um monte de coisas para ele poder começar a trabalhar. Zilhões de passos, etc e tal. Definitivamente, quem se acostuma com Debian não consegue engolir isso;
- Reiniciar e travar, é só começar! É claro que o ambiente gráfico também trava no Linux. Trava mesmo. O OpenOffice e o Firefox fazem estragos enormes na memória, ainda mais se entrar o Java ou o Flash na parada. Mas competir com o Windows Explorer não dá… o bixo é muito estranho. Você começa a ver que montar e desmontar volumes faz muito sentido… as coisas não travam inesperadamente;
Não tem como descrever a sensação… é como se você estivesse dirigindo a 120 KM/h na Imigrantes… e derrepende entrasse na serra aquaplanando. É mais ou menos assim. Você perde completamente o controle. Se sente inseguro, não entra mais no netbanking para ver sua conta bancária, vê um monte de avisos coloridos pulando na tela sem serem convidados e fica com tendinite de tanto usar o mouse.
Minha produtividade na primeira semana de trabalho caiu uns 40% do nada. Ok, adaptação e coisa e tal. Mas mesmo após um mês amargando o windows todo santo dia, eu ainda me sinto um estranho, e uns 20% menos produtivo. Em suma, pode rolar uma rebelião no novo trabalho, mas pelo menos um dual-boot vai ter que rolar neste notebook.
Por enquanto é só pessoal. Vou ter que reiniciar aqui o servidor para aplicar as alterações o Pervice Pack 3 do Windows e a atualização do antivírus…
Monitoramento básico de objetos no Oracle
23 de Dezembro de 2008, 0:00 - sem comentários aindaBom, todo DBA que se prese deve acompanhar o crescimento da base conforme o tempo. Prever o espaço em disco necessário nos próximos meses, saber qual época ocorre maior crescimento da base. Acompanhar de perto objetos críticos que ocupam mais espeço, etc. É claro que a própria Oracle e outros fornecedores possuem ferramentas bastente sofisticadas para fazer algumas destas coisas. É bem verdade que boa parte delas faz em maior ou menor grau algo bem semelhante ao que vou mostrar adiante. No entanto, eu gosto da minha solução, pois eu consigo entendê-la facilmente e modificar para necessidades específicas. No mínimo é um bom exercício de aprendizado.
Vejamos alguns requisitos que eu montei:
- Ser compatível com pelo menos o Oracle 8 em diante;
- Armazenar todas informações num tablespace separado, para que a coleta de dados não influencie nos demais tablespaces;
- Utilizar um esquema separado para a criação de todos os objetos envolvidos. O usuário em questão deverá ser bloqueado e ter o mínimo de privilégios necessários;
- Criar uma tabela para registrar a data de duração no disparo de cada script e outra para os erros que por ventura venham a ocorrer;
- Coletar as seguintes informações com as respectivas periodicidades:
- Dados sobre o tamanho dos tablespaces uma vez por mês;
- Dados sobre a quantidade e tipo de objetos por esquema uma vez por dia, atualizando apenas as mudanças ocorridas;
- Nome dos objetos inválidos auma vez por dia, atualizando apenas as mudanças ocorridas;
- Tamanhode objetos que ocupem mais de 64MB ou tenham mais de 50 extents ou mais de um milhão de registros uma vez por semana, atualizando apenas as mudanças ocorridas;
Objetos
CREATE TABLESPACE 'DBA_LOG_DADOS' DATAFILE '/u01/oradata/nome_da_base/dba_log_dados_01.dbf' SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO; CREATE USER dba_log IDENTIFIED BY dba DEFAULT TABLESPACE dba_log_dados QUOTA UNLIMITED ON dba_log_dados ACCOUNT LOCK; GRANT CREATE PROCEDURE TO dba_log; GRANT CREATE TABLE TO dba_log; -- Executar como SYSDBA GRANT SELECT ON dba_objects TO dba_log; GRANT SELECT ON dba_segments TO dba_log; GRANT SELECT ON dba_data_files TO dba_log; GRANT SELECT ON dba_free_space TO dba_log; GRANT SELECT ON dba_tables TO dba_log; CREATE SEQUENCE dba_log.log_seq; CREATE TABLE dba_log.log( id_log number(10), rotina varchar2(100), usuario varchar2(30) DEFAULT USER, inicio date DEFAULT SYSDATE, fim date, CONSTRAINT log_pk PRIMARY KEY(id_log) ); CREATE TABLE dba_log.erros ( id_log number(10), cod_erro number(10), mensagem varchar2(64), DATA TIMESTAMP DEFAULT SYSTIMESTAMP ); CREATE TABLE dba_log.tablespace ( nome varchar2(30), maximo number(8) NOT NULL, alocado number(8) NOT NULL, utilizado number(8) NOT NULL, livre number(8) NOT NULL, DATA date DEFAULT SYSDATE, CONSTRAINT tablespaces_pk PRIMARY KEY (nome,DATA) ); CREATE OR REPLACE PROCEDURE dba_log.tablespace_load AS v_log_seq number(10); v_code number(10); v_errm varchar2(64); BEGIN SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual; INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'tablespace_load'); INSERT INTO dba_log.tablespace (nome, maximo, alocado, utilizado, livre) SELECT u.tablespace_name, m.maximo, m.alocado, u.utilizado, l.livre FROM (SELECT tablespace_name, CEIL (SUM (bytes) / 1048576) utilizado FROM dba_segments GROUP BY tablespace_name) u, (SELECT tablespace_name, CEIL (SUM (bytes) / 1048576) alocado, CEIL (SUM (DECODE (autoextensible, 'NO', bytes, maxbytes)) / 1048576) maximo FROM dba_data_files GROUP BY tablespace_name) m, (SELECT tablespace_name, CEIL (SUM (bytes) / 1048576) livre FROM dba_free_space GROUP BY tablespace_name) l WHERE l.tablespace_name = u.tablespace_name AND l.tablespace_name = m.tablespace_name ; UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq; COMMIT; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1 , 64); INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm); END; / CREATE TABLE dba_log.objeto_qt ( tipo varchar2(19), esquema varchar2(30), STATUS varchar2(7), qt number(5) NOT NULL, DATA date DEFAULT SYSDATE, CONSTRAINT objeto_qt_pk PRIMARY KEY (tipo, esquema, STATUS, DATA) ); CREATE OR REPLACE PROCEDURE dba_log.objeto_qt_load AS v_log_seq number(10); v_code number(10); v_errm varchar2(64); BEGIN SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual; INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_qt_load'); INSERT INTO dba_log.objeto_qt (tipo, esquema, STATUS, qt) SELECT b.tipo, b.esquema, b.STATUS, b.qt FROM (SELECT object_type tipo, owner esquema, STATUS FROM dba_objects MINUS SELECT tipo, esquema, STATUS FROM dba_log.objeto_qt) a, (SELECT object_type tipo, owner esquema, STATUS, count(*) qt FROM dba_objects GROUP BY owner, object_type, STATUS) b WHERE a.tipo = b.tipo AND a.esquema = b.esquema AND a.STATUS = b.STATUS ORDER BY esquema, tipo, STATUS ; INSERT INTO dba_log.objeto_qt (tipo, esquema, STATUS, qt) SELECT o.tipo, o.esquema, o.STATUS, o.qt FROM dba_log.objeto_qt q, (SELECT object_type tipo, owner esquema, STATUS, count(*) qt FROM dba_objects GROUP BY owner, object_type, STATUS) o, (SELECT tipo, esquema, STATUS, max(DATA) DATA FROM dba_log.objeto_qt GROUP BY tipo, esquema, STATUS) d WHERE o.tipo = q.tipo AND o.tipo = d.tipo AND o.esquema = q.esquema AND o.esquema = d.esquema AND o.STATUS = q.STATUS AND o.STATUS = d.STATUS AND q.DATA = d.DATA AND o.qt != q.qt ORDER BY o.esquema, o.tipo, o.STATUS ; UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq; COMMIT; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1 , 64); INSERT INTO erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm); END; / CREATE TABLE dba_log.objeto_invalido ( tipo varchar2(19), esquema varchar2(30), nome varchar2(128), DATA date DEFAULT SYSDATE, CONSTRAINT objeto_invalido_pk PRIMARY KEY (tipo, esquema, nome, DATA) ); CREATE OR REPLACE PROCEDURE dba_log.objeto_invalido_load AS v_log_seq number(10); v_code number(10); v_errm varchar2(64); BEGIN SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual; INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_invalido_load'); INSERT INTO dba_log.objeto_invalido (tipo, esquema, nome) SELECT object_type tipo, owner esquema, object_name nome FROM dba_objects WHERE STATUS != 'VALID' MINUS SELECT tipo, esquema, nome FROM dba_log.objeto_invalido ; UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq; COMMIT; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1 , 64); INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm); END; / CREATE TABLE dba_log.objeto_tamanho ( tipo varchar2(19), tablespace varchar2(30), esquema varchar2(30), nome_part varchar2(112), tamanho number(8), extents number(5), num_reg number(10), DATA date DEFAULT SYSDATE, CONSTRAINT objetos_tamanho_pk PRIMARY KEY (tipo, esquema, nome_part, DATA) ); CREATE OR REPLACE PROCEDURE dba_log.objeto_tamanho_load AS v_log_seq number(10); v_code number(10); v_errm varchar2(64); BEGIN SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual; INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_tamanho_load'); INSERT INTO dba_log.objeto_tamanho (tipo, tablespace, esquema, nome_part, tamanho, extents, num_reg) SELECT b.tipo, b.tablespace, b.esquema, b.nome_part, b.tamanho, b.extents, b.num_reg FROM (SELECT segment_type tipo, owner esquema, NVL2(partition_name, segment_name || '/' || partition_name, segment_name) nome_part FROM dba_segments MINUS SELECT tipo, esquema, nome_part FROM dba_log.objeto_tamanho) a, (SELECT s.segment_type tipo, s.tablespace_name tablespace, s.owner esquema, NVL2(s.partition_name, s.segment_name || '/' || s.partition_name, s.segment_name) nome_part, CEIL(s.bytes/1048576) tamanho, s.extents, t.num_rows num_reg FROM dba_segments s, dba_tables t WHERE (s.bytes > 67108864 OR s.extents > 50 OR t.num_rows > 1000000) AND s.owner = t.owner (+)AND s.segment_name = t.table_name (+)) b WHERE a.tipo = b.tipo AND a.esquema = b.esquema AND a.nome_part = b.nome_part ; INSERT INTO dba_log.objeto_tamanho (tipo, tablespace, esquema, nome_part, tamanho, extents, num_reg) SELECT o.tipo, o.tablespace, o.esquema, o.nome_part, o.tamanho, o.extents, o.num_reg FROM dba_log.objeto_tamanho l, (SELECT tipo, esquema, nome_part, max(DATA) DATA FROM dba_log.objeto_tamanho GROUP BY tipo, esquema, nome_part) d, (SELECT s.segment_type tipo, s.tablespace_name tablespace, s.owner esquema, NVL2(s.partition_name, s.segment_name || '/' || s.partition_name, s.segment_name) nome_part, CEIL(s.bytes/1048576) tamanho, s.extents, t.num_rows num_reg FROM dba_segments s, dba_tables t WHERE (s.bytes > 67108864 OR s.extents > 50 OR t.num_rows > 1000000) AND s.owner = t.owner (+)AND s.segment_name = t.table_name (+)) o WHERE l.tipo = d.tipo AND l.tipo = o.tipo AND l.esquema = d.esquema AND l.esquema = o.esquema AND l.nome_part = d.nome_part AND l.nome_part = o.nome_part AND l.DATA = d.DATA AND (o.tamanho != CEIL(l.tamanho) OR l.extents != o.extents OR l.num_reg != o.num_reg) ORDER BY o.esquema, o.tablespace, o.tipo DESC ; UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq; COMMIT; EXCEPTION WHEN OTHERS THEN v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1 , 64); INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm); END; /
Agendamento
Se você estiver utilizando o Oracle 10g ou superior, deve preferir usar o SCHEDULER:
BEGIN DBMS_SCHEDULER.CREATE_WINDOW( window_name=>'SYS.MONTH_START_WINDOW', resource_plan=>'SYSTEM_PLAN', start_date=>SYSTIMESTAMP, duration=>numtodsinterval(240, 'minute'), repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=3', end_date=>null, window_priority=>'LOW', comments=>'Start of the month window for maintenance task' ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'DBA_LOG.TABLESPACE_LOAD_MENSAL', job_type => 'STORED_PROCEDURE', job_action => 'DBA_LOG.TABLESPACE_LOAD', schedule_name => 'SYS.MONTH_START_WINDOW', enabled => TRUE ); DBMS_SCHEDULER.SET_ATTRIBUTE( name => '"DBA_LOG"."TABLESPACE_LOAD_MENSAL"', attribute => 'job_priority', value => 4 ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'DBA_LOG.OBJETO_TAMANHO_LOAD_SEMANAL', job_type => 'STORED_PROCEDURE', job_action => 'DBA_LOG.OBJETO_TAMANHO_LOAD', schedule_name => 'SYS.WEEKEND_WINDOW', enabled => TRUE ); DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'DBA_LOG.OBJETO_TAMANHO_LOAD_SEMANAL', attribute => 'job_priority', value => 4 ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'DBA_LOG.OBJETO_INVALIDO_LOAD_DIARIO', job_type => 'STORED_PROCEDURE', job_action => 'DBA_LOG.OBJETO_INVALIDO_LOAD', schedule_name => 'SYS.WEEKNIGHT_WINDOW', enabled => TRUE ); DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'DBA_LOG.OBJETO_INVALIDO_LOAD_DIARIO', attribute => 'job_priority', value => 4 ); DBMS_SCHEDULER.CREATE_JOB( job_name => 'DBA_LOG.OBJETO_QT_LOAD_DIARIO', job_type => 'STORED_PROCEDURE', job_action => 'DBA_LOG.OBJETO_QT_LOAD', schedule_name => 'SYS.WEEKNIGHT_WINDOW', enabled => TRUE ); DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'DBA_LOG.OBJETO_QT_LOAD_DIARIO', attribute => 'job_priority', value => 4 ); END; /
Se estiver utilizando o Oracle 9i ou inferiro, terá que utilizar os JOBs para agendar a coleta de dados:
VARIABLE jobno NUMBER; BEGIN DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_QT_LOAD; END;', TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 1/24 + 30'); COMMIT; END; / VARIABLE jobno NUMBER; BEGIN DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.TABLESPACE_LOAD; END;', TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE + 30,''MONTH'') + 1/24'); COMMIT; END; / VARIABLE jobno NUMBER; BEGIN DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_TAMANHO_LOAD; END;', TRUNC(SYSDATE) + 1/24, 'NEXT_DAY(TRUNC(SYSDATE), ''SATURDAY'') + 1/24'); COMMIT; END; / VARIABLE jobno NUMBER; BEGIN DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_INVALIDO_LOAD; END;', TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 25/24'); COMMIT; END; / VARIABLE jobno NUMBER; BEGIN DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_QT_LOAD; END;', TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 25/24'); COMMIT; END; /
Conclusão
Com os dados coletados nas tabelas, você só precisa agora exercitar um pouco do seu conhecimento de SQL para fazer consultas criativas e gerar relatórios dos mais diversos e entregar para o seu chefe no final do ano. Não, adianta nada criar os objetos agora e tentar fazer mágica. Após um anos, você poderá observar com alguma precisão a sazonalidade das aplicações e fazer boas projeções. Que tal começar o ano com um mínimo de coleta de dados na sua base? Quando a turma do ITIL bater na sua porta, algumas coisas já estarão encaminhadas para o seu lado.