domingo, 18 de julho de 2010

MySQL como Oracle

Ha alguns meses realizei um treinamento de MySQL ministrado pela HTI, que acredito seja a única parceira oficial da Oracle Sun para treinamentos em MySQL (pelo menos era antes da aquisição). O treinamento foi muito bom, por sinal recomendo, teve como instrutor o Alexandre Almeida atual colaborador do MariaDB e mantenedor do MySQL Labs. Durante o treinamento tivemos vários assuntos interessantes abordados mas um ponto em particular me chamou bastante a atenção principalmente pela curiosidade, tratava-se de uma configuração regida por um parâmetro chamado SQL Mode.
Antes de explicar sobre a utilização da configuração em questão vou aproveitar a oportunidade para salientar uma das características do MySQL e talvez de muitos aplicativos open source, a premissa da simplicidade. Uma das primeiras coisas que aprendi sobre o MySQL e uma de tantas que um amigo do mundo open source, Marcelo Leal, me ensinou foi isso. Esse é um importante paradigma que tive que entender para começar a apreciar o MySQL. Muitas vezes você vai se pegar reclamando da ausência de uma funcionalidade, ou surpreso de quão simples é a arquitetura do MySQL e a razão possivelmente venha desse paradigma.
Um desses exemplos de simplicidade é o SQL Mode, você já tentou inserir um valor em uma coluna númerica sendo que esse valor ultrapassa o limite daquele tipo de dado no MySQL?
Vamos demonstrar:
mysql; create table teste_sql_mode (col1 smallint);
Query OK, 0 rows affected (0.08 sec)
mysql; select @@global.sql_mode, @@session.sql_mode;
+-------------------+--------------------+
| @@global.sql_mode | @@session.sql_mode |
+-------------------+--------------------+
|                   |                    |
+-------------------+--------------------+
1 row in set (0.00 sec)
mysql; insert into teste_sql_mode values (9),(99),(999),(9999),(99999),(999999), (9999999);
Query OK, 7 rows affected, 3 warnings (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 3
Perceba que apesar do comando ser executado com sucesso 3 warnings são mostrados (o problema é que dificilmente sua aplicação trata esse tipo de resultado). Quando verificamos quais são os warnings veja o resultado:
mysql; show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1264 | Out of range value for column 'col1' at row 5 |
| Warning | 1264 | Out of range value for column 'col1' at row 6 |
| Warning | 1264 | Out of range value for column 'col1' at row 7 |
+---------+------+-----------------------------------------------+
3 rows in set (0.00 sec)
Lendo essa saída você imaginaria o que o MySQL fez com as três linhas inseridas que extrapolaram o limite do datatype?
mysql; select * from teste_sql_mode;
+-------+
| col1  |
+-------+
|     9 |
|    99 |
|   999 |
|  9999 |
| 32767 |
| 32767 |
| 32767 |
+-------+
7 rows in set (0.00 sec)
Assustador? Não, nem tanto. Como eu disse devido ao pequeno custo de performance para que o parser tenha que tratar esse e inúmeros outros casos o MySQL (por padrão) opta por esse comportamento de aceitar a maior quantidade de informações possíveis, o que pode ser útil em inúmeros casos. Assustador seria se esse comportamento fosse o único possível, mas para alterar esse comportamento para um mais tradicional é muito simples:
mysql; set session sql_mode='traditional';
Query OK, 0 rows affected (0.00 sec)
mysql; select @@global.sql_mode, @@session.sql_mode;
+-------------------+-------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode | @@session.sql_mode                                                                                                            |
+-------------------+-------------------------------------------------------------------------------------------------------------------------------+
|                   | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |
+-------------------+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Agora vejam o que acontece se repetimos o teste anterior:
mysql; truncate table teste_sql_mode;
Query OK, 0 rows affected (0.00 sec)
mysql; insert into teste_sql_mode values (9),(99),(999),(9999),(99999),(999999), (9999999);
ERROR 1264 (22003): Out of range value for column 'col1' at row 5
mysql; select * from teste_sql_mode;
+------+
| col1 |
+------+
|    9 |
|   99 |
|  999 |
| 9999 |
+------+
4 rows in set (0.00 sec)
Como vocês notaram na tentativa de inserir a quinta linha, por estar fora dos limites do datatype um erro é retornado e somente as 4 primeiras linhas são inseriras.
Esse tipo de comportamento também ocorre em vários outros momentos e na maioria das vezes passa totalmente desapercebido tanto para um usuário utilizando o cliente mysql como para uma aplicação manipulando dados no banco. Acredito que se você parar para analisar o perfil de aplicativos de utilizam como solução de banco de dados (ou de um mero repositório de informações) o MySQL vai chegar a conclusão que esse comportamento é satisfatório para a maioria dos casos, portanto é compreensivel entender o porque do parser de comandos do MySQL ter esse comportamento.
O SQL Mode representa um conjunto de regras que refina como o parser de comandos do MySQL irá tratar os comandos submetidos para ele, para ser mais claro segue abaixo uma listagem das opções de itens que podem ser configurados por essa parametrização:
  • ALLOW_INVALID_DATES
  • ANSI_QUOTES
  • ERROR_FOR_DIVISION_BY_ZERO
  • HIGH_NOT_PRECEDENCE
  • IGNORE_SPACE
  • NO_AUTO_CREATE_USER
  • NO_AUTO_VALUE_ON_ZERO
  • NO_BACKSLASH_ESCAPE
  • NO_DIR_IN_CREATE
  • NO_ENGINE_SUBSTITUTION
  • NO_FIELD_OPTIONS
  • NO_KEY_OPTIONS
  • NO_TABLE_OPTIONS
  • NO_UNSIGNED_SUBSTRATCION
  • NO_ZERO_DATE
  • NO_ZERO_IN_DATE
  • ONLY_FULL_GROUP_BY
  • PIPE_AS_CONCAT
  • REAL_AS_FLOAT
  • STRICT_ALL_TABLES
  • STRICT_TRANS_TABLE
Abaixo segue outras opções que representam grupos de opções:
  • ANSI
  • DB2
  • MAXDB
  • MSSSQL
  • MYSQL323
  • MYSQL40
  • ORACLE
  • POSTGRESQL
  • TRADITIONAL
Um detalhamento sobre cada uma das opções pode ser obtido na documentação do produto.
Com essa explicação e essa listagem agora podemos falar sobre como o MySQL pode trabalhar mais complacente com o Oracle (e com as principais outras tecnologias de banco de dados). Basta você configurar o SQL Mode do seu MySQL como Oracle, ao fazer isso as seguintes parametrizações são habilitadas:
mysql; set session sql_mode='oracle';
Query OK, 0 rows affected (0.00 sec)


mysql; select @@session.sql_mode;
+----------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode                                                                                              |
+----------------------------------------------------------------------------------------------------------------------+
| PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER |
+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Logicamente as diferenças entre MySQL e Oracle não são somente essas, mas com certeza se você pensa em migrar sua aplicação entre essas duas tecnologias de banco de dados isso pode lhe ajudar bastante a diminuir o tempo gasto adaptando códigos, ou ainda pior, ajudando você a evitar que um mesmo código se comporte de maneira diferente em diferentes bancos (isso acontece com grande frequência, principalmente quando falamos de controle de transações e modo de isolamento).
Um último detalhe importante é o fato dessa variável ter dois escopos distintos, ela pode ser configurada globalmente tendo assim seu valor válido para todas as sessões ou pode ser configurada somente para uma sessão específica. Essa última opção aliada com o fato dessa parametrização ser dinâmica ajuda em muito a testar a viabilidade de implementação da mesma, lembrando que quando quiser tornar essa modificação definitiva você deve alterar seu arquivo de opções my.cnf (caso você esteja em ambientes windows esse arquivo é normalmente nomeado como my.ini).

segunda-feira, 26 de abril de 2010

Algumas Diferenças entre o Oracle e o MySQL

Nas últimas semanas venho trabalhando com um banco de dados MySQL que possui algumas tabelas com um volume considerável de dados para a realidade do MySQL, na minha opinião.

São três tabelas que juntas hoje correspondem a aproximadamente 50GB de dados (somando a elas seus respectivos índices) e são acessadas de uma única vez a partir de uma junção. Além disso essa junção é feita a partir das chaves primárias das tabelas e a tabela principal da consulta também é filtrada por um índice, ou seja, podemos assumir quepelo menos alguns cuidados foram tomados na construção da consulta.

Tudo corria bem nesse ambiente até que a quantidade de linhas dessas tabelas chegou na ordem de dezenas e centenas de milhões e foi ai que após alguns ajustes de parâmetros de memória para o storage engine em questão (MyISAM, key_buffer_cache, net_buffer_length, max_allowed_packet, myisam_use_mmap, etc.), muitos explains e muitos show profiles comecei a notar que diferentemente do que eu estava acostumado com o modo do Oracle trabalhar (hash joins, full table scans, etc. para esse perfil de consultas) o MySQL optava pelo velho "nested loop", mas por que?

Consultas e mais consultas em foruns me mostravam que existia um certo "dito popular" que esse seria o limite do MySQL, apesar de ficar claro para mim que não passava de um mito, mais um deles alias, serviu de constatação que realmente o MySQL era mais "recomendado" para o perfil de transações de aplicações web, ou seja, curtas e rápidas.

Além dessa última constatação usei esse fato para motivar um teste comparativo de performance entre os SGBDs que estou mais acostumado a trabalhar, Oracle e MySQL. A idéia foi bem simples, vamos fazer o MySQL imitar o Oracle e o Oracle imitar o MySQL e o resultado mais fatídico ainda: Uma lástima!

Inicialmente apostei que o Oracle trabalharia com Full Table Scans e realizaria o Join utilizando o algoritmo de Hash, com base nessa aposta e a utilização de hints tentei forçar esse comportamento no MySQL resultado: O MySQL não possui algoritmo de Join baseado em Hash na tentativa de forçar outros algoritmos que trabalhassem melhor com o acesso Full da tabela não obtive nenhum resultado satisfatório, na verdade os resultados foram bem piores do que otimizador tinha obtido com seu plano de acesso original.

Chegou a hora então de importarmos os dados no Oracle e ver se a aposta foi certa. Utilizando alguns recursos triviais do MySQL como o Storage Engine CSV e o SQL*Loader do Oracle rapidamente consegui importar os dados do MySQL/MyISAM para o Oracle.

Inicialmente notei que cerca de 25% a mais de espaço foi necessário para comportar a mesma quantidade de dados (ou seja, perspectiva de mais I/O e de mais uso de memória). Uma vez carregado gerei o plano de acesso da consulta e pela primeira vez não obtive surpresa, Full Table Scans e Hash Join, resultado melhor performance que o MySQL, porém nada muito significativo em um primeiro momento, ou seja, não justificava o custo da migração. Os testes com o Oracle utilizando os algoritmos propostos pelo MySQL também não foram interessantes em termos de resultado.

Resultados a parte e considerando que não tive muito a preocupação de isolar as variáveis nesse "benchmark" (hardwares diferentes e o fato de posteriormente nos testes com a utilização de particionamento consegui equilibrar bastante essa diferença de performance) o principal aprendizado que ficou foi o seguinte: Cada SGBD conhece bem seus limites, seja em relação a algoritmos ou em relação a adaptatividade ao hardware disponível e tentar fazer com que um SGBD se comporte como se estivesse influenciado pelo otimizador de outro SGBD não é certeza de sucesso, mesmo que no outro SGBD os resultados sejam tentadores.

Cada SGBD possui seu perfil de aplicação que se comporta melhor com eles, cada um deles também possui um custo (ou nenhum custo) de licenciamento ou suporte, e cada um deles irá exigir mais ou menos trabalho de um DBA para se adaptar as necessidades das aplicações, mas em termos de performance de consultas individuais, seja envolvendo grande volume de dados ou poucas linhas, ainda não encontrei nenhuma bala de prata!





segunda-feira, 7 de dezembro de 2009

Backup Open Source com Bacula

Venho pesquisando a um certo tempo o Bacula, uma ferramenta Open Source que alguns já devem ter ouvido falar. A idéia é iniciar com alguns posts tentando passar em detalhes o funcionamento desta ferramenta e publicar os diversos testes realizados em laboratório e informações sobre gerenciamento e monitoração.


INTRODUÇÃO

O Bacula (http://www.bacula.org) é uma ferramenta modular, ou seja, seus componentes podem ser instalados separadamente o que na minha opinião é a principal característica desta ferramenta, pois facilita na administração, escalabilidade e monitoração.

Outro ponto interessante é a facilidade de instalação. Com apenas 3 arquivos de configuração é possível colocar a ferramenta no ar.

- O Bacula Director, responsável pelos Jobs de Backup, Filesets (estrutura de arquivos e diretórios que serão backupeados), Storages, Catálogo de Dados e Schedules, como podemos ver é a partir deste arquivo que as coisas começam a funcionar.

- O Bacula FileDaemon faz a interface com o Client que será backupeado, informa o que deve ou não ser backupeado.

- O Bacula Storage Daemon onde os Storages e/ou unidades de fita são configurados para armazenamento dos dados.

Muitas das características encontradas em ferramentas do tipo BackupExec e AcrserveIT, podem ser encontradas também no Bacula.


CARACTERÍSTICAS DO BACULA

• Estrutura cliente / servidor;
• Licença GPL (sem custos com licenciamento)
• Disponibilidade para Servidores Windows, Linux e plataforma MAC;
• Possibilidade de execução de scripts pré e pós backup/restore;
• Ferramentas de administração via console ou interface GUI;
• Envio de mensagens de logs para backup/restore via email.


A operação do Bacula ocorre através do utilitário "bconsole" onde é possível visualizar os jobs de backup, storages e agendamentos e muito mais em um bom nível de detalhamento.

Para quem pensa em adquirir uma ferramenta de backup proprietária vale a pena pensar antes de gastar e pelo menos realizar um teste com o Bacula, pois não custa nada mesmo, certo?

Bom, acho que deu para ter uma idéia superficial da ferramenta e principalmente parar alguns minutos para pensar um pouco em backup. Aliás, recomendo a visita a este site (http://www.taobackup.com/) antes de sair instalando qualquer ferramenta de backup por aí.


domingo, 6 de dezembro de 2009

Noções Básicas de Modelagem de Dados

No começo do ano preparei um material que utilizei em uma apresentação sobre noções básicas de modelagem de dados e a convite da equipe de marketing da Locaweb transformei essa apresentação em um webcast.

A idéia não é só ter um primeiro contato com o processo de modelagem de dados, mas sim ter uma visão sobre o que conseguimos extrair de proveito de um banco de dados, o que fazer e o que não fazer.

A apresentação é um tanto quanto longa, aproximadamente 1 hora, e a idéia não é que você ao terminar a apresentação se torne o papa da modelagem de dados, mas pelo menos quebre alguns dos paradigmas e mitos que existem sobre essa área.

http://www.vimeo.com/5275437

quarta-feira, 2 de dezembro de 2009

Boas Práticas MySQL

Motivado na construção de uma solução de backups para os meus ambientes de MySQL me defrontei com alguns questionamentos importante sobre que linha seguir. Quando falamos de backups de banco de dados invariavelmente caímos na discussão de qual melhor forma de proteger nosso ambiente, com backups lógicos ou físicos.

Segundo a Oracle um backup lógico, o dump, não pode ser considerado um backup por si só, mas sim um complemento de backup. O backup lógico normalmente é utilizado para situações onde uma restauração de somente algumas linhas, por exemplo é necessária. Algumas outras questões como migrações entre versões ou diferentes plataformas o dump pode ser o único recurso.

Já o backup físico, o "verdadeiro backup" particularmente no MySQL parece ter uma performance surpreendente, principalmente levando em conta o fato do tempo de restore (o dump deixa muito a desejar). Apesar dessa performance atrativa venho enfrentando alguns problemas, aparentemente o utilitário (em perl) responsável por executar o backup físico no MySQL, mysqlhotcopy, é restrito aos storage engines myisam e archive, o que acaba rementendo a um fator negativo dessa independencia que o MySQL tem em seus gerenciadores de tabela.

Aparantemente se você tiver necessidades de performance principalmente no seu procedimento de backup terá de combinar utilitários prontos como o mysqldump e o mysqlhotcopy (existem ferramentas pagas) ou desenvolver seu próprio utilitário.

Em relação a necessidades de performance tenho um banco de dados que possui um tamanho relativamente consideravel de índices, o que me fez recorrer da opção --noindices. Reduzindo 30% praticamente o tamanho de backup e consequentemente no tempo, o que me pareceu uma ótima opção, mas está resultando em uma certa dor de cabeça para reconstruir esses índices utilizando o myisamchk -r.

Procurando por respostas sobre como corrigir esse problema encontrei um workshop sobre segurança e backup em MySQL que acredito que seja de muito bom uso para quem está iniciando nessas áreas de adminsitração no mysql:

http://www.archive.org/details/mysql_backup_security
http://szeged2008.drupalcon.org/files/mysqlBackupSecurity-DrupalCon-2008-08-28.pdf

Aproveitei a oportunidade e enviei um e-mail para o palestrante para ver se consigo alguma luz.

Bom proveito da palestra.




quinta-feira, 26 de março de 2009

Árvore de diretórios do Linux - FHS

FHS (Filesystem Hierarchy Standard) é um tema que muita gente não conhece. Bom, até aí não vejo problema algum, porém, fico pensando como algumas pessoas conseguem trabalhar sem antes conhecer a estrutura de diretórios de um sistema operacional.

O FHS é uma referência para desenvolvedores, administradores, enfim, para quem se interessar pelo assunto. Para trabalhar com qualquer ambiente, antes de mais nada precisamos saber como ele funciona, isto é básico para qualquer pessoa que trabalha com tecnologia.

Um ponto importante sobre este assunto. Particionamento do sistema que está sendo instalado. Devemos nos preocupar em particionar um sistema operacional para que ele possa ter: desempenho, segurança e redundância. A escolha do filesystem ideal, utilizar RAID e LVM, restrições de acesso a um determinado volume, tudo isto deve ser planejado antes de instalarmos qualquer sistema operacional.

Alguns exemplos da estrutura proposta pelo FHS:

  • /etc - arquivos de configuração do sistema operacional e demais pacotes instalados
  • /dev - diretório de dispositivos
  • /opt - utiizado para instalação de softwares de terceiros
  • /usr - contém comandos e aplicativos que são instalados

Vocês podem obter mais informações através do site: http://www.pathname.com/fhs/.

Dica: Faça o download do arquivo pdf, versão 2.3 (ah, mas é chato ficar lendo isto...) eu sei, mas quem já não ouviu falar em bash?

abraços e até a próxima.

domingo, 22 de março de 2009

Eliminando Enqueue no Oracle

Modelo de dados construidos por desenvolvedores, aplicações que não foram devidamente testadas, bancos que cresceram fora do planejado e uma série de outras causas podem resultar no famoso pedido de socorro (nada técnico) "O banco está travado"!

Vamos tentar desmistificar um pouco do que acontece nesses momentos de "tensão" dentro do banco de dados. O principal ponto nesse tema é o mecanismo de "lock" do banco de dados Oracle. Para permitir que múltiplos usuários acessem e manipulem as linhas das tabelas dentro de um esquema o Oracle possui um mecanismo para garantir a integridade e consistência dos dados. o lock. Caso queiram entender melhor os detalhes segue um link da documentação do produto: http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT221.

Dependendo do tipo de "lock" que um comando submetido ao banco de dados o Oracle poderá sempre que necessário utilizar um estrutura de memória para garantir o bom funcionamento do banco, essa estrutura de memória é chamada de Enqueue (http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/enqueues.htm).

Reunimos agora todos os ingredientes necessários para chegarmos onde vocês esperam, códigos. Quando o "banco está travado" o primeiro candidato a causa do "problema" é algum objeto estar com um lock que impede que outra sessão utilize o recurso desejado, temos então um enqueue. Para identificar se existe um lock ou um enqueue podemos utilizar a seguinte consulta:

SQL> select a.username ||'@'||a.machine || ' session id = ' ||a.sid || ' esta bloqueando '
|| b.username ||'@'||b.machine || 'session id = '||b.sid
from v$lock c,
v$session a,
v$lock d,
v$session b
where a.sid=c.sid
and b.sid=d.sid
and c.block=1
and d.request > 0
and c.id1 = d.id1
and d.id2 = d.id2;

Existem inúmeras consultas para identificar um lock e possivelmente um enqueue, sinta-se à vontade para utilizar a mais conveniente para você, algumas delas já apontam qual tabela, qual linha e até qual bloco estão envolvidos no lock, mas meu objetivo aqui é como você evita (ou antecipa) um deadlock.

Um deadlock ocorre quando uma dependência ciclica ocorre envolvendo as estruturas de lock e enqueue. Após um determinado tempo o banco de dados elimina uma das sessões para que a outra consiga prosseguir com sua transação e o banco de dados possa retomar ao seu curso normal, porém esse tempo pode não ser interessante para você, ou ainda, você pode querer optar por qual das sessões você quer eliminar (de repente aquela procedure que alguem disparou no momento errado).

Para eliminar a sessão que está causando o enqueue no seu banco, primeiro a identifique, por exemplo, a partir da consulta acima descrita, depois execute os seguintes comandos:

SQL> select sid, serial#
from v$session
where sid = 999;

-- substitua 999 pelo sid que você identificou como responsável pelo enqueue.

Passo 1) Seja sutil

SQL> ALTER SYSTEM KILL SESSION 'sid_number, serial_number';

-- substitua o sid_number e o serial_number pelos valores obtidos na primeira consulta

Caso após essa tentativa a sessão em questão ficar com o status KILLED você pode aguardar o banco fazer a parte dele ou antecipar alguns passos. Resumindo a sessão está "agonizando" e você quer "acabar com o sofrimento dela".

SQL> select sid, status
from v$session
where sid=999;

Verifique se o status da sessão está KILLED, caso esteja prossiga com os próximos passos, caso não existam linhas para o SID em questão, a sessão já passou dessa para uma melhor.

Passo 2) Últimas palavras

Para "acabar com o sofrimento" da sessão identifique qual o processo do sistema operacional é responsável por aquela sessão (cuidado se você utiliza dispatchers):

SQL> select spid
from v$process
where addr=(select paddr from v$session where sid=999);

Uma vez que você identificou o processo do sistema operacional vá para a shell do linux ou unix como root e:

kill -9 99999

Onde 99999 é o valor retornado para o SPID da consulta anterior. (Verifique antes se o processo que você está executando kill é um processo do oracle, com padrão oracleSID, onde SID é o nome da sua instância).

Passo 3) Sumindo com o corpo.

