122
EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL Rafael Ponte QCon SP 2013 Migrations for Java

Migrations for Java (QCONSP2013)

Embed Size (px)

DESCRIPTION

Assim como as Migrations no mundo Ruby On Rails, o mundo Java também possui alternativas para evoluir o banco de dados de uma aplicação. Aprenda como você e sua equipe podem evoluir de maneira iterativa e incremental seu banco de dados – já em produção – durante a criação da sua aplicação. Serão apresentados os problemas e desafios mais comuns de não utilizar uma ferramenta de migrations para gerenciar a evolução do banco de dados, e os benefícios que esta ferramenta traz em ambiente de desenvolvimento e produção. Também serão apresentados opções de migrations para Java, suas principais diferenças e a experiência do palestrante ao adotar uma dessas ferramentas em projetos com bancos de dados criados do zero, e também projetos que precisam manter o legado.

Citation preview

Page 1: Migrations for Java (QCONSP2013)

EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL

Rafael PonteQCon SP 2013

Migrations for Java

Page 2: Migrations for Java (QCONSP2013)

EM 2005EU SÓ QUERIA SABER DE

FRAMEWORKS

Page 3: Migrations for Java (QCONSP2013)

ANALISTA DE SISTEMAS NA EQUIPE

Page 4: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE

Page 5: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE

Page 6: Migrations for Java (QCONSP2013)

<?xml  version="1.0"  encoding="UTF-­‐8"?><persistence  version="2.0"          xmlns="http://java.sun.com/xml/ns/persistence">         <persistence-­‐unit  name="IssueTracker">     <properties>                <!-- ... -->       <property  name="hibernate.show_sql"  value="true"  />       <property  name="hibernate.format_sql"  value="true"  />       <property  name="hibernate.hbm2ddl.auto"  value="update"  />     </properties>   </persistence-­‐unit>  </persistence>

persistence.xml

Page 7: Migrations for Java (QCONSP2013)

@Entityclass  Issue  {@Idprivate  Long  id;private  String  descricao;…

}

Nova Entidade

Page 8: Migrations for Java (QCONSP2013)

INFO  [SchemaUpdate  ]  Running  hbm2ddl  schema  updateINFO  [SchemaUpdate  ]  fetching  database  metadataINFO  [SchemaUpdate  ]  updating  schema...INFO  [TableMetadata]  table  not  found:  issueINFO  [SchemaUpdate  ]  create  table  issue  (id  bigserial  not  null,  descricao  varchar(255))...INFO  [SchemaUpdate                ]  schema  update  complete

Page 9: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE

Page 10: Migrations for Java (QCONSP2013)

@Entityclass  Issue  {@Idprivate  Long  id;private  String  descricao;private  String  status  =  "A";  …

}

Entidade ATUALIZADA!

Page 11: Migrations for Java (QCONSP2013)

INFO  [SchemaUpdate  ]  Running  hbm2ddl  schema  updateINFO  [SchemaUpdate  ]  fetching  database  metadataINFO  [SchemaUpdate  ]  updating  schema...INFO  [TableMetadata]  table  found:  issueINFO  [TableMetadata]  columns:  [id,  descricao]INFO  [SchemaUpdate  ]  alter  table  issue  add  column  status  varchar(255)...INFO  [SchemaUpdate  ]  schema  update  complete

Page 12: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE

Page 13: Migrations for Java (QCONSP2013)

@Entityclass  Issue  {@Idprivate  Long  id;@Column(length=1000)private  String  descricao;private  String  status  =  "A";  …

}

Entidade ATUALIZADA! <3

Page 14: Migrations for Java (QCONSP2013)

EM PRODUÇÃOjava.sql.SQLException:  Data  truncated  for  column  'descricao'  at  row  1

Page 15: Migrations for Java (QCONSP2013)

