Migrations for Java (QCONSP2013)

  • 5,012 views
Uploaded on

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 …

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.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • @rponte obrigado. vou ler ele.
    Are you sure you want to
    Your message goes here
  • @jrdalpra Não existe uma regra especifica, quando é algo simples, como criar uma tabela ou adicionar uma coluna eu simplesmente crio a migration. Se for algo mais complexo, como migrar dados de uma tabela para outra, mudar o tipo de uma coluna, ajustar dados de uma coluna etc, eu quebro em passos pequenos e cada passo é uma migration.

    O ideal é que a migration te sirva como documentação executável e te facilite a rastreabilidade de erros, isto é, quando rodar um conjunto de migrations e uma delas quebrar (der erro) eu saberei exatamente porque ela quebrou, já que ela tem uma responsabilidade bem definida.

    Esse livro tem boas práticas e receitas para tratar os casos mais complexos, vale a pena a leitura: http://www.amazon.com/Refactoring-Databases-Evolutionary-paperback-Addison-Wesley/dp/0321774515
    Are you sure you want to
    Your message goes here
  • @rponte como você trabalha com as alterações de banco em tempo de desenvolvimento? Você escreve uma migração a cada alteração de schema (criação de campo, tabela, sequence) ou você acumula algumas alterações e gera uma migração ao final da construção de uma nova feature?
    Are you sure you want to
    Your message goes here
  • @jrdalpra O Flyway, MyBatis Migrations e outras foram concebidas para serem simples, por isso o uso de SQL puro. Contudo, isso certamente vai te prender a uma SGBD especifico.

    Isso normalmente não é um problema para maioria das apps, pois elas trabalham sempre em cima do mesmo SGBD, mas se sua app precisa ser multi-banco então você pode ter mais trabalho sim.

    Por exemplo, trabalhei durante alguns anos em uma app que rodava em Oracle e MSSQLServer. Por utilizarmos o MyBatis Migrations nós tivemos 2 repositórios de migrations, um para cada banco. E eles evoluem juntos sempre.

    O LiquiBase tem suporte a multi-banco, no estilo do Hibernate. Mas também ele impõe algumas restrições, pois nesses casos a ferramenta tem que nivelar por baixo.

    Enfim, a discussão é longa e implementar uma solução multi-banco traz mais desafios do que uma solução objetiva e mais simples como o Flyway e Mybatis.
    Are you sure you want to
    Your message goes here
  • @rponte eu entendi :) . Eu achei a migrations Java do FlyWay muito baixo nível. Penso que ela deva ser multibanco. O fato de colocar um SQL direto na migration torna ela especifica para o banco X e para ter migrações para vários bancos eu teria que reescrever as migrations.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
5,012
On Slideshare
0
From Embeds
0
Number of Embeds
10

Actions