Talvez o kill -9 não seja suficiente para você eliminar de vez essa sessão, para essas sessões que costumo chamar de sessões "Mcloud" você ainda tem um último artificio:

SQL> ALTER SYSTEM DISCONNECT SESSION 'sid_number,serial_number' IMMEDIATE;

Bom amigo se após esse passo sua sessão continua como KILLED, só o tempo ou um shutdown no seu banco para ela ir embora de vez.

Vou ficando por aqui e sei que passei por cima (muito rapidamente) de vários conceitos, portando deixem seus comentários que vou respondendo aos poucos.

Abraços,
Caio Spadafora.

quinta-feira, 12 de março de 2009

Oracle Open World - Terceiro Dia - 12/03/2009

Último dia de evento, e mais alguns rostos familiares, mais conversas com o Ashish e palestras interessantes. Quanto a novidades vale destacar alguns conceitos novos de backup que não conhecia como o Cloud Backup e ainda o conceito de CRM 2.0 ressaltando o poder das redes sociais em uma estratégia de CRM.

Quanto a backup vale destacar que não tivemos muitos avanças em relação as propostas de 2007, continuamos em cima dos conceitos de Flashback e as maravilhas que o RMAN nos proporciona, mas gostei de conhecer melhor algumas coisas novas, principalmente o Oracle Secure Backup (que infelizmente ainda não integra o conceito de Free Lan Backup)

