Nkwanye oge efu efu na ọdụ data

Nkwanye oge efu efu na ọdụ data

Edemede a na-akọwa n'ụzọ zuru ezu otu esi edozi nsogbu ndakọrịta nchekwa data na ntinye. Anyị ga-agwa gị ihe nwere ike ime ngwa mmepụta gị ma ọ bụrụ na ị nwaa ibugharị na-enweghị nkwadebe mbụ. Anyị ga-agafe usoro ndụ okirikiri ngwa nke achọrọ ka ọ ghara inwe oge efu (efu).ihe ruru. uzo: ozo - efu downtime). Nsonaazụ nke ọrụ anyị ga-abụ itinye mgbanwe nchekwa data azụ azụ na-adakọghị na azụ azụ.

Ọ bụrụ na ịchọrọ ịghọta ihe atụ koodu sitere na akụkọ, ị nwere ike ịhụ ha na GitHub.

Okwu Mmalite

Nkwanye oge nkwụsịtụ efu

Kedu ihe omimi ntinye oge efu efu? Ị nwere ike ịsị na nke a bụ mgbe etinyere ngwa gị n'ụzọ ị ga-enwe ike iwebata ụdị ngwa ọhụrụ na mmepụta nke ọma, ebe onye ọrụ anaghị achọpụta na ọ dịghị. Site n'echiche onye ọrụ na ụlọ ọrụ, nke a bụ ọnọdụ mbugharị kachasị mma n'ihi na ọ na-enye ohere ka ewebata atụmatụ ọhụrụ yana idozi ahụhụ na-enweghị nsogbu.

Kedu ka esi enweta nke a? Enwere ụzọ dị iche iche, ebe a bụ otu n'ime ha:

  • tinye ụdị No. 1 nke ọrụ gị
  • mee njem nchekwa data
  • Nyefee ụdị #2 nke ọrụ gị na ụdị #1
  • Ozugbo ị hụrụ na ụdị nke 2 na-arụ ọrụ dị ka o kwesịrị, wepụ ụdị nke 1
  • emeela!

Ọ dị mfe, ọ bụghị ya? N'ụzọ dị mwute, ọ bụghị otú ahụ dị mfe, anyị ga-eleba anya na nke ahụ n'ụzọ zuru ezu ma emechaa. Ugbu a, ka anyị lelee usoro nnabata ọzọ a na-ahụkarị - blue green deployment.

Ị nụtụla maka ya acha anụnụ anụnụ nkenye ọnọdụ? Cloud Foundry na-eme ka nke a dị mfe. Naanị lelee Akụkọ a, ebe anyị na-akọwa nke a n'ụzọ zuru ezu. Iji chịkọta nkenke, ka anyị chetara gị otu esi eme ntinye akwụkwọ ndụ akwụkwọ ndụ anụnụ anụnụ:

  • hụ na mbipụta abụọ nke koodu mmepụta gị ("acha anụnụ anụnụ" na "acha akwụkwọ ndụ akwụkwọ ndụ") na-arụ ọrụ;
  • duzie okporo ụzọ niile gaa na gburugburu anụnụ anụnụ, ya bụ. ka URL mmepụta rụtụ aka n'ebe ahụ;
  • tinye ma nwalee mgbanwe ngwa niile na gburugburu akwụkwọ ndụ akwụkwọ ndụ;
  • gbanwee url site na-acha anụnụ anụnụ gaa na gburugburu akwụkwọ ndụ akwụkwọ ndụ

Ntugharị akwụkwọ ndụ akwụkwọ ndụ na-acha anụnụ anụnụ bụ ụzọ na-enye gị ohere iwebata atụmatụ ọhụrụ n'ụzọ dị mfe na-enweghị nchegbu maka mmebi mmepụta. Nke a bụ n'ihi n'eziokwu na ọ bụrụgodị na ihe emee, ị nwere ike ịlaghachi na gburugburu ebe gara aga site na "ịtụgharị ọkụ."

Mgbe ị gụchara ihe niile dị n'elu, ị nwere ike jụọ ajụjụ a: Gịnị ka oge efu efu nwere njikọ na ntinye akwụkwọ ndụ akwụkwọ ndụ Blue?

