Nulla Downtime instruere et Databases

Nulla Downtime instruere et Databases

Articulus hic singillatim explicat quomodo convenientiae datorum solutiones quaestiones instruere. Dicemus tibi quid evenire possit ad applicationes producendas, si sine praeparatione praevia explicari conaris. Percurremus igitur per applicationes vitae curriculas quae necessariae sunt ut nulla downtime habeatur (proxime. lane: porro - nulla downtime). Effectus operationum nostrarum erit applicabilis database mutationi retro-compatibili modo retrorsum compatibili.

Si exempla ex articulo cognoscere vis signum, ea invenire potes GitHub.

introduction

Nulla downtime deployment

Quid mysticum nulla downtime deployment? Hoc dicere potes cum applicatione tua ita explicatur ut feliciter novam versionem applicationis ad productionem introducere possis, usor suam inutilem non notat. Ex prospectu usoris et societatis, haec optima missionis instruere potest quia novas notas induci et cimices sine distractione figi sinit.

Quomodo hoc assequendum? Plures modi sunt, hic unus est;

  • versionem explicandam No. I tui muneris
  • database agentibus praestare
  • Deploy versionem # II tui muneris in parallela cum versio # I "
  • quam primum versionem illam N. 2 opera ut decet, versionem removere, No. 1
  • parati!

Facile, annon? Infeliciter, non est simplex ille, ac postea singillatim intuebimur. Nunc reprehendo alium processum instruere satis communem - caeruleum viridem instruere.

Have vos umquam audistis de blue viridis deployment? Cloud Foundry hoc perfacile facit. Iustus aspice hoc articulumubi fusius id describimus. Ut breviter compendiose dicamus, te admonemus quomodo instruere caeruleum viridem facias;

  • ut duo exemplaria operis productionis vestrae ("caeruleae" et "viridi") operentur;
  • omnia negotiatio ad caeruleum ambitum dirigat, i.e. ut productionem URL designent;
  • explica et proba omnia applicationis mutationes in viridi ambitu;
  • switch delata de hyacintho ad viridi environment

Instructione viridis caerulei aditus est qui sinit te facile novas formas inducere sine fractionis productionis cura. Hoc accidit quod, etiam si aliquid acciderit, facile ad priorem ambitum revolvere potes simpliciter "fligere transitum."

His omnibus supradictis perlectis, quaestionem quaerere potes: Quid nihil interest temporis caerulei viridis instruere?

Bene multum habent commune, quoniam duo exemplaria eiusdem ambitus conservandi laborem duplicem requirit. Hoc est, quod quidam teams dicunt Martinus Fowlersequuntur variatio aditus;

Alia optio eodem database utatur, virgas caeruleas-viridis pro strata interreti et dominii efficiens. In hoc aditu, datorum saepe quaestio esse potest, praesertim cum necesse est suum schema mutare ad novam programmatis versionem sustinendam.

Et hic ad quaestionem principalem in hoc articulo venimus. database. Inspice hanc locutionem aliam sumamus.

database agentibus praestare.

Nunc te ipsum interrogare debes - quid si mutatio datorum retrorsum non compatitur? Nonne prima versio app confractus? Nam id ipsum quam...

Itaque, licet ingentia beneficia nulla downtime / caeruleo viridi instruere, turmas sequi solent sequentes processus tutiores ad earum applicationes explicandas:

  • parare sarcina cum novam versionem applicationis
  • clausa est currens application
  • currere scriptor migrandi database
  • explicandam et novam versionem applicationis

In hoc articulo, singillatim exprimemus quomodo cum database tuo et codice laborare potes ut nulla temporis instruere utilitas possit.

Database difficultates

Si applicationem staterem habeas qui notitias in datorum non congreges, nulla downtime instruere statim potes. Infeliciter, luctus eget magna alicubi copia notitia. Inde est, quod bis cogitandum sit antequam ad ambitum mutandum sit. Priusquam in singula ingrediamur schema mutandi ut nullo tempore instruere potest, primum in schema versionis versarimus.

Versio consilium