Bom, mas não podia deixar acabar o evento sem fazer uma pergunta ao nosso amigo Ashish, que para quem ainda não conhece trata-se do (não se assustem) Product Manager de High Availability na Oracle. E que pergunta foi essa? Quando sairá a Release 2 do 11g rs... A resposta é no minimo em 3 meses e no máximo até o final do ano... minha opinião em Setembro deveremos ter já o produto disponível para download.

Espero que tenham gostados dos posts sobre o evento e me comprometo a detalhar melhor cada novidade e curiosidade que tive acesso no evento, mas vou precisar de um post para cara produto, afinal são muitas coisas interessantes para não dedicar um post inteiro.

Para quem se interessar odas as fotos do evento estão disponíveis no slide show do blog e fiz também algumas gravações interessantes que vou publicando aos poucos. Quem tiver dúvidas sobre as últimas tecnologias da Oracle, por favor, comentem que tento responder, e caso não saiba agora tenho como encaminha-las para os gestores dos produtos na própria Oracle.

Até o próximo post... Vou tentar conversar sobre um tema bem interessante que é como resolver os problemas daqueles comandos que parecem intermináveis e resultando em uma série de processos enfileirados que literamente parecem travar todo seu banco e dados.

Abraços...

quarta-feira, 11 de março de 2009