Ọfọn, ha nwere ọtụtụ ihe jikọrọ ya, ebe ọ bụ na idebe mbipụta abụọ nke otu gburugburu na-achọ mgbalị okpukpu abụọ iji nọgide na-enwe ha. Nke a mere ụfọdụ otu na-ekwu Martin Fowler, soro usoro a dị iche iche:

Nhọrọ ọzọ bụ iji otu nchekwa data ahụ, na-emepụta mgbanwe na-acha anụnụ anụnụ-acha akwụkwọ ndụ maka webụ na ngalaba ngalaba. Na usoro a, nchekwa data nwere ike bụrụ nsogbu mgbe mgbe, ọkachasị mgbe ịchọrọ ịgbanwe atụmatụ ya iji kwado ụdị ngwanro ọhụrụ.

Na ebe a, anyị na-abịa na isi nsogbu na isiokwu a. Database. Ka anyị leba anya ọzọ na nkebiokwu a.

mee njem nchekwa data.

Ugbu a ị ga-ajụ onwe gị ajụjụ a - gịnị ma ọ bụrụ na mgbanwe nchekwa data adịghị adaba na azụ azụ? Ụdị ngwa mbụ m agaghị agbaji? N'ezie, nke a bụ kpọmkwem ihe ga-eme ...

Yabụ, ọbụlagodi na nnukwu uru nke mbugharị oge efu / acha anụnụ anụnụ, ụlọ ọrụ na-agbaso usoro nchekwa ndị a maka ibuga ngwa ha:

  • kwadebe ngwugwu nwere ụdị ngwa ọhụrụ
  • mechie ngwa na-agba ọsọ
  • na-agba ọsọ scripts ịkwaga nchekwa data
  • zipu ma malite ụdị ngwa ọhụrụ

N'ime edemede a, anyị ga-akọwapụta otu ị ga-esi rụọ ọrụ na nchekwa data gị na koodu iji nweta ohere nke itinye oge efu efu.

Проблемы с базой данных

Ọ bụrụ na ị nwere ngwa na-enweghị obodo nke na-adịghị echekwa data ọ bụla na nchekwa data, ị nwere ike nweta oge nkwụsịtụ efu ozugbo. N'ụzọ dị mwute, ọtụtụ ngwanrọ kwesịrị ịchekwa data ebe. Nke a bụ ya mere ị ga-eji chee echiche ugboro abụọ tupu ịme mgbanwe ọ bụla na sekit. Tupu anyị abanye n'ime nkọwa nke otu esi agbanwe schema ka ewee oge enweghị oge ọ ga-ekwe omume, ka anyị buru ụzọ lekwasị anya na atụmatụ nsụgharị.

Atụmatụ nsụgharị

N'isiokwu a, anyị ga-eji Flyway dị ka ngwá ọrụ njikwa ụdị (ihe ruru. Ntụgharị: anyị na-ekwu maka mbugharị nchekwa data). Dị ka o kwesịrị ịdị, anyị ga-edekwa ngwa Boot Spring nke wulitere nkwado Flyway ma ga-eme njem nlegharị anya mgbe ị na-ahazi ọnọdụ ngwa ahụ. Mgbe ị na-eji Flyway, ị nwere ike chekwaa scripts mbugharị na nchekwa ọrụ gị (site na ndabara na classpath:db/migration). N'ebe a ị nwere ike ịhụ ihe atụ nke faịlụ mbugharị dị otú ahụ

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

N'ihe atụ a, anyị na-ahụ script mbugharị 4 nke, ọ bụrụ na emeghị ya na mbụ, a ga-egbu ya otu mgbe nke ọzọ mgbe ngwa ahụ malitere. Ka anyị lee otu n'ime faịlụ ndị ahụ (V1__init.sql) dị ka ihe atụ.

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');

Ihe niile na-akọwa onwe ya nke ọma: ị nwere ike iji SQL kọwaa otu esi agbanwe nchekwa data gị. Maka ozi ndị ọzọ gbasara Spring Boot na Flyway, lelee Akwụkwọ akpụkpọ ụkwụ mmiri.

