Ténicas de Database Refactoring para ambientes 24x7

409 visualizações

Publicada em

Palestra apresentada no QConSP 2015.

Nessa palestra vamos abordar técnicas de design evolutivo para bancos de dados relacionais usando práticas de "Database Refactoring", parte fundamental do desenvolvimento ágil. Com exemplos que encontramos no dia-a-dia, iremos explorar técnicas e estratégias a serem usadas durante o desenvolvimento e também para o deploy em produção.

Seguimos com uma abordagem realista de como migrar versões em produção sem downtime. Veremos, por exemplo, como realizar migrações de versões de uma aplicação de forma que seja possível a utilização de duas versões em paralelo – permitindo migração parcial dos usuários ou a volta à versão antiga em caso de problemas (plano B).

Esta será uma palestra prática, usaremos o PostgreSQL como gerenciador de bancos de dados para demonstração das técnicas abordadas. Por fim, serão apresentados algumas dicas e truques do PostgreSQL e de outros SGDBs que ajudam na hora do deploy.

Publicada em: Dados e análise
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
409
No SlideShare
0
A partir de incorporações
0
Número de incorporações
22
Ações
Compartilhamentos
0
Downloads
3
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Ténicas de Database Refactoring para ambientes 24x7

  1. 1. T´ecnicas de Database Refactoring para ambientes 24x7 Matheus de Oliveira <matheus.oliveira@dextra.com.br> Apresentado no 27 de Mar¸co de 2015
  2. 2. Matheus de Oliveira <matheus.oliveira@dextra.com.br> DBA PostgreSQL – consultorias e suportes 24x7/8x5 Instrutor dos treinamentos PostgreSQL Concep¸c˜ao, desenvolvimento e suporte `a produ¸c˜ao
  3. 3. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” Instrutor dos treinamentos PostgreSQL Concep¸c˜ao, desenvolvimento e suporte `a produ¸c˜ao
  4. 4. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na pr´atica” Concep¸c˜ao, desenvolvimento e suporte `a produ¸c˜ao
  5. 5. Matheus de Oliveira <matheus.oliveira@dextra.com.br> Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na pr´atica” SaaS para an´alise e monitoramento PostgreSQL http://www.pganalytics.com.br/ “Facilitando a vida do DBA”
  6. 6. Database Refactoring
  7. 7. Database Refactoring abc “A simple change to a database schema that improves its design while retaining both its behavioral and informational semantics – in other words, you can neither add new functionality nor break existing functionality, nor can you add new data nor change the meaning of existing data.” Scott Ambler and Pramod Sadalage (2006). Refactoring databases: Evolutionary database design. Addison-Wesley. 4 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  8. 8. Database Refactoring abc • Segue a mesma ideia e princ´ıpios de refatora¸c˜ao de c´odigo, s´o que ´e considerado um pouco mais dif´ıcil. • Escrever e evoluir o c´odigo de forma disciplinada: ◦ nem t˜ao importante durante o desenvolvimento inicial (antes de entrar em produ¸c˜ao); ◦ essencial (pra todos?) ap´os ter entrado em produ¸c˜ao. • Desenvolvedores, DBAs, sysadmins... DevOps... Todos trabalhando juntos com um objetivo em comum 5 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  9. 9. Database Refactoring abc Estrat´egia: 6 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  10. 10. Database Refactoring abc Mais dif´ıcil do que parece: 7 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  11. 11. Database Refactoring – exemplos abc Podemos dividir os tipos de refatora¸c˜ao em 6 categorias: • Estrutural (structural); • Qualidade dos dados (data quality); • Integridade referencial (referential integrity); • Arquitetural (architectural); • M´etodos/fun¸c˜oes (method); • Transforma¸c˜ao (non-refactoring transformation). 8 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  12. 12. Database Refactoring – exemplos abc Incrementar o esquema ´e f´acil: 9 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  13. 13. Database Refactoring – exemplos abc SELECT ... FROM mensagens m LEFT JOIN usuario_local l ON l.usuario_id = m.de_id AND m.data_hora BETWEEN l.data_ini AND l.data_fim 10 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  14. 14. Database Refactoring – exemplos abc Em alguns casos, como no exemplo, n˜ao h´a necessidade de sincroniza¸c˜ao: • adicionar colunas `a tabelas, desde que essas possam ser NULL ou tenham um valor DEFAULT definido; • adicionar novas tabelas, vis˜oes ou fun¸c˜oes ao modelo; • adicionar fun¸c˜oes que mantenham compatibilidade. 11 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  15. 15. Database Refactoring – exemplos abc Mudar a estrutura j´a ´e mais complicado: 12 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  16. 16. Database Refactoring – sincroniza¸c˜ao abc Para muitos casos, como renomear uma coluna, mover de uma tabela para outra, remover uma tabela, entre outros; ´e necess´ario um mecanismo de sincroniza¸c˜ao. Estes podem ser feitos via: • gatilhos (triggers); • vis˜oes (views); • atualiza¸c˜oes em lote (batch updates); 13 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  17. 17. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  18. 18. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  19. 19. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  20. 20. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  21. 21. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); • Automatize tudo; 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  22. 22. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); • Automatize tudo; • Fa¸ca as pazes entre desenvolvedores e DBAs (dica: pair-programming entre ambos sempre que poss´ıvel)... =) ; 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  23. 23. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); • Automatize tudo; • Fa¸ca as pazes entre desenvolvedores e DBAs (dica: pair-programming entre ambos sempre que poss´ıvel)... =) ; • Teste... 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  24. 24. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); • Automatize tudo; • Fa¸ca as pazes entre desenvolvedores e DBAs (dica: pair-programming entre ambos sempre que poss´ıvel)... =) ; • Teste... • Teste... 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  25. 25. Database Refactoring – dicasabc • Tenha diversos ambientes (sandboxes para desenvolvedores, ambiente de teste de carga, demonstra¸c˜ao, QA, etc.); • Mantenha o versionamento da base num controle de vers˜oes, e tamb´em a informa¸c˜ao da vers˜ao atual na pr´opria base (use ferramentas como Sqitch, dbdeploy, Flyway, etc... ou fa¸ca a sua); • Use ambientes de Integra¸c˜ao Cont´ınua (Continuous Integration); • Pequenas modifica¸c˜oes s˜ao mais f´aceis de aplicar e testar (tente dividir uma grande tarefa e v´arias menores); • Automatize tudo; • Fa¸ca as pazes entre desenvolvedores e DBAs (dica: pair-programming entre ambos sempre que poss´ıvel)... =) ; • Teste... • Teste... • TESTE!!! 14 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  26. 26. Zero Downtime Upgrades
  27. 27. Zero Downtime Upgradesabc • Existe um mito que qualquer atualiza¸c˜oes em bancos de dados relacionais ´e extremamente lenta. • ´E fato que opera¸c˜oes DDL (Data Definition Language) muitas vezes bloqueiam opera¸c˜oes DML (Data Manipulation Language), mas ´e poss´ıvel fazer com que este bloqueio seja extremamente r´apido na grande maioria dos casos. 16 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  28. 28. Zero Downtime Upgrades – ALTER TABLE abc • Sem d´uvida o comando que gera maiores d´uvidas e dores de cabe¸ca. • Para executar um ALTER TABLE o banco de dados necessita de um bloqueio exclusivo da tabela (em muitos casos bloqueando at´e consultas), mas existem basicamente dois mecanismos para um ALTER TABLE atualizar o esquema: ◦ com necessidade de reescrita – a tabela ´e atualizada completamente (in-place ou usando arquivos tempor´arios) + atualiza¸c˜ao de cat´alogo; ◦ sem necessidade de reescrita – apenas atualiza¸c˜ao de cat´alogo. • A necessidade ou n˜ao de reescrita depende do SGDB e do comando executado, vamos ver alguns exemplos e como s˜ao tratados no PostgreSQL, Oracle e MySQL. 17 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  29. 29. Zero Downtime Upgrades – ALTER TABLE abc Adicionar coluna, sem valor DEFAULT: ALTER TABLE usuarios ADD lat NUMERIC; PostgreSQL : sem reescrita; Oracle : sem reescrita; MySQL : com reescrita (mas a partir da vers˜ao 5.6 ´e poss´ıvel reescrita in-place e sem bloqueio de opera¸c˜oes DML – exceto para auto increment); 18 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  30. 30. Zero Downtime Upgrades – ALTER TABLE abc Adicionar coluna, com valor DEFAULT: ALTER TABLE usuarios ADD ativo BOOLEAN DEFAULT true ; PostgreSQL : com reescrita (devido `a necessidade do valor DEFAULT); Oracle : com reescrita (devido `a necessidade do valor DEFAULT); MySQL : com reescrita (mesmas considera¸c˜oes do anterior); 19 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  31. 31. Zero Downtime Upgrades – ALTER TABLE abc Adicionar coluna, com valor DEFAULT e NOT NULL: ALTER TABLE usuarios ADD ativo BOOLEAN DEFAULT true NOT NULL; PostgreSQL : com reescrita (devido `a necessidade do valor DEFAULT); Oracle : sem reescrita (a partir da vers˜ao 11g, anteriormente a reescrita era necess´aria); MySQL : com reescrita (mesmas considera¸c˜oes do anterior); Para adi¸c˜ao de colunas com valor DEFAULT (exceto MySQL 5.6+), uma pr´atica comum ´e adicionar a coluna sem DEFAULT, definir o DEFAULT em outra opera¸c˜ao e fazer um UPDATE em grupos (batches) e/ou em paralelo para aplicar `as linhas antigas. 20 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  32. 32. Zero Downtime Upgrades – ALTER TABLE abc Remover coluna: ALTER TABLE usuarios DROP fone_casa; PostgreSQL : sem reescrita; Oracle : sem reescrita se usando o comando: ALTER TABLE usuarios ALTER fone_casa SET UNUSED ; MySQL : com reescrita (mas a partir da vers˜ao 5.6 ´e poss´ıvel reescrita in-place e sem bloqueio de opera¸c˜oes DML); 21 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  33. 33. Zero Downtime Upgrades – ALTER TABLE abc Alterar tipo de uma coluna: ALTER TABLE usuarios ALTER lat TYPE b i g i n t ; PostgreSQL : com reescrita; Oracle : com reescrita; MySQL : com reescrita; 22 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  34. 34. Zero Downtime Upgrades – ALTER TABLE abc Alterar limite de uma coluna: ALTER TABLE usuarios ALTER nome TYPE varchar (100); PostgreSQL : a partir da vers˜ao 9.2, sem reescrita somente se o limite estiver aumentando (ou remo¸c˜ao de limite); Oracle : sem reescrita somente se o limite estiver aumentando; MySQL : a partir da vers˜ao 5.6, sem reescrita somente se o limite estiver aumentando; 23 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  35. 35. Zero Downtime Upgrades – ALTER TABLE abc Cria¸c˜ao de ´ındices. PostgreSQL : diminui o bloqueio se usado CREATE INDEX CONCURRENTLY ...; Oracle : diminui o bloqueio se usado CREATE INDEX ... ONLINE; MySQL : n˜ao bloqueia para ´ındices secund´arios, exceto FULLTEXT (InnoDB 5.1+, demais 5.6+). 24 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  36. 36. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  37. 37. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  38. 38. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  39. 39. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; • Execute scripts de migra¸c˜ao parte a parte, algumas vezes um ´unico script de migra¸c˜ao pode levar dias; 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  40. 40. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; • Execute scripts de migra¸c˜ao parte a parte, algumas vezes um ´unico script de migra¸c˜ao pode levar dias; • Automatize tudo que for poss´ıvel, mas acompanhe a execu¸c˜ao quando for em produ¸c˜ao. 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  41. 41. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; • Execute scripts de migra¸c˜ao parte a parte, algumas vezes um ´unico script de migra¸c˜ao pode levar dias; • Automatize tudo que for poss´ıvel, mas acompanhe a execu¸c˜ao quando for em produ¸c˜ao. • Teste... 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  42. 42. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; • Execute scripts de migra¸c˜ao parte a parte, algumas vezes um ´unico script de migra¸c˜ao pode levar dias; • Automatize tudo que for poss´ıvel, mas acompanhe a execu¸c˜ao quando for em produ¸c˜ao. • Teste... • Teste... 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  43. 43. Zero Downtime Upgrades – dicasabc • Nunca se preocupe com a posi¸c˜ao das colunas numa tabela, mapeia as posi¸c˜oes l´ogicas no seu c´odigo/aplica¸c˜ao; • Nunca utilize o famigerado SELECT * ; • Tente executar essas migra¸c˜oes em momentos de menor atividade, mesmo que sejam sem reescrita; • Execute scripts de migra¸c˜ao parte a parte, algumas vezes um ´unico script de migra¸c˜ao pode levar dias; • Automatize tudo que for poss´ıvel, mas acompanhe a execu¸c˜ao quando for em produ¸c˜ao. • Teste... • Teste... • TESTE!!! 25 / 26 T´ecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
  44. 44. Obrigado!abc D´uvidas? Matheus de Oliveira <matheus.oliveira@dextra.com.br> IRC – irc.freenode.net: /join #postgresql,#postgresql-br,#dextra Meu nick: MatheusOl Twitter: @matioli matheus LinkedIn: br.linkedin.com/in/matheusdeoliveira/ SlideShare: slideshare.net/matheus de oliveira

×