Tecnicas de Database Refactoring para ambientes 24x7
Matheus de Oliveira<[email protected]>
Apresentado no27 de Marco de 2015
Matheus de Oliveira<[email protected]>
DBA PostgreSQL – consultorias e suportes24x7/8x5
Instrutor dos treinamentos PostgreSQL
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
Instrutor dos treinamentos PostgreSQL
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionaiscapacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na pratica”
Concepcao, desenvolvimento e suporte aproducao
Matheus de Oliveira<[email protected]>
Mais de 15 anos trabalhando de suporte econsultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionaiscapacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na pratica”
SaaS para analise e monitoramento PostgreSQLhttp://www.pganalytics.com.br/
“Facilitando a vida do DBA”
DatabaseRefactoring
Database Refactoring abc
“A simple change to a database schema that improves its designwhile retaining both its behavioral and informational semantics – in
other words, you can neither add new functionality nor break existingfunctionality, 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 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring abc
• Segue a mesma ideia e princıpios de refatoracao de codigo, so quee considerado um pouco mais difıcil.
• Escrever e evoluir o codigo de forma disciplinada:
◦ nem tao importante durante o desenvolvimento inicial (antes de entrarem producao);
◦ essencial (pra todos?) apos ter entrado em producao.
• Desenvolvedores, DBAs, sysadmins... DevOps... Todostrabalhando juntos com um objetivo em comum
5 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring abc
Estrategia:
6 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring abc
Mais difıcil do que parece:
7 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – exemplos abc
Podemos dividir os tipos de refatoracao em 6 categorias:
• Estrutural (structural);
• Qualidade dos dados (data quality);
• Integridade referencial (referential integrity);
• Arquitetural (architectural);
• Metodos/funcoes (method);
• Transformacao (non-refactoring transformation).
8 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – exemplos abc
Incrementar o esquema e facil:
9 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
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 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – exemplos abc
Em alguns casos, como no exemplo, nao ha necessidade desincronizacao:
• adicionar colunas a tabelas, desde que essas possam ser NULL outenham um valor DEFAULT definido;
• adicionar novas tabelas, visoes ou funcoes ao modelo;
• adicionar funcoes que mantenham compatibilidade.
11 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – exemplos abc
Mudar a estrutura ja e mais complicado:
12 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – sincronizacao abc
Para muitos casos, como renomear uma coluna, mover de uma tabelapara outra, remover uma tabela, entre outros; e necessario ummecanismo de sincronizacao. Estes podem ser feitos via:
• gatilhos (triggers);
• visoes (views);
• atualizacoes em lote (batch updates);
13 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);
• Pequenas modificacoes sao mais faceis de aplicar e testar (tentedividir uma grande tarefa e varias menores);
• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);
• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;
• Faca as pazes entre desenvolvedores e DBAs (dica:pair-programming entre ambos sempre que possıvel)... =) ;
• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;
• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...
• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...
• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Database Refactoring – dicasabc
• Tenha diversos ambientes (sandboxes para desenvolvedores,ambiente de teste de carga, demonstracao, QA, etc.);
• Mantenha o versionamento da base num controle de versoes, etambem a informacao da versao atual na propria base (useferramentas como Sqitch, dbdeploy, Flyway, etc... ou faca a sua);
• Use ambientes de Integracao Contınua (Continuous Integration);• Pequenas modificacoes sao mais faceis de aplicar e testar (tente
dividir uma grande tarefa e varias menores);• Automatize tudo;• Faca as pazes entre desenvolvedores e DBAs (dica:
pair-programming entre ambos sempre que possıvel)... =) ;• Teste...• Teste...• TESTE!!!
14 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero DowntimeUpgrades
Zero Downtime Upgradesabc
• Existe um mito que qualquer atualizacoes em bancos de dadosrelacionais e extremamente lenta.
• E fato que operacoes DDL (Data Definition Language) muitasvezes bloqueiam operacoes DML (Data Manipulation Language),mas e possıvel fazer com que este bloqueio seja extremamenterapido na grande maioria dos casos.
16 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – ALTER TABLE abc
• Sem duvida o comando que gera maiores duvidas e dores decabeca.
• Para executar um ALTER TABLE o banco de dados necessita de umbloqueio exclusivo da tabela (em muitos casos bloqueando ateconsultas), mas existem basicamente dois mecanismos para umALTER TABLE atualizar o esquema:◦ com necessidade de reescrita – a tabela e atualizada completamente
(in-place ou usando arquivos temporarios) + atualizacao de catalogo;◦ sem necessidade de reescrita – apenas atualizacao de catalogo.
• A necessidade ou nao de reescrita depende do SGDB e docomando executado, vamos ver alguns exemplos e como saotratados no PostgreSQL, Oracle e MySQL.
17 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
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 versao 5.6 e possıvelreescrita in-place e sem bloqueio de operacoes DML –exceto para auto increment);
18 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – ALTER TABLE abc
Adicionar coluna, com valor DEFAULT:
ALTER TABLE usuarios
ADD ativo BOOLEAN DEFAULT t r u e ;
PostgreSQL : com reescrita (devido a necessidade do valorDEFAULT);
Oracle : com reescrita (devido a necessidade do valorDEFAULT);
MySQL : com reescrita (mesmas consideracoes do anterior);
19 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – ALTER TABLE abc
Adicionar coluna, com valor DEFAULT e NOT NULL:
ALTER TABLE usuarios
ADD ativo BOOLEAN DEFAULT t r u e NOT NULL;
PostgreSQL : com reescrita (devido a necessidade do valorDEFAULT);
Oracle : sem reescrita (a partir da versao 11g, anteriormente areescrita era necessaria);
MySQL : com reescrita (mesmas consideracoes do anterior);
Para adicao de colunas com valor DEFAULT (exceto MySQL 5.6+),uma pratica comum e adicionar a coluna sem DEFAULT, definir o
DEFAULT em outra operacao e fazer um UPDATE em grupos(batches) e/ou em paralelo para aplicar as linhas antigas.
20 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
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 versao 5.6 e possıvelreescrita in-place e sem bloqueio de operacoes DML);
21 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
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 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – ALTER TABLE abc
Alterar limite de uma coluna:
ALTER TABLE usuarios
ALTER nome TYPE v a r c h a r (100);
PostgreSQL : a partir da versao 9.2, sem reescrita somente se olimite estiver aumentando (ou remocao de limite);
Oracle : sem reescrita somente se o limite estiver aumentando;
MySQL : a partir da versao 5.6, sem reescrita somente se olimite estiver aumentando;
23 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – ALTER TABLE abc
Criacao de ındices.
PostgreSQL : diminui o bloqueio se usado CREATE INDEX
CONCURRENTLY ...;
Oracle : diminui o bloqueio se usado CREATE INDEX ...
ONLINE;
MySQL : nao bloqueia para ındices secundarios, excetoFULLTEXT (InnoDB 5.1+, demais 5.6+).
24 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...
• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Zero Downtime Upgrades – dicasabc
• Nunca se preocupe com a posicao das colunas numa tabela,mapeia as posicoes logicas no seu codigo/aplicacao;
• Nunca utilize o famigerado SELECT * ;
• Tente executar essas migracoes em momentos de menoratividade, mesmo que sejam sem reescrita;
• Execute scripts de migracao parte a parte, algumas vezes umunico script de migracao pode levar dias;
• Automatize tudo que for possıvel, mas acompanhe a execucaoquando for em producao.
• Teste...
• Teste...• TESTE!!!
25 / 26Tecnicas de Database Refactoring para ambientes 24x7 – Matheus de Oliveira – QCon SP 2015
Obrigado!abc
Duvidas?
Matheus de Oliveira<[email protected]>
IRC – irc.freenode.net:/join #postgresql,#postgresql-br,#dextra
Meu nick: MatheusOl
Twitter: @matioli matheusLinkedIn: br.linkedin.com/in/matheusdeoliveira/
SlideShare: slideshare.net/matheus de oliveira