Site na iji ngwa njikwa isi mmalite na Spring Boot, ị ga-enweta nnukwu uru abụọ:

  • ị na-ekewa mgbanwe nchekwa data na mgbanwe koodu
  • Mbugharị ọdụ data na-apụta yana mwepu nke ngwa gị, ya bụ. usoro ntinye gị dị mfe

Ịchọpụta nsogbu nchekwa data

N'akụkụ na-esote nke isiokwu a, anyị ga-elekwasị anya n'ịlele ụzọ abụọ maka mgbanwe nchekwa data.

  • ndakọrịta azụ azụ
  • ndakọrịta azụ azụ

A ga-ewere nke mbụ dị ka ịdọ aka ná ntị na ị gaghị arụ ọrụ nkwụsị oge efu na-enweghị nkwadebe mbụ ... Nke abụọ na-enye ngwọta maka otu ị ga-esi rụọ ọrụ ntinye n'enweghị oge nkwụsị ma n'otu oge ahụ na-echekwa ndakọrịta azụ.

Ọrụ anyị anyị ga-arụ ọrụ ga-abụ ngwa ngwa Boot Flyway dị mfe nke nwere Person с first_name и last_name na nchekwa data (ihe ruru. ntụgharị asụsụ: Person bụ okpokoro na first_name и last_name - ndị a bụ ubi ndị dị na ya). Anyị chọrọ ịgbanwe aha last_name в surname.

Echiche

Tupu anyị abanye na nkọwapụta, enwere echiche ole na ole anyị kwesịrị ime gbasara ngwa anyị. Isi nsonaazụ anyị chọrọ iji nweta ga-abụ usoro dị mfe.

Zametka. Azụmahịa PRO-NDỤMỌDỤ. Usoro dị mfe nwere ike ịzọpụta gị nnukwu ego na nkwado (ka ndị mmadụ na-arụ ọrụ maka ụlọ ọrụ gị, otú ahụ ka ego ị nwere ike ịchekwa)!

Ọ dịghị mkpa iweghachite nchekwa data

Nke a na-eme ka usoro mbugharị ahụ dị mfe (ụfọdụ mweghachi nchekwa data fọrọ nke nta ka ọ gaghị ekwe omume, dị ka ihichapụ rollback). Anyị na-ahọrọ ịtụgharị naanị ngwa. N'ụzọ dị otú a, ọ bụrụgodị na ị nwere ọdụ data dị iche iche (dịka ọmụmaatụ, SQL na NoSQL), pipeline gị ga-adị ka otu.

Ọ ga-abụrịrị na ọ ga-ekwe omume iweghachite ngwa ahụ otu ụdị azụ (ọ dịghị ọzọ)

A ga-emeghachighachi naanị mgbe ọ dị mkpa. Ọ bụrụ na enwere ahụhụ na ụdị ugbu a nke na-adịghị edozi ngwa ngwa, anyị ga-enwe ike ịlaghachi na ụdị ọrụ kachasị ọhụrụ. Anyị na-eche na ụdị ọrụ ọhụrụ a bụ nke gara aga. Idokwa koodu na ndakọrịta nchekwa data maka ihe karịrị otu mbugharị ga-esi ezigbo ike na ọnụ.

Ihe edeturu. Maka ịgụkwu akwụkwọ, n'isiokwu a, anyị ga-agbanwe ụdị ngwa ngwa.

Kwụpụ 1: Obodo mbụ

Ngwa ngwa: 1.0.0
Ụdị DB: v1

comment

Nke a ga-abụ ọnọdụ izizi nke ngwa ahụ.

Mgbanwe database

DB nwere 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');

Mgbanwe koodu

Ngwa ahụ na-echekwa data mmadụ na ya 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
                + "]";
    }
}

Ndogharị kọlụm na-adakọghị azụ azụ

Ka anyị lelee ọmụmaatụ otu esi agbanwe aha kọlụm:

Ntị. Ihe atụ na-esonụ ga-ama ụma mebie ihe. Anyị na-egosi nke a iji gosipụta nsogbu nke ndakọrịta nchekwa data.

Ngwa ngwa: 2.0.0.BAD

