Migrations for Java - Evoluindo seu banco de maneira incremental

Migrations for Java - Evoluindo seu banco de maneira incremental

(Palestra ministrada no TechDay da MDIAS em ABR-2018)

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.

F853760c988228c4a153333407e64f09?s=128

Rafael Ponte

April 05, 2018
Tweet

Transcript

  1. EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL Rafael Ponte TechDay -

    2018 Migrations for Java
  2. EM 2005 EU SÓ QUERIA SABER DE FRAMEWORKS

  3. ANALISTA DE SISTEMAS 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. EM PRODUÇÃ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 MUDE O NOME DA COLUNA

  19. SEMPRE PODE PIORAR MUDE O TIPO DA COLUNA

  20. SEMPRE PODE PIORAR ADICIONE UMA COLUNA NOT-NULL

  21. 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
  22. 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
  23. I — HIBERNATE ϟ

  24. DO PROJETO SOMENTE NO INICIO APRENDI: GERAR SCHEMA COM HIBERNATE

  25. CORRIGINDO O BANCO NA MÃO

  26. CORRIGINDO O BANCO NA MÃO Mario Diniz Não tá entrando

    na tela...
  27. CORRIGINDO O BANCO NA MÃ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. Migrations for Java EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL

  30. @rponte

  31. Como você evolui sua APP?

  32. Como você evolui seu BANCO?

  33. Como você evolui seu BANCO? gerencia mudanças

  34. PREPARA UM HUGE_SCRIPT.SQL E APLICA MANUALMENTE?

  35. DEIXA NA MÃO DO DBA?

  36. DEIXA NA MÃO DO ARQUITETO? * BDUF (Big Design Up

    Front) *
  37. CRIA SUA PRÓPRIA FERRAMENTA, CERTO? NÓS — TECNOLOGIA CASEIRA

  38. OU GERA COM HIBERNATE?

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

  40. CADA SOLUÇÃO TEM VANTAGENS E DESVANTAGENS

  41. CADA SOLUÇÃO TEM SEUS PRÓS E CONTRAS

  42. A COMUNIDADE RUBYONRAILS APRENDEU DESDE O COMEÇO

  43. SIMPLES E EFICAZ: MIGRATIONS

  44. A COMUNIDADE JAVA PARECE QUE NÃO APRENDEU AINDA COMO SE

    FAZ
  45. Java ferramentas para todos os gostos

  46. TODAS SEGUEM O MESMO CONCEITO

  47. PASSOS 4 RESUMINDO EM

  48. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) script.sql
  49. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) create_table_blog.sql
  50. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) 1_create_table_blog.sql
  51. CRIE O SCRIPT COM A MUDANÇA 1 CREATE TABLE 'blog'

    ( 'id' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 'descricao' VARCHAR(255) NOT NULL PRIMARY KEY ('id') ) <ID>_<DESCRIPTION>.sql
  52. APLICA O SCRIPT NO BANCO 2 [rponte] ~/myblog/scripts $ migrate

    up
  53. APLICA O SCRIPT NO BANCO 2 [rponte] ~/myblog/scripts $ migrate

    up -env=PRODUCTION -env=HOMOLOG -env=DEV -env=TEST
  54. VERSIONA A MUDANÇA NO BANCO 3 mysql> select * from

    DB_VERSION; +----+---------------------+ | ID | DESCRIPTION | +----+---------------------+ | 1 | create table blog | +----+---------------------+
  55. APLICA SCRIPTS AINDA NÃO APLICADOS 4 [rponte] ~/myblog/scripts $ migrate

    up mysql> select * from DB_VERSION; +----+---------------------+ | ID | DESCRIPTION | +----+---------------------+ | 1 | create table blog | | 2 | create table author | | 3 | create table post | +----+---------------------+
  56. CRIA O SCRIPT 1 APLICA SCRIPT 2 VERSIONA O BANCO

    3 APLICA NOVOS SCRIPTS 4
  57. Java ferramentas para todos os gostos

  58. Java ferramentas para todos os gostos liquibase mybatis flyway

  59. FLYWAY LIQUIBASE MYBATIS MIGRATIONS

  60. FLYWAY LIQUIBASE MYBATIS MIGRATIONS

  61. Flyway

  62. Flyway > Plain SQL migrations

  63. Flyway > Plain SQL migrations > Java migrations

  64. Flyway > Plain SQL migrations > Java migrations > Convention

    over Configuration
  65. Flyway > Plain SQL migrations > Java migrations > Convention

    over Configuration > SQL Parser
  66. Flyway > Plain SQL migrations > Java migrations > Convention

    over Configuration > SQL Parser > Java API - Ant - Maven - Gradle
  67. FLYWAY LIQUIBASE MYBATIS MIGRATIONS

  68. Liquibase

  69. Liquibase > XML migrations

  70. Liquibase > XML migrations > Plain SQL migrations

  71. Liquibase > XML migrations > Plain SQL migrations > Multiple

    Databases
  72. Liquibase > XML migrations > Plain SQL migrations > Multiple

    Databases > Rollback support
  73. Liquibase > XML migrations > Plain SQL migrations > Multiple

    Databases > Rollback support > Generation of SQL scripts for DBA
  74. FLYWAY LIQUIBASE MYBATIS MIGRATIONS

  75. MyBatis Schema Migrations

  76. MyBatis Schema Migrations > Plain SQL migrations

  77. MyBatis Schema Migrations > Plain SQL migrations > Maven

  78. MyBatis Schema Migrations > Plain SQL migrations > Rollback support

    > Maven
  79. MyBatis Schema Migrations > Plain SQL migrations > Generation of

    SQL scripts for DBA > Rollback support > Maven
  80. APESAR DE TANTAS OPÇÕES HOJE EM DIA

  81. APESAR DE TANTAS OPÇÕES HOJE EM DIA EM 2009 ERA

    DIFERENTE
  82. APESAR DE TANTAS OPÇÕES HOJE EM DIA ADOTAMOS O MYBATIS

    MIGRATIONS
  83. WINDOWS, LINUX E MACOSX ADOTAMOS O MYBATIS MIGRATIONS

  84. PODEMOS FACILITAR E FOI O QUE FIZEMOS ANT SCRIPT

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

  87. PODEMOS FACILITAR E FOI O QUE MARCELO FEZ GRADLE PLUGIN

  88. PODEMOS FACILITAR E FOI O QUE MARCELO FEZ GRADLE PLUGIN

    Ant é tão OLD!
  89. Gradle-Migrations-Plugin github.com/marceloemanoel/gradle-migrations-plugin

  90. None
  91. MAVEN MyBatis Migrations

  92. MAVEN ANT MyBatis Migrations

  93. MAVEN ANT GRADLE MyBatis Migrations

  94. FLYWAY LIQUIBASE MYBATIS MIGRATIONS

  95. FLYWAY LIQUIBASE MYBATIS MIGRATIONS QUAL ESCOLHER?

  96. MIGRATIONS

  97. MIGRATIONS = EVOLUÇÃO SUSTENTÁVEL DO BANCO

  98. MIGRATIONS MELHOR PROCESSO + = EVOLUÇÃO SUSTENTÁVEL DO BANCO

  99. MELHORE O PROCESSO

  100. EQUIPE RESPONSÁVEL PELO BANCO

  101. COLOQUE AS MIGRATIONS NO CONTROLE DE VERSÃO

  102. - BANCO DE DADOS COMPARTILHADO - NAO USE EM DESENVOLVIMENTO

  103. - BANCO DE DADOS COMPARTILHADO - NAO USE EM DESENVOLVIMENTO

  104. Banco de Dados Rafael Mario Handerson ... ...

  105. Rafael Mario Handerson ... Banco Banco Banco ... ... ...

  106. Banco de Dados Rafael Mario Handerson ... Schema Schema Schema

    ... ... ...
  107. AUTOMATIZE O MÁXIMO QUE PUDER

  108. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43
  109. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 deploy frequente
  110. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 deploy frequente deploy controlado
  111. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  112. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v48 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  113. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v44 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  114. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v45 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  115. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v43 deploy frequente deploy controlado deploy MUITO controlado
  116. Rafael v48 Rafael v48 Rafael v48 Mario v49 Rafael v48

    Handerson v43 Integration v49 Q&A v49 Demo v49 Produção v49 deploy frequente deploy controlado deploy MUITO controlado
  117. NÃO MODIFIQUE MIGRATIONS QUE FORAM PARA PRODUÇÃO

  118. GRANDES MUDANÇAS PEQUENAS MIGRATIONS

  119. MIGRATIONS MELHOR PROCESSO + = EVOLUÇÃO SUSTENTÁVEL DO BANCO

  120. SEMPRE PODE PIORAR

  121. APP BANC

  122. 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
  123. 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.”
  124. EVOLUIR O BANCO NESSE CENÁRIO É CARO

  125. Original Transição Resultado

  126. Original Transição Resultado modifica o banco {

  127. Original Transição Resultado modifica o banco período de transição (antigo

    e novo) { {
  128. Original Transição Resultado modifica o banco período de transição (antigo

    e novo) finaliza a modificação { { {
  129. 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
  130. 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
  131. CONCLUINDO

  132. EVOLUIR O BANCO É MAIS DIFÍCIL DO QUE A APLICAÇAO

  133. TRABALHE JUNTAMENTE COM O DBA

  134. ESTUDE, EXPERIMENTE E ESCOLHA UMA MIGRATIONS TOOL

  135. Obrigado!

  136. Rafael Ponte rponte@gmail.com