migrations for java (javou #4 - javace)

147
EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL Rafael Ponte Javou #4 - 2015 Migrations for Java

Upload: rafael-ponte

Post on 06-Aug-2015

87 views

Category:

Technology


1 download

TRANSCRIPT

EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL

Rafael Ponte Javou #4 - 2015

Migrations for Java

EM 2005EU SÓ QUERIA SABER DE

FRAMEWORKS

ANALISTA DE SISTEMAS NA EQUIPE

I ♥ HIBERNATE

I ♥ HIBERNATE

<?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

@Entity  class  Issue  {    @Id  private  Long  id;    private  String  descricao;  …  }

Nova Entidade

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

I ♥ HIBERNATE

@Entity  class  Issue  {    @Id  private  Long  id;    private  String  descricao;  private  String  status  =  "A";    …  }

Entidade ATUALIZADA!

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

I ♥ HIBERNATE

@Entity  class  Issue  {    @Id  private  Long  id;  @Column(length=1000)    private  String  descricao;  private  String  status  =  "A";    …  }

Entidade ATUALIZADA! <3

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

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

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

I ♥ HIBERNATE ϟ

SEMPREPODE

PIORAR

SEMPREPODE

PIORARMUDE O NOME

DA COLUNA

SEMPREPODE

PIORARMUDE O TIPO

DA COLUNA

SEMPREPODE

PIORARADICIONE

UMA COLUNA NOT-NULL

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

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

I ♥ HIBERNATE ϟ

DO PROJETOSOMENTE NO INICIO

APRENDI:GERAR SCHEMA COM HIBERNATE

CORRIGINDO O BANCO

NA MÃO

CORRIGINDO O BANCO

NA MÃOMario Diniz

Não tá entrando na tela...

CORRIGINDO O BANCO

NA MÃOE o meu banco?

Handerson Frota

Mario Diniz

Não tá entrando na tela...

ALGO ESTAVA ERRADO,EVOLUIR O BANCO ERA

CARO

Migrations for JavaEVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL

@rponte

Fortaleza - Terra do Sol

Como você evolui sua

APP?

Como você evolui seu

BANCO?

Como você evolui seu

BANCO?

gerencia mudanças

PREPARA UM HUGE_SCRIPT.SQL E APLICA MANUALMENTE?

DEIXA NA MÃO DO DBA?

DEIXA NA MÃO DO

ARQUITETO?

* BDUF (Big Design Up Front)

*

CRIA SUA PRÓPRIA

FERRAMENTA, CERTO?

NÓS ♥ TECNOLOGIA CASEIRA

OU GERA COM HIBERNATE?

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

CADA SOLUÇÃOTEM VANTAGENS

E DESVANTAGENS

CADA SOLUÇÃOTEM SEUS PRÓS

E CONTRAS

A COMUNIDADE RUBYONRAILS APRENDEU DESDE O COMEÇO

SIMPLES E EFICAZ:

MIGRATIONS

A COMUNIDADE JAVAPARECE QUE NÃO APRENDEUAINDA COMO SE FAZ

Java ferramentas para todos os gostos

TODAS SEGUEM O MESMO

CONCEITO

PASSOS4RESUMINDO EM

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

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

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

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

APLICA O SCRIPT NO BANCO2

[rponte]  ~/myblog/scripts  $  migrate  up

APLICA O SCRIPT NO BANCO2

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

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

VERSIONA A MUDANÇA NO BANCO3

mysql>  select  *  from  DB_VERSION;

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

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      |  +-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+

CRIA O SCRIPT1APLICA SCRIPT2

VERSIONA O BANCO3APLICA NOVOS SCRIPTS4

Java ferramentas para todos os gostos

Java ferramentas para todos os gostos

liquibase

mybatisflyway

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Flyway

Flyway

> Plain SQL migrations

Flyway

> Plain SQL migrations> Java migrations

Flyway

> Plain SQL migrations> Java migrations> Convention over Configuration

Flyway

> Plain SQL migrations> Java migrations> Convention over Configuration> SQL Parser

Flyway

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

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

Liquibase

Liquibase

> XML migrations

Liquibase

> XML migrations> Plain SQL migrations

Liquibase

> XML migrations> Plain SQL migrations> Multiple Databases

Liquibase

> XML migrations> Plain SQL migrations> Multiple Databases> Rollback support

Liquibase

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

FLYWAY LIQUIBASE MYBATIS MIGRATIONS

MyBatis Schema Migrations

MyBatis Schema Migrations

> Plain SQL migrations

MyBatis Schema Migrations

> Plain SQL migrations> Maven

MyBatis Schema Migrations

> Plain SQL migrations

> Rollback support> Maven

MyBatis Schema Migrations

> Plain SQL migrations

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

APESAR DE TANTAS OPÇÕES HOJE EM DIA

APESAR DE TANTAS OPÇÕES HOJE EM DIA

EM 2009 ERA DIFERENTE

APESAR DE TANTAS OPÇÕES HOJE EM DIA

ADOTAMOS O MYBATIS

MIGRATIONS

WINDOWS, LINUX E MACOSX

ADOTAMOS O MYBATIS

MIGRATIONS

PODEMOS FACILITARE FOI O QUE FIZEMOS

ANT SCRIPT

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

PODEMOS FACILITARE FOI O QUE MARCELO FEZ

GRADLE PLUGIN

PODEMOS FACILITARE FOI O QUE MARCELO FEZ

GRADLE PLUGIN

Ant é tão OLD!

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

MAVEN

MyBatis Migrations

MAVEN ANT

MyBatis Migrations

MAVEN ANT GRADLE

MyBatis Migrations

FLYWAY

LIQUIBASE

MYBATIS MIGRATIONS

FLYWAY

LIQUIBASE

MYBATIS MIGRATIONS

QUAL ESCOLHER?

MIGRATIONS

MIGRATIONS =EVOLUÇÃO SUSTENTÁVEL DO BANCO

MIGRATIONS MELHOR PROCESSO+ =

EVOLUÇÃO SUSTENTÁVEL DO BANCO

MELHORE O

PROCESSO

EQUIPE RESPONSÁVEL PELO BANCO

COLOQUE AS MIGRATIONS NO

CONTROLE DE VERSÃO

- BANCO DE DADOS COMPARTILHADO -NAO USE EM

DESENVOLVIMENTO

- BANCO DE DADOS COMPARTILHADO -NAO USE EM

DESENVOLVIMENTO

Banco de Dados

Rafael Mario Handerson ......

Rafael Mario Handerson ...

Banco Banco Banco ...

...

...

!

!

Banco de Dados

Rafael Mario Handerson ...

Schema Schema Schema ...

...

...

AUTOMATIZE O MÁXIMO QUE PUDER

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v48

deploy frequente

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v48

Q&A v44

Demo v45

deploy frequente deploy controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v48

Q&A v44

Demo v45

Produção v43

deploy frequente deploy controlado deploy MUITO controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v48

Q&A v44

Demo v45

Produção v43

deploy frequente deploy controlado deploy MUITO controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v49

Q&A v44

Demo v45

Produção v43

deploy frequente deploy controlado deploy MUITO controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v49

Q&A v49

Demo v45

Produção v43

deploy frequente deploy controlado deploy MUITO controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v49

Q&A v49

Demo v49

Produção v43

deploy frequente deploy controlado deploy MUITO controlado

Rafael v48Rafael v48

Rafael v48Mario v49

Rafael v48

Handerson v43

Integration v49

Q&A v49

Demo v49

Produção v49

deploy frequente deploy controlado deploy MUITO controlado

NÃO MODIFIQUE MIGRATIONS QUE FORAM

PARA PRODUÇÃO

GRANDES MUDANÇAS PEQUENAS MIGRATIONS

MIGRATIONS MELHOR PROCESSO+ =

EVOLUÇÃO SUSTENTÁVEL DO BANCO

SEMPREPODE

PIORAR

APP

BANC

APP

BANC

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

APP

BANC

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

EVOLUIR O BANCO NESSE CENÁRIO

É CARO

Original Transição Resultado

Original Transição Resultado

modifica o banco

{

Original Transição Resultado

modifica o banco

período de transição

(antigo e novo)

{ {

Original Transição Resultado

modifica o banco

período de transição

(antigo e novo)finaliza a

modificação

{ { {

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

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

CONCLUINDO

EVOLUIR O BANCO ÉMAIS DIFÍCIL DO QUE A

APLICAÇAO

TRABALHEJUNTAMENTE COM O

DBA

ESTUDE, EXPERIMENTE E ESCOLHA UMA MIGRATIONS TOOL

Obrigado!

One more thing…

http://promo.triadworks.com.br

One more thing…

Tenho um amigo que tem um sonho…

Rommel Costa