Oracle Open World - Segundo Dia - 11/03/2009

Mais um dia de evento e hoje consegui dividir melhor meu dia entre sessões técnicas e demonstrações. Antes de mais nada hoje foi um dia mais familiar, encontrei vários amigos do mundo Oracle e revi todo o pessoal que conheci ontem, mas voltando para o que interessa pra vocês vou começar falando das demonstrações.

Ontem acompanhei somente a demonstração do Oracle Advanced Compression, em compensação hoje consegui ver demonstrações sobre temas como Oracle VM, Oracle Enterprise Linux, Database Replay, Oracle Data Masking... bom e muitos outros produtos, acredito que amanhã mais uns 3 Demo Grounds e posso me considerar satisfeito com o evento, mas teve um hoje em específico que caberá um lab mais pra frente, trata-se do Oracle TimesTen Database, um banco de dados "in-memory" mas que foge da idéia de Full Data Caching que já estamos acostumados... por favor me cobrem os resultados desse lab, afinal cheguei a ver ganhos de performance de até 72x, ou seja, 7.200 % de ganhos.

Além das demonstrações acompanhei os Key Notes apresentando mais detalhes da estratégia da Oracle principalmente em relação a parceria com a HP, tudo isso para anunciar o lancaçamento de dois hardwares da Oracle... acreditem agora temos até hardware. Lógico que sem a ajuda da HP isso talvez demorasse um tempo maior, mas a Oracle comentou sobre o Oracle Exadata e o container Oracle Database Machine, com ganhos de performance e aproveitamento de hardware muito bom, o valor é caro, mas comparando com a concorrência ele parece até "barato", apensa $650.000,00 dólares.