Ụdị DB: v2bad

comment

Mgbanwe ndị dị ugbu a anaghị ekwe ka anyị na-agba ọsọ ugboro abụọ (nke ochie na nke ọhụrụ) n'otu oge. Ya mere, ntinye oge efu efu ga-esi ike iji nweta (ọ bụrụ na echere echiche, ọ gaghị ekwe omume n'ezie).

Nnwale A/B

Ọnọdụ dị ugbu a bụ na anyị nwere ụdị ngwa 1.0.0, etinyere na mmepụta, na nchekwa data v1. Anyị kwesịrị ibuga ihe atụ nke abụọ nke ngwa, ụdị 2.0.0.BAD, ma melite nchekwa data na v2bad.

Nzọụkwụ:

  1. A na-etinye ihe atụ ọhụrụ nke ngwa ụdị 2.0.0.BADnke na-emelite nchekwa data na v2bad
  2. na nchekwa data v2bad kọlụm last_name adịkwaghị - e gbanwere ya surname
  3. Nchekwa nchekwa data na mmelite ngwa gara nke ọma na oge ụfọdụ na-agba ọsọ 1.0.0, ndị ọzọ - na 2.0.0.BAD. Ejikọtara ihe niile na nchekwa data v2bad
  4. oge niile nke ụdị 1.0.0 ga-amalite ịtụba njehie n'ihi na ha ga-anwa itinye data n'ime kọlụm last_nameonye na-adikwaghi adi
  5. oge niile nke ụdị 2.0.0.BAD ga-arụ ọrụ n'enweghị nsogbu

Dị ka ị na-ahụ, ọ bụrụ na anyị na-eme mgbanwe azụ azụ na nchekwa data na ngwa, ule A/B agaghị ekwe omume.

Ntughari ngwa

Ka anyị chee na mgbe agbalịchara ime ntinye A / B (ihe ruru. per.: eleghị anya odee pụtara ule A/B ebe a) anyị kpebiri na anyị kwesịrị iweghachite ngwa ahụ na ụdị 1.0.0. Ka anyị kwuo na anyị achọghị iweghachite nchekwa data.

Nzọụkwụ:

  1. anyị na-akwụsị ụdị ngwa atụ 2.0.0.BAD
  2. nchekwa data ka dị v2bad
  3. kemgbe version 1.0.0 aghọtaghị ihe ọ bụ surname, anyị ga-ahụ njehie
  4. hell agbajiwo, anyị enweghị ike ịlaghachi ọzọ

Dịka ị na-ahụ, ọ bụrụ na anyị emee mgbanwe na-adabaghị na nchekwa data na ngwa, anyị enweghị ike ịlaghachi na ụdị nke gara aga.

Ndekọ igbu egbu Script

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"}

Mgbanwe database

Ederede mbata na-atụgharị aha last_name в surname

Isi mmalite edemede Flyway:

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');

Edemede na-emegharị aha last_name.

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

Mgbanwe koodu

Anyị agbanweela aha ubi lastName on surname.

Ịgbanwegharị kọlụm n'ụzọ dakọtara azụ azụ

Nke a bụ ọnọdụ kachasị anyị nwere ike izute. Anyị kwesịrị ime mgbanwe na-ekwekọghị azụ azụ. Anyị egosilarị na maka mbugharị oge efu, anyị ekwesịghị itinye naanị ịkwaga nchekwa data na-enweghị usoro ọzọ. N'akụkụ a nke isiokwu a, anyị ga-arụ ọrụ 3 nke ngwa yana mbugharị nchekwa data iji nweta nsonaazụ achọrọ ka ị na-ejigide ndakọrịta azụ.

Zametka. Cheta na anyị nwere nchekwa data ụdị v1. O nwere ogidi first_name и last_name. Anyị ga-agbanwe last_name on surname. Anyị nwekwara ụdị ngwa 1.0.0, nke a na-ejibeghị surname.

Nzọụkwụ 2: Tinye aha nna

Ngwa ngwa: 2.0.0
Ụdị DB: v2

comment

