Migrations for Java (QCONSP2013)

6,260 views

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

Published in: Technology
  • @rponte obrigado. vou ler ele.
       Reply 
    Are you sure you want to  Yes  No
    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
       Reply 
    Are you sure you want to  Yes  No
    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?
       Reply 
    Are you sure you want to  Yes  No
    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.
       Reply 
    Are you sure you want to  Yes  No
    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.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Migrations for Java (QCONSP2013)

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

×