INFO  [SchemaUpdate  ]  Running  hbm2ddl  schema  updateINFO  [SchemaUpdate  ]  fetching  database  metadataINFO  [SchemaUpdate  ]  updating  schema...INFO  [TableMetadata]  table  found:  issueINFO  [TableMetadata]  columns:  [id,  status,  descricao]INFO  [TableMetadata]  foreign  keys:  []INFO  [TableMetadata]  indexes:  [issue_pkey]

...  ???????????  #WTFINFO  [SchemaUpdate  ]  schema  update  complete

Page 16: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE ϟ

Page 17: Migrations for Java (QCONSP2013)

SEMPREPODE

PIORAR

Page 18: Migrations for Java (QCONSP2013)

SEMPREPODE

PIORARMUDE O NOME

DA COLUNA

Page 19: Migrations for Java (QCONSP2013)

SEMPREPODE

PIORARMUDE O TIPO

DA COLUNA

Page 20: Migrations for Java (QCONSP2013)

SEMPREPODE

PIORARADICIONE

UMA COLUNA NOT-NULL

Page 21: Migrations for Java (QCONSP2013)

WARNING: We've seen Hibernate users trying to use SchemaUpdate to update the schema of a production database automatically. This

can quickly end in disaster and won't be allowed by your DBA.

-- Java Persistence with Hibernate

Page 22: Migrations for Java (QCONSP2013)

WARNING: We've seen Rafael Ponte trying to use SchemaUpdate to update the schema of a production database automatically. This

can quickly end in disaster and won't be allowed by your DBA.

-- Java Persistence with Hibernate

Page 23: Migrations for Java (QCONSP2013)

I ♥ HIBERNATE ϟ

Page 24: Migrations for Java (QCONSP2013)

DO PROJETOSOMENTE NO INICIO

APRENDI:GERAR SCHEMA COM HIBERNATE

Page 25: Migrations for Java (QCONSP2013)

CORRIGINDO O BANCO

NA MÃO

Page 26: Migrations for Java (QCONSP2013)

CORRIGINDO O BANCO

NA MÃOMario Diniz

Não tá entrando na tela...

Page 27: Migrations for Java (QCONSP2013)

CORRIGINDO O BANCO

NA MÃOE o meu banco?

Handerson Frota

Mario Diniz

Não tá entrando na tela...

Page 28: Migrations for Java (QCONSP2013)

ALGO ESTAVA ERRADO,EVOLUIR O BANCO ERA

CARO

Page 29: Migrations for Java (QCONSP2013)

Migrations for JavaEVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL

Page 30: Migrations for Java (QCONSP2013)

@rponte

Page 31: Migrations for Java (QCONSP2013)
Page 32: Migrations for Java (QCONSP2013)

Príncipe do Oceano

Page 33: Migrations for Java (QCONSP2013)
Page 34: Migrations for Java (QCONSP2013)

Fortaleza - Terra do Sol

Page 35: Migrations for Java (QCONSP2013)

Como você evolui sua

APP?

Page 36: Migrations for Java (QCONSP2013)

Como você evolui seu

BANCO?

Page 37: Migrations for Java (QCONSP2013)

Como você evolui seu

BANCO?

gerencia mudanças

Page 38: Migrations for Java (QCONSP2013)

PREPARA UM HUGE_SCRIPT.SQL E APLICA MANUALMENTE?

Page 39: Migrations for Java (QCONSP2013)

DEIXA NA MÃO DO DBA?

Page 40: Migrations for Java (QCONSP2013)

DEIXA NA MÃO DO

ARQUITETO?

* BDUF (Big Design Up Front)

*

Page 41: Migrations for Java (QCONSP2013)

CRIA SUA PRÓPRIA

FERRAMENTA, CERTO?

NÓS ♥ TECNOLOGIA CASEIRA

Page 42: Migrations for Java (QCONSP2013)

OU GERA COM HIBERNATE?

Page 43: Migrations for Java (QCONSP2013)

Não importa qual solução você utilize...

Page 44: Migrations for Java (QCONSP2013)

CADA SOLUÇÃOTEM VANTAGENS

E DESVANTAGENS

Page 45: Migrations for Java (QCONSP2013)