Shares
Downloads
54
Comments
20
Likes
12

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. EVOLUINDOSEUBANCODEMANEIRAINCREMENTAL RafaelPonte QConSP2013 MigrationsforJava
  • 2. EM 2005 EU SÓ QUERIA SABER DE FRAMEWORKS
  • 3. ANALISTADESISTEMAS NA EQUIPE
  • 4. I ♥HIBERNATE
  • 5. I ♥HIBERNATE
  • 6. <?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
  • 7. @Entity class  Issue  { @Id private  Long  id; private  String  descricao; … } Nova Entidade
  • 8. 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
  • 9. I ♥HIBERNATE
  • 10. @Entity class  Issue  { @Id private  Long  id; private  String  descricao; private  String  status  =  "A";   … } Entidade ATUALIZADA!
  • 11. 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
  • 12. I ♥HIBERNATE
  • 13. @Entity class  Issue  { @Id private  Long  id; @Column(length=1000) private  String  descricao; private  String  status  =  "A";   … } Entidade ATUALIZADA! <3
  • 14. EMPRODUÇÃO java.sql.SQLException:  Data   truncated  for  column  'descricao'  at   row  1
  • 15. 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] ...  ???????????  #WTF INFO  [SchemaUpdate  ]  schema  update  complete
  • 16. I ♥HIBERNATE ϟ
  • 17. SEMPRE PODE PIORAR
  • 18. SEMPRE PODE PIORAR MUDEONOME DACOLUNA
  • 19. SEMPRE PODE PIORAR MUDEOTIPO DACOLUNA
  • 20. SEMPRE PODE PIORAR ADICIONE UMACOLUNA NOT-NULL
  • 21. WARNING: We've seen Hibernate users trying to use SchemaUpdate to update the schema of a productiondatabase automatically. This can quickly endindisaster and won't be allowed by your DBA. “ -- Java Persistence with Hibernate
  • 22. WARNING: We've seen RafaelPontetrying to use SchemaUpdate to update the schema of a productiondatabase automatically. This can quickly endindisaster and won't be allowed by your DBA. “ -- Java Persistence with Hibernate
  • 23. I ♥HIBERNATE ϟ
  • 24. DO PROJETO SOMENTE NO INICIO APRENDI:GERAR SCHEMA COM HIBERNATE
  • 25. CORRIGINDO O BANCO NAMÃO
  • 26. CORRIGINDO O BANCO NAMÃO Mario Diniz Não tá entrando na tela...
  • 27. CORRIGINDO O BANCO NAMÃO E o meu banco? Handerson Frota Mario Diniz Não tá entrando na tela...
  • 28. ALGO ESTAVA ERRADO, EVOLUIR O BANCO ERA CARO
  • 29. MigrationsforJava EVOLUINDOSEUBANCODEMANEIRAINCREMENTAL
  • 30. @rponte
  • 31. Príncipe do Oceano
  • 32. Fortaleza- TerradoSol
  • 33. Como você evolui sua APP?
  • 34. Como você evolui seu BANCO?
  • 35. Como você evolui seu BANCO? gerencia mudanças
  • 36. PREPARA UM HUGE_SCRIPT.SQL E APLICA MANUALMENTE?
  • 37. DEIXA NA MÃO DO DBA?
  • 38. DEIXA NA MÃO DO ARQUITETO? * BDUF (Big Design Up Front) *
  • 39. CRIA SUA PRÓPRIA FERRAMENTA, CERTO? NÓS ♥ TECNOLOGIACASEIRA
  • 40. OU GERA COM HIBERNATE?
  • 41. Não importa qual solução você utilize...
  • 42. CADA SOLUÇÃO TEM VANTAGENS EDESVANTAGENS
  • 43. CADA SOLUÇÃO TEM SEUS PRÓS ECONTRAS
  • 44. A COMUNIDADE RUBYONRAILS APRENDEU DESDE O COMEÇO
  • 45. SIMPLESEEFICAZ: MIGRATIONS
  • 46. A COMUNIDADE JAVA PARECE QUE NÃO APRENDEU AINDA COMO SE FAZ
  • 47. Java ferramentasparatodososgostos
  • 48. TODASSEGUEM O MESMO CONCEITO
  • 49. PASSOS4 RESUMINDO EM
  • 50. 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
  • 51. 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
  • 52. 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
  • 53. 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
  • 54. APLICA O SCRIPT NO BANCO2 [rponte]  ~/myblog/scripts $  migrate  up
  • 55. APLICA O SCRIPT NO BANCO2 [rponte]  ~/myblog/scripts $  migrate  up  -­‐env=PRODUCTION -­‐env=HOMOLOG -­‐env=DEV -­‐env=TEST
  • 56. VERSIONA A MUDANÇA NO BANCO3mysql>  select  *  from  DB_VERSION; +-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+ |  ID  |  DESCRIPTION                  | +-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+ |  1    |  create  table  blog      | +-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+
  • 57. 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      | +-­‐-­‐-­‐-­‐+-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐+
  • 58. CRIA O SCRIPT1 APLICA SCRIPT2 VERSIONA O BANCO3 APLICA NOVOS SCRIPTS4
  • 59. Java ferramentasparatodososgostos
  • 60. Java ferramentasparatodososgostos liquibase mybatisflyway
  • 61. FLYWAY LIQUIBASE MYBATIS MIGRATIONS
  • 62. FLYWAY LIQUIBASE MYBATIS MIGRATIONS
  • 63. Flyway
  • 64. Flyway > Plain SQL migrations > Java migrations > Convention over Configuration > SQL Parser > Java API - Ant - Maven - Gradle
  • 65. FLYWAY LIQUIBASE MYBATIS MIGRATIONS
  • 66. Liquibase
  • 67. Liquibase > XML migrations > Plain SQL migrations > Multiple Databases > Rollback support > Generation of SQL scripts for DBA
  • 68. FLYWAY LIQUIBASE MYBATIS MIGRATIONS
  • 69. MyBatisSchemaMigrations
  • 70. MyBatisSchemaMigrations > Plain SQL migrations > Generation of SQL scripts for DBA > Rollback support > Maven
  • 71. APESARDE TANTAS OPÇÕESHOJE EMDIA
  • 72. APESARDE TANTAS OPÇÕESHOJE EMDIA EM2009 ERADIFERENTE
  • 73. APESARDE TANTAS OPÇÕESHOJE EMDIA ADOTAMOSO MYBATIS MIGRATIONS
  • 74. WINDOWS, LINUXE MACOSX ADOTAMOSO MYBATIS MIGRATIONS
  • 75. PODEMOS FACILITAR E FOI O QUE FIZEMOS ANT SCRIPT
  • 76. Mybatis-Migrations-Anttasks github.com/rponte/mybatis-migrations-anttasks
  • 77. PODEMOS FACILITAR E FOI O QUE MARCELO FEZ GRADLE PLUGIN
  • 78. PODEMOS FACILITAR E FOI O QUE MARCELO FEZ GRADLE PLUGIN Ant é tão OLD!
  • 79. Gradle-Migrations-Plugin github.com/marceloemanoel/gradle-migrations-plugin
  • 80. MAVEN MyBatisMigrations
  • 81. MAVEN ANT MyBatisMigrations
  • 82. MAVEN ANT GRADLE MyBatisMigrations
  • 83. FLYWAY LIQUIBASE MYBATIS MIGRATIONS
  • 84. FLYWAY LIQUIBASE MYBATIS MIGRATIONS QUAL ESCOLHER?
  • 85. MIGRATIONS
  • 86. MIGRATIONS = EVOLUÇÃO SUSTENTÁVEL DOBANCO
  • 87. MIGRATIONS MELHOR PROCESSO+ = EVOLUÇÃO SUSTENTÁVEL DOBANCO
  • 88. MELHOREO PROCESSO
  • 89. EQUIPE RESPONSÁVELPELO BANCO
  • 90. COLOQUEAS MIGRATIONSNO CONTROLEDEVERSÃO
  • 91. -BANCODEDADOSCOMPARTILHADO- NAOUSEEM DESENVOLVIMENTO
  • 92. Banco de Dados Rafael Mario Handerson ......
  • 93. Rafael Mario Handerson ... Banco Banco Banco ... ... ...
  • 94. Banco de Dados Rafael Mario Handerson ... Schema Schema Schema ... ... ...
  • 95. AUTOMATIZEOMÁXIMO QUEPUDER
  • 96. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43
  • 97. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v48 deployfrequente
  • 98. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v48 Q&A v44 Demo v45 deployfrequente deploycontrolado
  • 99. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deployfrequente deploycontrolado deployMUITOcontrolado
  • 100. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deployfrequente deploycontrolado deployMUITOcontrolado
  • 101. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v49 Q&A v44 Demo v45 Produção v43 deployfrequente deploycontrolado deployMUITOcontrolado
  • 102. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v49 Q&A v49 Demo v45 Produção v43 deployfrequente deploycontrolado deployMUITOcontrolado
  • 103. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v43 deployfrequente deploycontrolado deployMUITOcontrolado
  • 104. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48 Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v49 deployfrequente deploycontrolado deployMUITOcontrolado
  • 105. NÃOMODIFIQUE MIGRATIONSQUEFORAM PARAPRODUÇÃO
  • 106. GRANDESMUDANÇAS PEQUENASMIGRATIONS
  • 107. MIGRATIONS MELHOR PROCESSO+ = EVOLUÇÃO SUSTENTÁVEL DOBANCO
  • 108. SEMPRE PODE PIORAR
  • 109. APP BANCO
  • 110. 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
  • 111. 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 “Deusnocéu,eBancode dadosnaterra.”
  • 112. EVOLUIR O BANCO NESSE CENÁRIO É CARO
  • 113. 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
  • 114. CONCLUINDO
  • 115. EVOLUIR O BANCO É MAIS DIFÍCIL DO QUE A APLICAÇAO
  • 116. TRABALHE JUNTAMENTE COM O DBA
  • 117. ESTUDE, EXPERIMENTE E ESCOLHA UMA MIGRATIONSTOOL
  • 118. Rafael Ponte rponte@triadworks.com.br