Pra finalizar o dia ainda acompanhei palestras sobre abordagens de tuning, desde o que foi chamado da era pré-histórica do Oracle 5 até as últimas novidades como AWR, ADDM, etc (muitas siglas novas também). Cabe ainda mais um vídeo que fiz sobre maiores explicações de ILM, está ai mais um conceito que veio pra ficar...

Bom vou ficando por aqui e amanhã venho com o que rolou na finalização do evento.
Abraços!

terça-feira, 10 de março de 2009

Oracle Open World - Primeiro Dia - 10/03/2009

Prezados colegas, agora são 23:40 da noite e tentarei em um último esforço de me manter com os olhos abertos contar o que presenciei no primeiro dia de evento do Oracle Open World 2009 - LA. Foram disponibilizadas algumas fotos do pavilhão de exposições e das sessões com palestrantes, que por sinal foram muito boas (assim que conseguir o material apresentado tentarei comentar sobre o que nos foi apresentado).

Para quem já esteve presente em algum dos Oracle Open Worlds (essa é a terceira edição aqui no Brasil) não tivemos nenhuma novidade em relação ao formato do evento, ou seja, demo grounds, stands de expositores, sessões com a alta cúpula da Oracle e seus parceiros e stands mais técnicos com vários palestrantes tanto da Oracle como de outras empresas de TI.

Falando mais especificamente sobre o dia de hoje, começamos ouvindo ninguem mais ninguem menos que Safra Catz, ou melhor dizendo, a presidente mundial da Oracle, que salientou a estratégia da empresa sobre consolidar o fornecimento de software e serviços com uma única empresa. Seguindo a manhã ouvimos mais sobre o posicionamento da Oracle ouvindo o responsável por telecomunicações da Oracle, Shaskar Golti (somente o primeiro de muitos indianos que com certeza conhecerei no evento) que também contou com a participação de João Cox, presidente da Claro, sobre o ainda potencial mercado de telecomunicações no Brasil.