CADA SOLUÇÃOTEM SEUS PRÓS

E CONTRAS

Page 46: Migrations for Java (QCONSP2013)

A COMUNIDADE RUBYONRAILS APRENDEU DESDE O COMEÇO

Page 47: Migrations for Java (QCONSP2013)

SIMPLES E EFICAZ:

MIGRATIONS

Page 48: Migrations for Java (QCONSP2013)

A COMUNIDADE JAVAPARECE QUE NÃO APRENDEUAINDA COMO SE FAZ

Page 49: Migrations for Java (QCONSP2013)

Java ferramentas para todos os gostos

Page 50: Migrations for Java (QCONSP2013)

TODASSEGUEM O MESMO

CONCEITO

Page 51: Migrations for Java (QCONSP2013)

PASSOS4RESUMINDO EM

Page 52: Migrations for Java (QCONSP2013)

CRIE O SCRIPT COM A MUDANÇA1

CREATE  TABLE  'blog'  (      'id'  INT(10)  UNSIGNED  NOT  NULL  AUTO_INCREMENT,      'descricao'  VARCHAR(255)  NOT  NULL      PRIMARY  KEY  ('id'))

script.sql

Page 53: Migrations for Java (QCONSP2013)

CRIE O SCRIPT COM A MUDANÇA1

CREATE  TABLE  'blog'  (      'id'  INT(10)  UNSIGNED  NOT  NULL  AUTO_INCREMENT,      'descricao'  VARCHAR(255)  NOT  NULL      PRIMARY  KEY  ('id'))

create_table_blog.sql

Page 54: Migrations for Java (QCONSP2013)

CRIE O SCRIPT COM A MUDANÇA1

CREATE  TABLE  'blog'  (      'id'  INT(10)  UNSIGNED  NOT  NULL  AUTO_INCREMENT,      'descricao'  VARCHAR(255)  NOT  NULL      PRIMARY  KEY  ('id'))

1_create_table_blog.sql

Page 55: Migrations for Java (QCONSP2013)

CRIE O SCRIPT COM A MUDANÇA1

CREATE  TABLE  'blog'  (      'id'  INT(10)  UNSIGNED  NOT  NULL  AUTO_INCREMENT,      'descricao'  VARCHAR(255)  NOT  NULL      PRIMARY  KEY  ('id'))

<ID>_<DESCRIPTION>.sql

Page 56: Migrations for Java (QCONSP2013)

APLICA O SCRIPT NO BANCO2

[rponte]  ~/myblog/scripts$  migrate  up

Page 57: Migrations for Java (QCONSP2013)

APLICA O SCRIPT NO BANCO2

[rponte]  ~/myblog/scripts$  migrate  up  -­‐env=PRODUCTION

-­‐env=HOMOLOG-­‐env=DEV-­‐env=TEST

Page 58: Migrations for Java (QCONSP2013)

VERSIONA A MUDANÇA NO BANCO3

mysql>  select  *  from  DB_VERSION;

+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  ID  |  DESCRIPTION                  |+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  1    |  create  table  blog      |+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+

Page 59: Migrations for Java (QCONSP2013)

APLICA SCRIPTS AINDA NÃO APLICADOS4

[rponte]  ~/myblog/scripts$  migrate  up

mysql>  select  *  from  DB_VERSION;+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  ID  |  DESCRIPTION                  |+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+|  1    |  create  table  blog      ||  2    |  create  table  author  ||  3    |  create  table  post      |+-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+

Page 60: Migrations for Java (QCONSP2013)

CRIA O SCRIPT1APLICA SCRIPT2

VERSIONA O BANCO3APLICA NOVOS SCRIPTS4

Page 61: Migrations for Java (QCONSP2013)

Java ferramentas para todos os gostos

Page 62: Migrations for Java (QCONSP2013)

Java ferramentas para todos os gostos

liquibase

mybatisflyway

Page 63: Migrations for Java (QCONSP2013)

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Page 64: Migrations for Java (QCONSP2013)

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Page 65: Migrations for Java (QCONSP2013)