In hoc articulo utemur Flyway sicut instrumentum versionis imperium (proxime. Translation: loquimur de migrationibus database). Naturaliter etiam scribemus applicationem fontis Taberni quae in Flyway sustentationem aedificavit et schema migrationis praestabit dum contextui applicationis constituens. Cum Flyway utens, migrationem scriptorum reponere potes in inceptis tuis folder (per defaltam in " classpath:db/migration). Hic videre potes exemplum talis imagini migrationis

└── db
 └── migration
     ├── V1__init.sql
     ├── V2__Add_surname.sql
     ├── V3__Final_migration.sql
     └── V4__Remove_lastname.sql

In hoc exemplo videmus scripta migratoria 4 quod, nisi antea exsecutum est, unum post alterum, cum incipit applicatione, exsecutioni mandari. Intueamur unum de files (V1__init.sql) in exemplum.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Omnia perfecte se explicata sunt: ​​SQL definire potes quomodo modificatio tua modificanda sit. Pro magis informationes de Tabernis et Flyway, Lorem Ver Booz Docs.

Utendo fonte instrumenti instrumenti ad Fontem Booz vernum, 2 magnas utilitates accipis:

  • separabis database mutationes ex codice mutationes
  • Migratio Database fit cum rollout applicationis tui, i.e. tuum deployment processus simplicior

Troubleshooting problems database

In altera sectione articuli, duos aditus datorum mutationum inspicere intendemus.

  • retrorsum repugnantiam
  • retrorsum convenientiam

Prima quasi admonitio considerabitur ne nulla downtime instruere debeas sine praeparatione praevia... Secunda solutionem praebet quomodo instruere potes sine tempore et simul retro convenientiam ponere.

Propositum nostrum laborandum erit simplex Spring Booz Flyway application quod habet Person с first_name и last_name in database (proxime. translatio: Person est mensa et f *irst_name и last_name - hi sunt agri in eo). Volumus rename last_name в surname.

Assumptionis

Priusquam ad singula ingrediamur, duo principia de applicationibus nostris agere debemus. Consequuntur consectetur quod volumus adipisci, sit processus modicus simplex.

vett. NEGOTIUM PRO-TIP. Processus simpliciores te multam pecuniam in auxilio servare possunt (quo plus homines pro societate tua laborasti, eo plus pecuniae servare potes)!

Non opus est revolvere database

Hoc simpliciorem reddit processum instruere (nonnulla volventia database fere impossibilia sunt, ut revertitur deletio). Malimus applicationes solas revolvere. Hoc modo, etiam si databases differentes habes (exempli gratia SQL et NoSQL), instituti tui pipelinum eundem spectabit.

Fieri semper potest ut applicationis unius versionis retro (no more) revolvere

Reversum solum fieri cum necesse est. Si cimex in emendatione emendationis non facile figitur, reverti ad emendationem novissimam poterit reverti. Ponamus hanc postremam versionem laborativam esse priorem. Servans codicem et convenientiam datorum plus quam unum rollout difficillimum et sumptuosum esset.

nota. Ad maiorem readability maiorem applicationis versionem in hoc articulo mutabimus.

Gradus I: Coepi rei publicae

App versio: 1.0.0
DB versione: v1

comment

Hic erit status applicationis initialis.

Database mutationes

DB continet last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Code commutationes

Applicatio stores data in personam last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

Retro repugnat columna renaming

Intueamur exemplum quomodo columnae nomen mutet;

Operam. Hoc exemplum intentione franget omnia. Hoc demonstramus problema compatibilitatis datorum demonstrare.

App versio: 2.0.0.BAD

DB versione: v2bad

comment

Mutationes hodiernae non sinunt nos duas instantias simul (vetus et novas) currere. Ita nulla downtime instruere difficile erit consequi (si rationes suppositiones, revera impossibilis est).

A/B probatio

Praesens condicio est quam applicationem versionis habemus 1.0.0, explicatur in productione et database v1. Instantia secunda applicationis, versio, explicanda est 2.0.0.BADac update database to v2bad.

Vestigia:

  1. nova exempli gratia de versionis application est deployed 2.0.0.BADquod updates to database v2bad
  2. In database v2bad columnae last_name non iam exstat - quod mutatum est surname
  3. In database et applicatione renovationis felix fuit et quaedam instantiae currunt 1.0.0alii - in 2.0.0.BAD. Omnia coniuncta datorum v2bad
  4. omnibus exemplis versionis 1.0.0 incipiet errores iacere quod notitia in columna inserere conabitur last_namequi iam non existit
  5. omnibus exemplis versionis 2.0.0.BAD non operatur sine problems

Ut videre potes, si retrorsum mutationibus datorum et applicationi repugnantes facimus, A/B probatio non potest esse.

Applicationem reverti

Ponamus quod cum conatur facere A / B deployment (proxime. per .: auctor probabiliter intellexit A/B hic probat) decrevimus nos applicationes ad versionem revolvere 1.0.0. Dicamus nos nolumus database revolvere.

Vestigia:

  1. nos prohibere versionem application exempli 2.0.0.BAD
  2. database adhuc v2bad
  3. cum versionem 1.0.0 non intelligitis quid sit surnameVidebimus errores
  4. Infernus disrupit, redire amplius non possumus

Ut videre potes, si retro incompossibilis mutationibus datorum et applicationum facimus, ad priorem versionem revolvere non possumus.

Acta scriptor supplicium

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

Database mutationes

Donec adipiscing scriptum quod renames last_name в surname

Fons Flyway script:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Scriptor qui renames last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

Code commutationes

Nos mutata in agro nomen eius lastName on surname.

Renaming in columna retro-compatible via

Haec est communissima condicio perspiciendi. Opus est ut retro incompossibilia mutantur. Iam demonstravimus de instruere ad tempus nulla, migrationem database simpliciter adhibere non debemus sine gradibus additis. In hac sectione articuli, III applicationis cum migrationibus datorum ad optatum effectum, servata retrorsum convenientia, perficiemus.

vett. Recole quod habemus versionem database v1. Columnas continet first_name и last_name. Habemus mutare last_name on surname. Nos quoque app version 1.0.0, quae nondum usus est surname.

Gradus II: Add cognomen

App versio: 2.0.0
DB versione: v2

comment

Novam columnam addendo et contenta sua describendo, retrogradas mutationes datorum compatibiles creamus. Eodem tempore, si urnam revolvamus vel vetus URNA currentem habebimus, in executione non comminuetur.

Volumus novam versionem

Vestigia:

  1. migratio database agminis creare novum praestare surname. Nunc tuum DB versionem v2
  2. effingo notitia ex last_name в surname. placere noteSi multum huius notitiae habes, batch migrationem consideres!
  3. scribe in codice ubi sunt AMBO' и новыйet veteris columnae. Nunc tuum app version 2.0.0
  4. legunt valorem ex columna surnamesi non est nullaut l *ast_namesi surname non datum est. Potes delere getLastName() ex codice, cum erit output null Cum devolvens vestri application e 3.0.0 ad 2.0.0.

Si uteris Spring Booz Flyway, hi duo gradus in versione startup fient 2.0.0 utilibus. Si manually instrumentum versionis datorum curris, duo diversa facere debebis (prima renovatio db versionis manually et deinde novam applicationem explicandam).

Important. Memento quod columnae recens creatae NON DEBET quod NOT. Si reverti facias, vetus applicatio de columna nova nescit nec in eo instituet Insert. Sed si hanc necessitatem addideris, et db erit v2, hoc valorem novae columnae requiret. Quas ad violationes restrictionum ducunt.

Important. Rem removere modum getLastName()quia in versione 3.0.0 Nulla notio columnae in codice last_name. Hoc significat quod nullum apponetur. Methodum relinquere potes et ad reprehendo addendi nullSed multo melius erit fac ut in logica getSurname() non-nulla valorem rectam te elegit.

A/B probatio

Praesens condicio est quam applicationem versionis habemus 1.0.0de productione, et datorum v1. In secundo casu versionis explicandae applicationis opus est 2.0.0quod mos update database to v2.

Vestigia:

  1. nova exempli gratia de versionis application est deployed 2.0.0quod updates to database v2
  2. interim nonnullae petitiones instantiarum versionis discursum sunt 1.0.0
  3. the update was successful and you have many current instances of the version application 1.0.0 et aliae versiones 2.0.0. Quisque communicat cum database in v2
  4. versionem 1.0.0 cognomentum non columna in datorum utitur, sed in versione 2.0.0 utitur. Nihil impedit et ne sint error.
  5. versionem 2.0.0 thesauros notitias tam veteris quam novae columnae prospicientes retrorsum convenientiae

Important. Si quas quaestiones habes quae numerant res secundum valores veteris/novae columnae, memineris te nunc habere valores duplicatos (maxime verisimile adhuc migrantes). Exempli gratia, si vis numerare numerum utentium, quorum cognomen (quodcumque columna appellatur) a littera incepit A, donec notitia migrationis compleatur (oldnew columna) inconstantes notitias habere potes si novam columnam quaesiveris.

Applicationem reverti

Nunc habemus app version 2.0.0 ac database in v2.

Vestigia:

  1. revolvet tua application ut versionem 1.0.0.
  2. versionem 1.0.0 non utitur columna in database surname, ut bene sit reverti

DB mutationes

database in columna nomine last_name.

Flyway fons script:

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

Adde script surname.

Operam. Memento te nullas angustias ad columnam quam addis. Si URNA revolvas, vetus versio nullam ideam habebit de columna addita et sponte eam ad NULL ponet. Si talis limitatio est, vetus applicatio simpliciter franget.

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

Code commutationes

Condimus notitia ut last_nameet in surname. Simul legitur a last_namehaec enim columna maxime pertinet. In processu instruere, nonnullae petitiones per applicationem instantiae quae nondum renovatae sunt, potuimus discursum esse.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

Gradus III, removere last_name ex codice

App versio: 3.0.0

DB versione:v3

comment

Nota per. : Videtur quod in articulo originali auctor textum huius scandali falso transcribit a gradu 2. Ad hunc gradum mutationes faciendae sunt in schedula codice, ad tollendam functionem quae columna utitur. last_name.

Novam columnam addendo et contenta sua imitando, retrorsum mutationibus datorum compatibles creavimus. Item, si urnam revolvamus vel vetus URNA currentem habeat, in executione non comminuetur.

Applicationem reverti

Currently habemus app version 3.0.0 ac database v3. Version 3.0.0 non salvat data to last_name. Hoc significat quod in surname maxime up-to-date notitia reponitur.

Vestigia:

  1. revolvet tua application ut versionem 2.0.0.
  2. versionem 2.0.0 usus et last_name и surname.
  3. versionem 2.0.0 tollet surnamesi non nulla, aliter.last_name

Database mutationes

Nullae structurae mutationes in database. Hoc scriptum est ad ultimam migrationem veteris notitiae exsecutioni mandandam;

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

Code commutationes

Nota per. : Descriptio huius scandali etiam mendose ab autore a gradatim transcripta est 2. Secundum logicam articuli, mutationes in codice ad hunc gradum intendendum est, ut ab eo elementa, quae per columnam operantur, tollantur. last_name.

Condimus notitia ut last_nameet in surname. Accedit quod legitur de columna last_namecum sit maxime pertinens. In processu instruere, aliquae petitiones possunt discurrere per instanciam quae nondum upgraded est.

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

Gradus IV: removere last_name ex database

App versio: 4.0.0

DB versione: v4

comment

Ob hoc quod versio codice 3.0.0 non utebantur columnae last_namenihil mali fiet in executione , si nos revolvamus 3.0.0 columna datorum amoto.

Acta scriptor supplicium

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB mutationes

Relative v3 non solum removere columna last_name et adde absentis modum.

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

Code commutationes

Mutationes in codice nullae sunt.

conclusio,

Feliciter applicavimus nomen columnae retrorsum-incompossibilis mutationis faciendo varias formas retrogradas componibiles. Infra summarium est actionum factorum;

  1. applicationem versionem instruere 1.0.0 с v1 database schema (columna nomen = last_name)
  2. applicationem versionem instruere 2.0.0, quae stores data in last_name и surname. Applicatio legit ex last_name. database in versione v2quibus columnas sicut last_nameautem surname. surname est exemplum l *ast_name. (Nota: Haec columna nullam necessitatem habere debet)
  3. applicationem versionem instruere 3.0.0, Quod solum addit notitia in surname and reads ex cognomine. Quod ad database, ultima migratio fit last_name в surname. Etiam limitatio NOT subtrahatur * last_name. Database nunc in versione v3
  4. applicationem versionem instruere 4.0.0 — Nullae mutationes in codice factae sunt. Database deployment v4qui removet last_name. Hic addere potes angustias datorum absentis.

Hanc accessionem sequendo semper unam versionem revolvere potes sine solutione database/applicationis convenientiae.

Code

Omnes codice in hoc articulo est available at Github. Infra adiectum est.

projects

Repositorium post perstrinxi, sequentem structuram folder videbis.

├── boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

Scripta

Potes currere scripta in scriptis infra descriptis, quae retrorsum-compatibiles et incompatibiles mutationes datorum demonstrabunt.

Videre apud retrorsum compatible mutationes, Curre:

./scripts/scenario_backward_compatible.sh

Et videre apud retrorsum repugnat mutationes, Curre:

./scripts/scenario_backward_incompatible.sh

Ver Booz Sample Flyway

Omnia exempla ex Spring Boot Sample Flyway.

Vide potes http://localhost:8080/flywayexstat catalogus scriptorum.

Hoc exemplum etiam H2 consolatorium includit http://localhost:8080/h2-console) sic videre potes statum datorum (default jdbc URL is jdbc:h2:mem:testdb).

praeterea

Legunt etiam alia capitula in nostro diario:

Source: www.habr.com

Add a comment