Site n'ịgbakwunye kọlụm ọhụrụ na iṅomi ọdịnaya ya, anyị na-emepụta mgbanwe nchekwa data dakọtara azụ. N'otu oge ahụ, ọ bụrụ na anyị tụgharịa JAR ma ọ bụ nwee JAR ochie na-agba ọsọ, ọ gaghị agbaji mgbe a na-egbu ya.

Anyị na-ebupụ ụdị ọhụrụ

Nzọụkwụ:

  1. mee njem nchekwa data iji mepụta kọlụm ọhụrụ surname. Ugbu a ụdị DB gị v2
  2. detuo data si last_name в surname. Lezienụ anyana ọ bụrụ na ị nwere ọtụtụ data a, ị kwesịrị ịtụle ịkwaga batch!
  3. dee koodu ebe eji ha ABỤỌ и новыйna nke ochie kọlụm. Ugbu a ụdị ngwa gị 2.0.0
  4. gụọ uru site na kọlụm surname, ọ bụrụ na ọ bụghị null, ma ọ bụ site na last_name, surname akọwapụtaghị ya. Ị nwere ike ihichapụ getLastName() site na koodu, ebe ọ ga-apụta null mgbe ị na-atụgharị ngwa gị site na 3.0.0 ka 2.0.0.

Ọ bụrụ na ị na-eji Spring Boot Flyway, a ga-eme usoro abụọ a n'oge mmalite ụdị 2.0.0 ngwa. Ọ bụrụ na ị na-eji aka na-agba ọsọ nchekwa data mbipute ngwá ọrụ, ị ga-eme ihe abụọ dị iche iche ime nke a (bu ụzọ melite ụdị db na aka wee bukwasa ngwa ọhụrụ).

Ọ dị mkpa. Cheta na kọlụm emepụtara ọhụrụ EKWESỊGHỊ na-adị BULLGHULL OBI. Ọ bụrụ na ịmegharịgharị, ngwa ochie amaghị maka kọlụm ọhụrụ a agaghị etinye ya n'oge Insert. Mana ọ bụrụ na ị gbakwunye mmachi a na db gị ga-abụ v2, nke a ga-achọ ịtọ uru nke kọlụm ọhụrụ. Nke ga-eduga na mmebi nke mgbochi.

Ọ dị mkpa. Ị ga-ewepụ usoro ahụ getLastName(), n'ihi na na version 3.0.0 Enweghị echiche nke kọlụm na koodu last_name. Nke a pụtara na a ga-etinye null n'ebe ahụ. Ị nwere ike ịhapụ usoro ahụ wee tinye ndenye ego maka null, ma ihe ngwọta ka mma ga-abụ ijide n'aka na nke ahụ na mgbagha getSurname() ị họrọla uru na-abụghị efu.

Nnwale A/B

Ọnọdụ dị ugbu a bụ na anyị nwere ụdị ngwa 1.0.0, etinyere na mmepụta, yana nchekwa data n'ime v1. Anyị kwesịrị ibuga ihe atụ nke abụọ nke ngwa ụdị 2.0.0nke ga-emelite nchekwa data na v2.

Nzọụkwụ:

  1. A na-etinye ihe atụ ọhụrụ nke ngwa ụdị 2.0.0nke na-emelite nchekwa data na v2
  2. ka ọ dị ugbu a, a na-ahazi arịrịọ ụfọdụ site na ụdị ụdị 1.0.0
  3. mmelite ahụ gara nke ọma ma ị nwere ọtụtụ ihe na-agba ọsọ nke ngwa ụdị 1.0.0 na nsụgharị ndị ọzọ 2.0.0. Onye ọ bụla na-ekwurịta okwu na nchekwa data n'ime v2
  4. mbipute 1.0.0 anaghị eji kọlụm nna nna na nchekwa data, mana ụdị 2.0.0 eji. Ha adịghị etinye aka na ibe ha, na e kwesịghị inwe mmejọ.
  5. mbipute 2.0.0 na-echekwa data na kọlụm ochie na nke ọhụrụ, na-eme ka ndakọrịta azụ azụ