Flyway

Page 66: Migrations for Java (QCONSP2013)

Flyway

> Plain SQL migrations> Java migrations> Convention over Configuration> SQL Parser> Java API - Ant - Maven - Gradle

Page 67: Migrations for Java (QCONSP2013)

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Page 68: Migrations for Java (QCONSP2013)

Liquibase

Page 69: Migrations for Java (QCONSP2013)

Liquibase

> XML migrations> Plain SQL migrations> Multiple Databases> Rollback support> Generation of SQL scripts for DBA

Page 70: Migrations for Java (QCONSP2013)

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Page 71: Migrations for Java (QCONSP2013)

MyBatis Schema Migrations

Page 72: Migrations for Java (QCONSP2013)

MyBatis Schema Migrations

> Plain SQL migrations

> Generation of SQL scripts for DBA> Rollback support> Maven

Page 73: Migrations for Java (QCONSP2013)

APESAR DE TANTAS OPÇÕES HOJE EM DIA

Page 74: Migrations for Java (QCONSP2013)

APESAR DE TANTAS OPÇÕES HOJE EM DIA

EM 2009ERA DIFERENTE

Page 75: Migrations for Java (QCONSP2013)

APESAR DE TANTAS OPÇÕES HOJE EM DIA

ADOTAMOS O MYBATIS

MIGRATIONS

Page 76: Migrations for Java (QCONSP2013)

WINDOWS,LINUX E MACOSX

ADOTAMOS O MYBATIS

MIGRATIONS

Page 77: Migrations for Java (QCONSP2013)

PODEMOS FACILITARE FOI O QUE FIZEMOS

ANT SCRIPT

Page 78: Migrations for Java (QCONSP2013)
Page 79: Migrations for Java (QCONSP2013)

Mybatis-Migrations-Anttasks github.com/rponte/mybatis-migrations-anttasks

Page 80: Migrations for Java (QCONSP2013)

PODEMOS FACILITARE FOI O QUE MARCELO FEZ

GRADLE PLUGIN

Page 81: Migrations for Java (QCONSP2013)

PODEMOS FACILITARE FOI O QUE MARCELO FEZ

GRADLE PLUGIN

Ant é tão OLD!

Page 82: Migrations for Java (QCONSP2013)

Gradle-Migrations-Plugin github.com/marceloemanoel/gradle-migrations-plugin

Page 83: Migrations for Java (QCONSP2013)
Page 84: Migrations for Java (QCONSP2013)

MAVEN

MyBatis Migrations

Page 85: Migrations for Java (QCONSP2013)

MAVEN ANT

MyBatis Migrations

Page 86: Migrations for Java (QCONSP2013)

MAVEN ANT GRADLE

MyBatis Migrations

Page 87: Migrations for Java (QCONSP2013)

FLYWAY

LIQUIBASE

MYBATIS MIGRATIONS

Page 88: Migrations for Java (QCONSP2013)

FLYWAY

LIQUIBASE

MYBATIS MIGRATIONS

QUAL ESCOLHER?

Page 89: Migrations for Java (QCONSP2013)

MIGRATIONS

Page 90: Migrations for Java (QCONSP2013)

MIGRATIONS =EVOLUÇÃOSUSTENTÁVELDO BANCO

Page 91: Migrations for Java (QCONSP2013)

MIGRATIONS MELHORPROCESSO+ =

EVOLUÇÃOSUSTENTÁVELDO BANCO

Page 92: Migrations for Java (QCONSP2013)

MELHORE O

PROCESSO

Page 93: Migrations for Java (QCONSP2013)

EQUIPE RESPONSÁVEL PELO BANCO

Page 94: Migrations for Java (QCONSP2013)

COLOQUE AS MIGRATIONS NO

CONTROLE DE VERSÃO

Page 95: Migrations for Java (QCONSP2013)

- BANCO DE DADOS COMPARTILHADO -NAO USE EM

DESENVOLVIMENTO

