migrations for java (qconsp2013)
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.TRANSCRIPT
EVOLUINDO SEU BANCO DE MANEIRA INCREMENTAL
Rafael PonteQCon SP 2013
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
@Entityclass Issue {@Idprivate Long id;private String descricao;…
}
Nova Entidade
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
I ♥ HIBERNATE
@Entityclass Issue {@Idprivate Long id;private String descricao;private String status = "A"; …
}
Entidade ATUALIZADA!
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
I ♥ HIBERNATE
@Entityclass Issue {@Idprivate 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 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
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
Príncipe do Oceano
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
TODASSEGUEM 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> Java migrations> Convention over Configuration> SQL Parser> Java API - Ant - Maven - Gradle
FLYWAY LIQUIBASE MYBATIS MIGRATIONS
Liquibase
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
> 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 2009ERA 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ÇÃOSUSTENTÁVELDO BANCO
MIGRATIONS MELHORPROCESSO+ =
EVOLUÇÃOSUSTENTÁVELDO 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
Rafael Mario Handerson ......
Rafael Mario Handerson ...
Banco Banco Banco ...
...
...
Banco de Dados
Rafael Mario Handerson ...
Schema Schema Schema ...
...
...
AUTOMATIZE O MÁXIMO QUE PUDER
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv48
deploy frequente
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv48
Q&Av44
Demov45
deploy frequente deploy controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv48
Q&Av44
Demov45
Produçãov43
deploy frequente deploy controlado deploy MUITO controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv48
Q&Av44
Demov45
Produçãov43
deploy frequente deploy controlado deploy MUITO controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv49
Q&Av44
Demov45
Produçãov43
deploy frequente deploy controlado deploy MUITO controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv49
Q&Av49
Demov45
Produçãov43
deploy frequente deploy controlado deploy MUITO controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv49
Q&Av49
Demov49
Produçãov43
deploy frequente deploy controlado deploy MUITO controlado
Rafaelv48Rafaelv48
Rafaelv48Mariov49
Rafaelv48
Handersonv43
Integrationv49
Q&Av49
Demov49
Produçãov49
deploy frequente deploy controlado deploy MUITO controlado
NÃO MODIFIQUE MIGRATIONS QUE FORAM
PARA PRODUÇÃO
GRANDES MUDANÇASPEQUENAS MIGRATIONS
MIGRATIONS MELHORPROCESSO+ =
EVOLUÇÃOSUSTENTÁVELDO BANCO
SEMPREPODE
PIORAR
APP
BANCO
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
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.”
EVOLUIR O BANCO NESSE CENÁRIO
É CARO
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