Ọ dị mkpa. Ọ bụrụ na ị nwere ajụjụ ọ bụla na-agụta ihe dabere na ụkpụrụ sitere na kọlụm ochie / ọhụrụ, ị kwesịrị icheta na ị nwere ụkpụrụ oyiri ugbu a (yikarịrị na ha ka na-akwaga). Dịka ọmụmaatụ, ọ bụrụ na ịchọrọ ịgụta ọnụọgụ ndị ọrụ nke aha ikpeazụ ha (ihe ọ bụla a na-akpọ kọlụm) malitere site na mkpụrụedemede. A, mgbe ahụ ruo mgbe agwụla mbugharị data (oldnew kọlụm) ị nwere ike ịnwe data na-ekwekọghị ekwekọ ma ọ bụrụ na ị jụọ kọlụm ọhụrụ.

Ntughari ngwa

Ugbu a anyị nwere ụdị ngwa 2.0.0 na nchekwa data n'ime v2.

Nzọụkwụ:

  1. tụgharịa ngwa gị na ụdị 1.0.0.
  2. mbipute 1.0.0 anaghị eji kọlụm dị na nchekwa data surname, yabụ na nlọghachi azụ kwesịrị ịga nke ọma

DB mgbanwe

Ebe nchekwa data nwere kọlụm aha ya bụ last_name.

Ederede isi mmalite Flyway:

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');

Tinye edemede surname.

Ntị. Cheta na ị nweghị ike ịtinye mmachi ọ bụla na-enweghị nkwụsị na kọlụm ị na-agbakwunye. Ọ bụrụ na ị tụgharịa JAR ahụ, ụdị ochie agaghị enwe echiche gbasara kọlụm agbakwunyere ma ọ ga-edobe ya ozugbo na NULL. Ọ bụrụ na enwere oke dị otú ahụ, ngwa ochie ga-agbaji.

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

Mgbanwe koodu

Anyị na-echekwa data dị ka last_name, na na surname. N'otu oge ahụ anyị na-agụ si last_name, ebe ọ bụ na kọlụm a kachasị mkpa. N'oge usoro mbugharị, enwere ike hazie arịrịọ ụfọdụ site na ngwa emelitebeghị.