Para finalizar os keynotes do dia contamos com uma palestra do Gerente Geral da América Latina da IBM, Rogério Oliveira, apresentando o novo conceito da IBM (que por sinal achei muito bom) que é o Smarter Planet, apresentando a estratégia e alguns casos de sucesso de onde foram e podem ser aplicados os avanças tecnológicos para melhorar a saúde e bem estar do planeta. Exemplos de sucesso como aproveitamento energético e questões urbanas como o trânsito na cidade foram usados como exemplos já implantados, vale muito a pena ir atrás para quem ainda não viu essa nova proposta da IBM.

Sessões Técnicas)

Desde o final da manhã até o fim do evento praticamente só ouvi as sessões técnicas, especificamente no track de Banco de Dados (para quem não sabe essa era uma pequena parte do evento, a Oracle já faz alguns anos que investe pesado em aquisições e reposicionamento da marca para atender todo o "stack" de soluções corporativas para diferentes mercados). As palestras que assisti foram:
  1. Lidando com a Virtualização: Como o Oracle Enterprise Manager Pode Acabar com Seus Pesadelos sobre Gerenciamento.
  2. Um Guia sobre Atualizações de Banco de Dados.
  3. SQL Performance Analyzer: Eliminação de Conjectura de SQL desempenho.
  4. Anatomia de Roubo de Dados: Como Ocorrem e como Proteger-se Contra eles.
  5. Oracle Advanced Compression: Jogue Fora Metade dos Seus Discos e Execute seu Banco de Dados Mais Rápido.
As palestras foram muito interessantes apesar do cansaço cada uma tinha duração de aproximadamente 45 minutos, e sem desmerecer nenhum palestrante conversei pessoalmente com dois deles que foram de extrema importância para mim: Ashish Ray e Paul Needham, cada um deles na sua área de atuação me esclareceram alguns conceitos interessantes sobre Advanced Compression dentro do Data Guard e sobre dúvidas de implementação do Defence-in-Depth (respectivamente). Tive o privilégio de conseguir o e-mail desses "papas" da Oracle e pretendo em breve encher a caixa-postal deles com dúvidas.

Para quem quiser saber detalhes de todas as sessões que aconteceram e ainda vão acontecer o link é:

Sessões do Oracle Open World LA 2009)

http://www21.cplan.com/cc223/content_catalog.jsp?ilc=223-1&ilg=portuguese&isort_sessions=&isort_demos=&isort_exhibitors=&is=yes&ip=%3C%2Fipresentations%3E&isort_sessions_type=&isort_exhibitors_type=&isort_demos_type=&search_sessions=yes&icriteria1=+&icriteria2=+&icriteria5=+&icriteria8=&icriteria9=+&icriteria6=&icriteria3=+&icriteria7=


Bom vou ficando por aqui, ainda tenho mais 2 dias de eventos e muita novidade deve vir por ai... Não tive nem tempo de comentar sobre os Demo Grounds que eu visitei e sobre os vídeos que fiz, mas prometo que amanhã tento passar mais detalhes de como foi o dia no Oracle Open World. (Visitem o evento, para quem quiser visitar os stands e demo grounds a entrada é R$ 80,00 e vale a pena).

Abraços e até!!!



Introdução, Segurança em IPV6

Este é o primeiro post do blog sobre Segurança, então vamos começar falando de um assunto polêmico, IPV6.

Pensem na seguinte pergunta. Por que IPV6?

A resposta parece simples, pois é, só parece. Vejam algumas considerações:

  • Dispositivos Móveis (3G, TVD...)

  • Conexões Always-on

  • Crescimento demográfico da internet

  • Endereços IP disponibilizados de maneira ineficiente

Estes são apenas alguns pontos que podemos considerar para começarmos a refletir sobre o assunto.

Para mitigar o risco de esgotamento dos endereços IP certas medidas estão sendo tomadas, como por exemplo: utilização de NAT (Network Address Translation) na verdade NAT não foi feito para isto, mas ... no IPV6 estes problemas acabaram, DHCP/Redes Privadas e controles mais eficazes de atribuição de endereços.

Mas existe um pouco de história na questão "Esgotamento de endereços IPV4". Em 2003, de acordo com critérios de alocação da época, a exaustão de endereços ocorreria em 2023. Já em 2005 a exaustão seria de 4 a 5 anos e agora, em 2007, fim em 2011.

Agora, vejam só os números:

  • IPv4 – 232 endereços, ou ~4,3 bilhões de endereços

  • IPv6 – 21282128 endereços, ou ~3,4x1038 endereços

  • ~3.400.000.000.000.000.000.000.000.000.000.000.000.000

  • ~5x1028 endereços para cada pessoa viva hoje (6,5 bilhões de pessoas)

  • 50.000.000.000.000.000.000.000.000.000 endereços por pessoa

  • ~4.503.599.627.370.500 de endereços para cada estrela no universo conhecido

Não é piada. É isto mesmo. Desde o início da utilização do IPV4, por volta de 1993 ninguém imaginou que estes endereços esgotariam.

E como funciona a segurança do IPV6. Firewalls, IPS e IDS. Eles estão preparados para o IPV6?

Como diria meu grande amigo Caio "Não, sim, talvez"

Este será meu próximo post.

Abraços e até lá!

Backup! ARGHH!!! Eu gostaria de ter feito.

Olá pessoal, hoje inicio minha vida de "blogueiro postador". Confesso que tudo isso é muito novo pra mim, portanto, tenham paciência, se não tiver, pode criticar, afinal de contas, elas serão bem vindas para mim e para o bem do blog.
Para o meu primeiro post, escolhi um assunto que por coincidência é o dos assuntos que mais tive contato na carreira (tudo bem que ela não é tão grande assim), estou falando de BACKUP.