Page 96: Migrations for Java (QCONSP2013)

Banco de Dados

Rafael Mario Handerson ......

Page 97: Migrations for Java (QCONSP2013)

Rafael Mario Handerson ...

Banco Banco Banco ...

...

...

Page 98: Migrations for Java (QCONSP2013)

Banco de Dados

Rafael Mario Handerson ...

Schema Schema Schema ...

...

...

Page 99: Migrations for Java (QCONSP2013)

AUTOMATIZE O MÁXIMO QUE PUDER

Page 100: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Page 101: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv48

deploy frequente

Page 102: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv48

Q&Av44

Demov45

deploy frequente deploy controlado

Page 103: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv48

Q&Av44

Demov45

Produçãov43

deploy frequente deploy controlado deploy MUITO controlado

Page 104: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv48

Q&Av44

Demov45

Produçãov43

deploy frequente deploy controlado deploy MUITO controlado

Page 105: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv49

Q&Av44

Demov45

Produçãov43

deploy frequente deploy controlado deploy MUITO controlado

Page 106: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv49

Q&Av49

Demov45

Produçãov43

deploy frequente deploy controlado deploy MUITO controlado

Page 107: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv49

Q&Av49

Demov49

Produçãov43

deploy frequente deploy controlado deploy MUITO controlado

Page 108: Migrations for Java (QCONSP2013)

Rafaelv48Rafaelv48

Rafaelv48Mariov49

Rafaelv48

Handersonv43

Integrationv49

Q&Av49

Demov49

Produçãov49

deploy frequente deploy controlado deploy MUITO controlado

Page 109: Migrations for Java (QCONSP2013)

NÃO MODIFIQUE MIGRATIONS QUE FORAM

PARA PRODUÇÃO

Page 110: Migrations for Java (QCONSP2013)

GRANDES MUDANÇASPEQUENAS MIGRATIONS

Page 111: Migrations for Java (QCONSP2013)

MIGRATIONS MELHORPROCESSO+ =

EVOLUÇÃOSUSTENTÁVELDO BANCO

Page 112: Migrations for Java (QCONSP2013)

SEMPREPODE

PIORAR

Page 113: Migrations for Java (QCONSP2013)

APP

BANCO

Page 114: Migrations for Java (QCONSP2013)

APP

BANCO

APPS que você NÃO conhece

APPS que você conhece

APPS que você conhece

APPS que você NÃO conhece

Data importers

Data exporters

Outros bancos

Frameworks de persistência

Código de teste

APPS que você conhece

APPS que você conhece

APPS que você NÃO conhece

Outros bancos

Data importers

Data exporters

Page 115: Migrations for Java (QCONSP2013)

APP

BANCO

APPS que você NÃO conhece

APPS que você conhece

APPS que você conhece

APPS que você NÃO conhece

Data importers

Data exporters

Outros bancos

Frameworks de persistência

Código de teste

APPS que você conhece

APPS que você conhece

APPS que você NÃO conhece

Outros bancos

Data importers

Data exporters

“Deus no céu, e Banco de dados na terra.”

Page 116: Migrations for Java (QCONSP2013)

EVOLUIR O BANCO NESSE CENÁRIO

É CARO

Page 117: Migrations for Java (QCONSP2013)

Original Transição Resultado

modifica o banco

período de transição

(antigo e novo)finaliza a

modificação

{ { {

Aplica as migrations, migra os dados, escreve código de

compatibilidade Remove schema antigo e código de compatibilidade

Page 118: Migrations for Java (QCONSP2013)

CONCLUINDO

Page 119: Migrations for Java (QCONSP2013)

EVOLUIR O BANCO ÉMAIS DIFÍCIL DO QUE A

APLICAÇAO

Page 120: Migrations for Java (QCONSP2013)

TRABALHEJUNTAMENTE COM O

DBA

Page 121: Migrations for Java (QCONSP2013)

ESTUDE, EXPERIMENTE E ESCOLHA UMA MIGRATIONS TOOL