/*
 * 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
                + "]";
    }
}

Kwụpụ 3: Wepụ aha ikpeazụ na koodu

Ngwa ngwa: 3.0.0

Ụdị DB:v3

comment

Rịba ama per .: N'ụzọ doro anya, na edemede mbụ onye edemede ahụ mehiere depụtaghachi ederede nke ngọngọ a site na nzọụkwụ 2. N'okwu a, ekwesịrị ime mgbanwe na koodu ngwa iji wepụ ọrụ na-eji kọlụm. last_name.

Site n'ịgbakwunye kọlụm ọhụrụ na iṅomi ọdịnaya ya, anyị mepụtara mgbanwe nchekwa data dakọtara azụ. Ọzọkwa, ọ bụrụ na anyị tụgharịa JAR ma ọ bụ nwee JAR ochie na-agba ọsọ, ọ gaghị agbaji n'oge a na-egbu ya.

Ntughari ngwa

Ugbu a anyị nwere ụdị ngwa 3.0.0 na nchekwa data v3. Ụdị 3.0.0 anaghị echekwa data na last_name. Nke a pụtara na n'ime surname A na-echekwa ozi kachasị ọhụrụ.

Nzọụkwụ:

  1. tụgharịa ngwa gị na ụdị 2.0.0.
  2. mbipute 2.0.0 eji na last_name и surname.
  3. mbipute 2.0.0 ga-ewere surname, ma ọ bụrụ na ọ bụghị efu, ma ọ bụghị -last_name

Mgbanwe database

Enweghị mgbanwe nhazi na nchekwa data. A na-eme ihe ederede na-esonụ iji mee njem ikpeazụ nke data ochie:

-- 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;

Mgbanwe koodu

Rịba ama per .: E depụtakwara nkọwa nke ngọngọ a n'ụzọ ezighi ezi site na onye edemede site na nzọụkwụ 2. N'ikwekọ na mgbagha nke isiokwu ahụ, mgbanwe na koodu na nzọụkwụ a kwesịrị iji wepụ ya ihe ndị na-arụ ọrụ na kọlụm. last_name.

Anyị na-echekwa data dị ka last_name, na na surname. Ọzọkwa, anyị na-agụ site na kọlụm last_name, ebe ọ bụ na ọ kacha mkpa. N'oge usoro mbugharị, enwere ike ịhazi ụfọdụ arịrịọ site na ihe atụ na-emebebeghị.

/*
 * 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
                + "]";
    }
}

Kwụpụ 4: Wepụ aha ikpeazụ na nchekwa data

Ngwa ngwa: 4.0.0

Ụdị DB: v4

comment

N'ihi na eziokwu na version koodu 3.0.0 ejighi kọlụm last_name, Ọ dịghị ihe ọjọọ ga-eme n'oge igbu ma ọ bụrụ na anyị na-atụgharị azụ 3.0.0 mgbe ewepụchara kọlụm na nchekwa data.

Ndekọ igbu egbu Script

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 mgbanwe

Dịtụ v3 naanị anyị na-ewepụ kọlụm last_name ma gbakwunye ihe mgbochi na-efu.

-- 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;

Mgbanwe koodu

Enweghị mgbanwe na koodu.

nkwubi

Anyị tinye n'ọrụ mgbanwe aha kọlụm na-adaghị azụ nke ọma site n'ime ọtụtụ mbugharị dakọtara na azụ. N'okpuru bụ nchịkọta nke omume emere:

  1. ntinye ụdị ngwa 1.0.0 с v1 atụmatụ nchekwa data (aha kọlụm = last_name)
  2. ntinye ụdị ngwa 2.0.0, nke na-echekwa data na last_name и surname. Ngwa na-agụ si last_name. Ebe nchekwa data dị na ụdị v2nwere ogidi dị ka last_name, na surname. surname bụ nnomi nke last_name. (IHE: Kọlụm a agaghị enwe ihe mgbochi enweghị isi)
  3. ntinye ụdị ngwa 3.0.0, nke na-echekwa naanị data na surname ma na-agụ site na nna nna. Banyere nchekwa data, mbugharị ikpeazụ na-ewere ọnọdụ last_name в surname. Ọzọkwa mmachi BULLGHULL OBI wepụrụ si last_name. Ebe nchekwa data dị ugbu a na ụdị v3
  4. ntinye ụdị ngwa 4.0.0 - ọ dịghị mgbanwe na-eme na koodu. Nbunye ọdụ data v4, nke na-ewepụ last_name. Ebe ị nwere ike itinye ihe mgbochi ọ bụla na-efu na nchekwa data.

Site n'ịgbaso usoro a, ị nwere ike ịtụgharịghachi otu ụdị mgbe niile na-emebighị nchekwa data / ndakọrịta ngwa.

Usoro

Koodu niile ejiri n'ime akụkọ a dị na Github. N'okpuru bụ nkọwa ndị ọzọ.

Mmemme

Mgbe cloning repository, ị ga-ahụ na-esonụ nchekwa Ọdịdị.

├── 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)

Ederede

Ị nwere ike ịmegharị edemede ndị akọwara na edemede dị n'okpuru ebe a, nke ga-egosipụta mgbanwe na-adaba azụ azụ na enweghị nkwekọrịta na nchekwa data.

Iji hụ ikpe nwere mgbanwe dakọtara azụ, gbaa:

./scripts/scenario_backward_compatible.sh

Na ịhụ ikpe nwere mgbanwe na-ekwekọghị azụ azụ, gbaa:

./scripts/scenario_backward_incompatible.sh

Mmiri Boot Sample Flyway

Ewere ihe atụ niile sitere na Spring Boot Sample Flyway.

Ị nwere ike ilele anya http://localhost:8080/flyway, e nwere ndepụta nke scripts.

Ọmụmaatụ a tinyekwara ihe njikwa H2 (na http://localhost:8080/h2-console) yabụ ị nwere ike ịlele ọkwa nchekwa data (njikwa jdbc URL bụ jdbc:h2:mem:testdb).

Ọzọkwa

Gụọkwa akụkọ ndị ọzọ na blọọgụ anyị:

isi: www.habr.com

Tinye a comment