Um belo dia ouvi de um amigo, no exato momento em que tentava planejar a melhor política de backup para a empresa em que trabalhávamos, a seguinte frase:

-"Existem 2 tipos de analistas. Os que fazem backup e os que gostariam de ter feito!"

Apesar de parecer uma piada, levo essa frase como uma lição a ser seguida pra sempre.

Backup é coisa séria, muitas vezes estamos falando de registros que contam a história financeira da empresa ou talvez de um banco de dados com todos os produtos, enfim cada empresa tem seu registro, são inúmeros os exemplos e cada um sabe muito bem qual a sua importância.

Importância que muitas vezes só é conhecida ou lembrada nos momentos de caos, somente quando a informação vital é perdida. Em muitos casos nesse ponto a informação não pode mais ser recuperada.

Isso torna-se um ciclo vicioso, pois a informação deve ser backupeada, mas não existe um investimento (e algumas vezes conhecimento) que garanta que o backup seja realizado e armazenado da maneira correta.

Quando for definir sua política de backup analise, a importância da informação, qual a quantidade de informação pode ser perdida (afinal de contas backup real-time, tem lá suas cifras $$$$), por quanto tempo ela deve ser guardada, qual a periodicidade que ela deve ser backupeada.

Tenham em mente que fenômenos naturais (chuva, furações, tsunamis, etc...) e até mesmo ataques terroristas, guerras civis, podem influenciar na vida do seu backup. Portanto considere também armazenar uma ou mais cópia(s) do seu backup, alguns kilômetros de distância. Existem normas técnicas, até mesmo da ISO que definem isso!

E por final faça testes periódicos de restore, afinal de contas ter o backup não significa ter o dados a qualquer momento.

Caso seu backup seja terceirizado, acompanhe de perto também. Acredite, já ouvi de vendedores dizerem:

-"Esse cliente contratou somente o backup, não contratou o restore!"

Enfim, para os que ainda não entenderam o recado, backup é coisa séria, todos os detalhes devem ser analisados, questionados e os recursos financeiros conciliados as necessidades, afinal de contas em tempos de crise, até backup é afetado.

Os próximos posts serão mais técnicos, esse foi mais conceitual, para quebrar o gelo também. Irei abordar algumas práticas de armazenamento, políticas, softwares utilizados no mercado (free e pago), entre outros.

Um abraço a todos! Tenho que correr, pois esse blog ainda está sem backup!!! rsrsr :-)

segunda-feira, 2 de março de 2009

Auditoria MySQL

Meu primeiro post será dedicado a segurança em banco de dados. Desde já deixarei claro que trabalho administrando bancos de dados Oracle, mas esse primeiro post será destinado principalmente para bancos MySQL, portando possivelmente poderá haver algum erro. A idéia desse blog é abordar sempre que possível assuntos relacionados aos problemas rotineiros que você encontra em seu site na web, logicamente o conteúdo aqui descrito pode ser aplicado para qualquer fim, mas o exemplo abaixo será o mais simples possível com intúido de somente ilustrar o que pode ser feito para você agregar mais segurança para seu site e principalmente ao seu banco de dados.

Sabe-se que atualmente os problemas de segurança se centralizam principalmente nas ameaças internas, alguns estudos revelam que a porcentagem de problemas causados por esse tipo de ameaça corresponde a 70% do total de ameaças e sabendo também que muitas vezes a falta de tempo de desenvolvimento e a ausência de preocupações com segurança em detrimento da facilidade de implantação nos levam a uma frase bem oportuna, que é o slogan de um dos produtos da Oracle: "Trust but Verify".

Esse é o slogam da ferramenta Oracle Audit Vault (que me comprometo a futuramente abordar em um post sobre segurança em sistemas corporativos), "traduzindo" podemos alegar que a confiança (Trust) citada pode ser encarada como a falta de tempo ou de comprometimento com segurança presenciada não somente no dia a dia de "desenvolvedores de fim de semana", mas também de grandes empresas que não se dão conta que o pior inimigo é aquele que está dentro de casa. Como não vamos falar de "confiança" mas sim de segurança, a palavra "Verify" é simplesmente traduzida em uma única preocupação, auditoria.

Analisando o mercado, oportunidades e seu comportamento esse slogan é bem revelador, sabendo que por via de regra são poucos que se preocupam na hora de conceder acesso e privilégios para seus usuários internos uma das saídas pode ser a auditoria, ou seja, saber quem, quando e o que foi feito antes de, por exemplo, alguem executar um update sem a cláusula where e ter comprometido todos os registros de uma tabela (vamos assumir que a transação por algum motivo também foi efetivada).

O exemplo dessa implementação de auditoria foi desenvolvido para bancos MySQL mas pode ser utilizado (com algumas adaptações) a maioria dos bancos de dados. Os pré-requisitos para essa implementação são que seu banco de dados suporte a utilização de triggers e que você tenha privilégios para uma vez modelada essa estrutura você possa criar essas tabelas, constraints e as triggers propriamente ditas.


Cenário Proposto)

Iremos assumir como exemplo uma tabela retirada de um modelo de dados de uma locadora de automóveis. A tabela em questão terá o nome de VEICULO e armazenará todas as principais informações sobre cada automóvel que pode ser alugado. Nesse exemplo abrirei mão das formalidades de normalizações para a idéia de auditoria fique mais clara.

CREATE TABLE VEICULO (
CODIGO INTEGER NOT NULL,
PLACA VARCHAR(20) NOT NULL,
MARCA VARCHAR(30),
MODELO VARCHAR(30),
KM INTEGER,
QUANTIDADE_LOCACOES INTEGER,
ANO INTEGER,
PRIMARY KEY(CLICOD));

Passo 1) Identificar as chaves e demais colunas que sejam importantes para caracterizar cada registro na tabela que será auditada:

Analisando em uma tabela as colunas que melhor se candidatam para identificar unicamente cada um de seus registros sempre escolheremos sua chave primária, que no nosso exemplo é a coluna CODIGO. Caso sua chave primária seja artificial (ou uma "surrogate key") você pode optar por escolher mais alguma coluna nesse caso a coluna que mais se candidata a esse papel é a coluna PLACA.

Passo 2) Modelar a tabela que servirá como destino dos logs de auditoria, bem como seus devidos relacionamentos:

Uma vez selecionadas quais colunas serão as "chaves" da tabela para modelar a tabela que será utilizada como destino das informações auditadas, utilizaremos além dessas chaves e de uma data, também informações do usuário, que pode ser no caso do MySQL o usuário do banco de dados (você pode expandir seu esquema de auditoria para capturar qualquer outra informação que você considerar relevante para identificar quem ou a partir de onde foi feita a manipulação).

Além dessas informações é crucial para sua auditoria que sejam capturadas informações das tabelas que sofreram alterações, minha sugestão é que seja captura os valores anteriores e posteriores a manipulação ocorrida:


CREATE TABLE AUDIT_VEICULO_LOG (
CODIGO INTEGER NOT NULL AUTO_INCREMENT,
PLACA VARCHAR(20) NOT NULL,
DATA_ALTERACAO DATETIME,
USUARIO VARCHAR(30),
NOME_COLUNA VARCHAR(30),
VALOR_ANTERIOR VARCHAR(100),
VALOR_POSTERIOR VARCHAR(100));

Passo 3)
Desenvolver as triggers:

Segue a codificação das triggers que são responsáveis pela auditoria de uma tabela. Dependendo de seu banco de dados você poderá desenvolver uma única trigger, mas para o MySQL acabei achando mais fácil montar uma trigger para cada tipo de DML. Para esse caso estou assumindo que existe uma tabela que armazena as informações dos usuários.

DELIMITER //

CREATE TRIGGER AUDIT_VEICULO_TBI BEFORE INSERT ON VEICULO
FOR EACH ROW
/*************************************************************/
/* Nome: AUDIT_VEICULO_TBI */
/* Autor: Caio Spadafora */
/* Objetivo: Gravar as informacoes de auditoria da tabela VEICULO */
/* Historico: 08/03/2009 - Caio Spadafora - Criacao. */
/*************************************************************/
BEGIN

/* Declarando variaveis */
SET @usuario=NULL;
SET @sysdate=NULL;

/* Recuperando o nome do usuario */
SELECT USUARIO
INTO @usuario
FROM USUARIO
WHERE usuario = (SELECT SUBSTR(USER(),1,INSTR(USER(),'@')-1));

/* Recuperando a data atual */
SELECT now()
INTO @sysdate;

/* Inserindo o historico de alteracao */
INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'CODIGO',NULL,NEW.CODIGO,@sysdate);

INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'PLACA',NULL,NEW.PLACA,@sysdate);


INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'PLACA',NULL,NEW.PLACA,@sysdate);


INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'MODELO',NULL,NEW.MODELO,@sysdate);


INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'KM',NULL,NEW.KM,@sysdate);


INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'QUANTIDADE_LOCACOES',NULL,NEW.QUANTIDADE_LOCACOES,@sysdate);


INSERT INTO AUDIT_VEICULO_LOG (CODIGO, PLACA, DATA_ALTERACAO, USUARIO, NOME_COLUNA, VALOR_ANTERIOR, VALOR_POSTERIOR)
VALUES (NEW.CODIGO,NEW.PLACA,@usuario,'ANO',NULL,NEW.ANO,@sysdate);

END//

DELIMITER ;

A idéia para auditar remoções é a mesma, a única alteração é que os valores que serão nulos serão os posteriores, já para a auditoria de atualizações a idéia é checar se o valor anterior é diferente do valor posterior e em caso afirmativo gravar as alterações.

Passo 4) Testar

Para testar essa solução simule inserções, atualizações e remoções de registros nas tabelas auditadas, de preferência com usuários diferentes, atente sempre para o horário em que a manipulação está ocorrendo e se todas as colunas estão sendo devidamente auditadas, afinal um erro de digitação pode ser percebido somente quando já é tarde demais e ai você já não poderá saber o que foi modificado.

Passo 5) Preocupações:

Para que seu esquema de auditoria seja efetivo algumas preocupações devem ser levadas em conta, a primeira delas é a utilização de usuários individuais dentro do seu dia a dia, desenvolvedores, aplicações e mesmo administradores devem sempre que possível possuir seu próprio usuário dentro do banco de dados, assim a informação de qual usuário está conectado ao banco no momento da alteração se torna muito mais valiosa.

A segunda preocupação seria em relação ao volume de dados que esses logs irão ocupar dentro do seu banco de dados, para isso o ideal é desenvoler um mecanismo de limpeza, ou purge, uma dica é a utilização do MySQL Events (disponível a partir da versão 5.1, para versões anteriores recorra ao agendamento do seu sistema operacional): http://dev.mysql.com/tech-resources/articles/mysql-events.html

Passo 6) Novidades

Em relação as últimas coisas que venho lendo sobre segurança da informação como um todo, alguns assuntos que valem a pena caso você queira se aprofundar mais no tema são contextualizar a segurança, ou seja, não tratar a segurança como sendo algo binário como por exemplo um simples password. Outro conceito bastante presente nos dias atuais é a gestão de identidade dentro de uma empresa, ou se preferir, Identity Management. Como última dica recomendo fortemente a leitura do blog de uma das pessoas responsáveis por segurança na Oracle e colunista da revista Oracle Magazine, Mary Ann Davidson, o link para seu blog é: http://blogs.oracle.com/maryanndavidson/


Vou ficando por aqui e qualquer dúvida, crítica ou sugestões estou à disposição pelo e-mail spadafora.caio@gmail.com.

Até uma próxima oportunidade.