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.
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. 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. 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”
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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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