జీరో డౌన్‌టైమ్ డిప్లాయ్‌మెంట్ మరియు డేటాబేస్‌లు

జీరో డౌన్‌టైమ్ డిప్లాయ్‌మెంట్ మరియు డేటాబేస్‌లు

విస్తరణలో డేటాబేస్ అనుకూలత సమస్యలను ఎలా పరిష్కరించాలో ఈ కథనం వివరంగా వివరిస్తుంది. మీరు ప్రిలిమినరీ ప్రిపరేషన్ లేకుండా అమలు చేయడానికి ప్రయత్నిస్తే మీ ప్రొడక్షన్ అప్లికేషన్‌లకు ఏమి జరుగుతుందో మేము మీకు తెలియజేస్తాము. మేము సున్నా పనికిరాని సమయాన్ని కలిగి ఉండాల్సిన అప్లికేషన్ జీవితచక్ర దశల ద్వారా వెళ్తాము (సుమారు లేన్: మరింత - సున్నా పనికిరాని సమయం) మా కార్యకలాపాల ఫలితం బ్యాక్‌వర్డ్స్-అనుకూల డేటాబేస్ మార్పును వెనుకకు అనుకూల పద్ధతిలో వర్తింపజేయడం.

మీరు వ్యాసం నుండి కోడ్ ఉదాహరణలను అర్థం చేసుకోవాలనుకుంటే, మీరు వాటిని ఇక్కడ కనుగొనవచ్చు గ్యాలరీలు.

పరిచయం

జీరో డౌన్‌టైమ్ విస్తరణ

ఎంత మార్మికమైనది సున్నా డౌన్‌టైమ్ విస్తరణ? మీరు అప్లికేషన్ యొక్క కొత్త వెర్షన్‌ను ఉత్పత్తికి విజయవంతంగా పరిచయం చేసే విధంగా మీ అప్లికేషన్ అమలు చేయబడినప్పుడు ఇది అని మీరు చెప్పవచ్చు, అయితే వినియోగదారు దాని లభ్యతను గమనించలేరు. వినియోగదారు మరియు కంపెనీ దృక్కోణం నుండి, ఇది ఉత్తమమైన విస్తరణ దృశ్యం ఎందుకంటే ఇది కొత్త ఫీచర్‌లను పరిచయం చేయడానికి మరియు బగ్‌లను అంతరాయం లేకుండా పరిష్కరించడానికి అనుమతిస్తుంది.

దీన్ని ఎలా సాధించాలి? అనేక మార్గాలు ఉన్నాయి, వాటిలో ఒకటి ఇక్కడ ఉంది:

  • మీ సేవ యొక్క సంస్కరణ సంఖ్య. 1ని అమలు చేయండి
  • డేటాబేస్ మైగ్రేషన్ చేయండి
  • సంస్కరణ #2కి సమాంతరంగా మీ సేవ యొక్క #1వ సంస్కరణను అమలు చేయండి
  • వెర్షన్ నంబర్ 2 ఎలా పని చేస్తుందో మీరు చూసిన వెంటనే, వెర్షన్ నంబర్ 1ని తీసివేయండి
  • సిద్ధంగా!

సులభం, కాదా? దురదృష్టవశాత్తు, ఇది అంత సులభం కాదు మరియు మేము దానిని తరువాత వివరంగా పరిశీలిస్తాము. ఇప్పుడు మరొక సాధారణ విస్తరణ ప్రక్రియను తనిఖీ చేద్దాం - నీలం ఆకుపచ్చ విస్తరణ.

మీరు ఎప్పుడైనా విన్నారా నీలం ఆకుపచ్చ విస్తరణ? క్లౌడ్ ఫౌండ్రీ దీన్ని చాలా సులభం చేస్తుంది. జస్ట్ చూడండి ఈ వ్యాసం, ఇక్కడ మేము దీన్ని మరింత వివరంగా వివరిస్తాము. క్లుప్తంగా సంగ్రహించేందుకు, బ్లూ గ్రీన్ డిప్లాయ్‌మెంట్ ఎలా చేయాలో మీకు గుర్తు చేద్దాం:

  • మీ ఉత్పత్తి కోడ్ యొక్క రెండు కాపీలు ("నీలం" మరియు "ఆకుపచ్చ") పని చేస్తాయని నిర్ధారించుకోండి;
  • అన్ని ట్రాఫిక్‌లను నీలి పర్యావరణానికి మళ్లించండి, అనగా. తద్వారా ఉత్పత్తి URLలు అక్కడ సూచించబడతాయి;
  • ఆకుపచ్చ వాతావరణంలో అన్ని అప్లికేషన్ మార్పులను అమలు చేయండి మరియు పరీక్షించండి;
  • urlలను నీలం నుండి ఆకుపచ్చ వాతావరణానికి మార్చండి

బ్లూ గ్రీన్ డిప్లాయ్‌మెంట్ అనేది ప్రొడక్షన్ బ్రేకింగ్ గురించి చింతించకుండా కొత్త ఫీచర్‌లను సులభంగా పరిచయం చేయడానికి మిమ్మల్ని అనుమతించే విధానం. ఏదైనా జరిగినప్పటికీ, మీరు కేవలం "స్విచ్‌ను ఫ్లిక్ చేయడం" ద్వారా మునుపటి వాతావరణానికి సులభంగా తిరిగి వెళ్లవచ్చు.

పైన పేర్కొన్నవన్నీ చదివిన తర్వాత, మీరు ప్రశ్న అడగవచ్చు: సున్నా పనికిరాని సమయానికి బ్లూ గ్రీన్ డిప్లాయ్‌మెంట్‌తో సంబంధం ఏమిటి?

అదే వాతావరణం యొక్క రెండు కాపీలను నిర్వహించడానికి వాటిని నిర్వహించడానికి రెట్టింపు ప్రయత్నం అవసరం కాబట్టి, అవి చాలా ఉమ్మడిగా ఉన్నాయి. అందుకే కొన్ని బృందాలు పేర్కొంటున్నాయి మార్టిన్ ఫౌలర్, ఈ విధానం యొక్క వైవిధ్యాన్ని అనుసరించండి:

వెబ్ మరియు డొమైన్ లేయర్‌ల కోసం బ్లూ-గ్రీన్ స్విచ్‌లను సృష్టించడం, అదే డేటాబేస్‌ను ఉపయోగించడం మరొక ఎంపిక. ఈ విధానంలో, డేటాబేస్ తరచుగా సమస్య కావచ్చు, ప్రత్యేకించి మీరు సాఫ్ట్‌వేర్ యొక్క క్రొత్త సంస్కరణకు మద్దతు ఇవ్వడానికి దాని స్కీమాను మార్చవలసి వచ్చినప్పుడు.

మరియు ఇక్కడ మేము ఈ వ్యాసంలోని ప్రధాన సమస్యకు వచ్చాము. డేటాబేస్. ఈ పదబంధాన్ని మరొకసారి చూద్దాం.

డేటాబేస్ మైగ్రేషన్ చేయండి.

ఇప్పుడు మీరు మీరే ప్రశ్న వేసుకోవాలి - డేటాబేస్ మార్పు వెనుకకు అనుకూలంగా లేకుంటే ఏమి చేయాలి? యాప్ యొక్క నా మొదటి వెర్షన్ విచ్ఛిన్నం కాలేదా? నిజానికి జరగబోయేది ఇదే...

కాబట్టి, జీరో డౌన్‌టైమ్ / బ్లూ గ్రీన్ డిప్లాయ్‌మెంట్ యొక్క భారీ ప్రయోజనాలు ఉన్నప్పటికీ, కంపెనీలు తమ అప్లికేషన్‌లను అమలు చేయడానికి క్రింది సురక్షితమైన ప్రక్రియను అనుసరిస్తాయి:

  • అప్లికేషన్ యొక్క కొత్త వెర్షన్‌తో ప్యాకేజీని సిద్ధం చేయండి
  • నడుస్తున్న అప్లికేషన్‌ను మూసివేయండి
  • డేటాబేస్‌ను తరలించడానికి స్క్రిప్ట్‌లను అమలు చేయండి
  • అప్లికేషన్ యొక్క క్రొత్త సంస్కరణను అమలు చేయండి మరియు ప్రారంభించండి

ఈ కథనంలో, జీరో డౌన్‌టైమ్ డిప్లాయ్‌మెంట్ ప్రయోజనాన్ని పొందడానికి మీరు మీ డేటాబేస్ మరియు కోడ్‌తో ఎలా పని చేయవచ్చో మేము వివరంగా తెలియజేస్తాము.

డేటాబేస్ సమస్యలు

మీరు డేటాబేస్‌లో ఎటువంటి డేటాను నిల్వ చేయని స్థితిలేని అప్లికేషన్‌ను కలిగి ఉంటే, మీరు వెంటనే సున్నా డౌన్‌టైమ్ విస్తరణను పొందవచ్చు. దురదృష్టవశాత్తు, చాలా సాఫ్ట్‌వేర్‌లు డేటాను ఎక్కడో నిల్వ చేయాలి. అందుకే సర్క్యూట్‌లో ఏవైనా మార్పులు చేసే ముందు మీరు ఒకటికి రెండుసార్లు ఆలోచించాలి. మేము స్కీమాను ఎలా మార్చాలి అనే వివరాలను పొందే ముందు, ఎటువంటి డౌన్‌టైమ్ విస్తరణ సాధ్యమవుతుంది, మొదట సంస్కరణ స్కీమాపై దృష్టి పెడతాము.

సంస్కరణ పథకం

ఈ వ్యాసంలో మేము ఉపయోగిస్తాము ఫ్లైవే సంస్కరణ నియంత్రణ సాధనంగా (సుమారు per.: మేము డేటాబేస్ వలసల గురించి మాట్లాడుతున్నాము) సహజంగానే, మేము అంతర్నిర్మిత ఫ్లైవే మద్దతును కలిగి ఉన్న స్ప్రింగ్ బూట్ అప్లికేషన్‌ను కూడా వ్రాస్తాము మరియు అప్లికేషన్ సందర్భాన్ని సెటప్ చేసేటప్పుడు స్కీమా మైగ్రేషన్ చేస్తాము. ఫ్లైవేని ఉపయోగిస్తున్నప్పుడు, మీరు మైగ్రేషన్ స్క్రిప్ట్‌లను మీ ప్రాజెక్ట్‌ల ఫోల్డర్‌లో నిల్వ చేయవచ్చు (డిఫాల్ట్‌గా ఇన్ classpath:db/migration) ఇక్కడ మీరు అటువంటి మైగ్రేషన్ ఫైల్‌ల ఉదాహరణను చూడవచ్చు

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

ఈ ఉదాహరణలో మనం 4 మైగ్రేషన్ స్క్రిప్ట్‌లను చూస్తాము, గతంలో అమలు చేయకపోతే, అప్లికేషన్ ప్రారంభమైనప్పుడు ఒకదాని తర్వాత ఒకటి అమలు చేయబడుతుంది. ఫైల్‌లలో ఒకదానిని చూద్దాం (V1__init.sql) ఉదాహరణకు.

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

ప్రతిదీ ఖచ్చితంగా స్వీయ-వివరణాత్మకమైనది: మీ డేటాబేస్ ఎలా సవరించబడాలో నిర్వచించడానికి మీరు SQLని ఉపయోగించవచ్చు. స్ప్రింగ్ బూట్ మరియు ఫ్లైవే గురించి మరింత సమాచారం కోసం, తనిఖీ చేయండి స్ప్రింగ్ బూట్ డాక్స్.

స్ప్రింగ్ బూట్‌తో సోర్స్ కంట్రోల్ టూల్‌ని ఉపయోగించడం ద్వారా, మీరు 2 పెద్ద ప్రయోజనాలను పొందుతారు:

  • మీరు కోడ్ మార్పుల నుండి డేటాబేస్ మార్పులను వేరు చేస్తారు
  • మీ అప్లికేషన్ యొక్క రోల్ అవుట్‌తో పాటు డేటాబేస్ మైగ్రేషన్ జరుగుతుంది, అనగా. మీ విస్తరణ ప్రక్రియ సరళీకృతం చేయబడింది

డేటాబేస్ సమస్యలను పరిష్కరించడం

వ్యాసం యొక్క తదుపరి విభాగంలో, మేము డేటాబేస్ మార్పులకు రెండు విధానాలను చూడటంపై దృష్టి పెడతాము.

  • వెనుకబడిన అననుకూలత
  • వెనుకబడిన అనుకూలత

మొదటిది మీరు ప్రాథమిక తయారీ లేకుండా సున్నా డౌన్‌టైమ్ విస్తరణను చేయకూడదనే హెచ్చరికగా పరిగణించబడుతుంది... రెండవది మీరు డౌన్‌టైమ్ లేకుండా విస్తరణను ఎలా నిర్వహించవచ్చు మరియు అదే సమయంలో వెనుకబడిన అనుకూలతను ఎలా నిర్వహించవచ్చు అనే దానిపై ఒక పరిష్కారాన్ని అందిస్తుంది.

మేము పని చేస్తున్న మా ప్రాజెక్ట్ ఒక సాధారణ స్ప్రింగ్ బూట్ ఫ్లైవే అప్లికేషన్ Person с first_name и last_name డేటాబేస్లో (సుమారు అనువాదం: Person ఒక టేబుల్ మరియు first_name и last_name - ఇవీ అందులోని క్షేత్రాలు) మేము పేరు మార్చాలనుకుంటున్నాము last_name в surname.

ఊహలు

మేము వివరాలను పొందే ముందు, మా అప్లికేషన్‌ల గురించి మనం చేయవలసిన కొన్ని అంచనాలు ఉన్నాయి. మేము సాధించాలనుకుంటున్న ప్రధాన ఫలితం చాలా సులభమైన ప్రక్రియ.

గమనిక. వ్యాపార PRO-చిట్కా. ప్రక్రియలను సరళీకృతం చేయడం ద్వారా మీకు మద్దతుపై చాలా డబ్బు ఆదా చేయవచ్చు (మీరు మీ కంపెనీ కోసం ఎక్కువ మంది వ్యక్తులు పని చేస్తుంటే, మీరు ఎక్కువ డబ్బు ఆదా చేయవచ్చు)!

డేటాబేస్‌ను రోల్‌బ్యాక్ చేయాల్సిన అవసరం లేదు

ఇది విస్తరణ ప్రక్రియను సులభతరం చేస్తుంది (కొన్ని డేటాబేస్ రోల్‌బ్యాక్‌లు దాదాపు అసాధ్యం, ఉదాహరణకు తొలగింపు రోల్‌బ్యాక్). మేము అప్లికేషన్‌లను మాత్రమే వెనక్కి తీసుకోవడానికి ఇష్టపడతాము. ఈ విధంగా, మీరు వేర్వేరు డేటాబేస్‌లను కలిగి ఉన్నప్పటికీ (ఉదాహరణకు, SQL మరియు NoSQL), మీ విస్తరణ పైప్‌లైన్ ఒకే విధంగా కనిపిస్తుంది.

అప్లికేషన్‌ను ఒక వెర్షన్‌ని వెనక్కి తిప్పికొట్టడం ఎల్లప్పుడూ సాధ్యమవుతుంది (ఇక లేదు)

రోల్‌బ్యాక్ అవసరమైనప్పుడు మాత్రమే చేయాలి. ప్రస్తుత సంస్కరణలో సులభంగా పరిష్కరించబడని బగ్ ఉన్నట్లయితే, మేము తాజా వర్కింగ్ వెర్షన్‌కు తిరిగి వెళ్లగలగాలి. ఈ తాజా వర్కింగ్ వెర్షన్ మునుపటిది అని మేము అనుకుంటాము. ఒకటి కంటే ఎక్కువ రోల్‌అవుట్‌ల కోసం కోడ్ మరియు డేటాబేస్ అనుకూలతను నిర్వహించడం చాలా కష్టం మరియు ఖరీదైనది.

గమనిక. ఎక్కువ చదవడానికి, ఈ కథనంలో మేము అప్లికేషన్ యొక్క ప్రధాన సంస్కరణను మారుస్తాము.

దశ 1: ప్రారంభ స్థితి

అనువర్తన సంస్కరణ: 1.0.0
DB వెర్షన్: v1

వ్యాఖ్యను

ఇది అప్లికేషన్ యొక్క ప్రారంభ స్థితి.

డేటాబేస్ మార్పులు

DB కలిగి ఉంది 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');

కోడ్ మార్పులు

అప్లికేషన్ వ్యక్తి డేటాను నిల్వ చేస్తుంది 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
                + "]";
    }
}

వెనుకకు అననుకూల నిలువు వరుస పేరు మార్చడం

కాలమ్ పేరును ఎలా మార్చాలో ఉదాహరణను చూద్దాం:

శ్రద్ధ. కింది ఉదాహరణ ఉద్దేశపూర్వకంగా విషయాలను విచ్ఛిన్నం చేస్తుంది. డేటాబేస్ అనుకూలత యొక్క సమస్యను ప్రదర్శించడానికి మేము దీన్ని చూపుతాము.

అనువర్తన సంస్కరణ: 2.0.0.BAD

DB వెర్షన్: v2bad

వ్యాఖ్యను

ప్రస్తుత మార్పులు ఒకే సమయంలో రెండు పర్యాయాలు (పాత మరియు కొత్తవి) అమలు చేయడానికి అనుమతించవు. అందువల్ల, సున్నా డౌన్‌టైమ్ విస్తరణను సాధించడం కష్టంగా ఉంటుంది (ఊహలను పరిగణనలోకి తీసుకుంటే, అది వాస్తవానికి అసాధ్యం).

A/B పరీక్ష

ప్రస్తుత పరిస్థితి ఏమిటంటే, మనకు అప్లికేషన్ వెర్షన్ ఉంది 1.0.0, ఉత్పత్తి మరియు డేటాబేస్లో అమలు చేయబడింది v1. మేము అప్లికేషన్ యొక్క రెండవ ఉదాహరణ, సంస్కరణను అమలు చేయాలి 2.0.0.BAD, మరియు డేటాబేస్ను నవీకరించండి v2bad.

దశలు:

  1. సంస్కరణ అప్లికేషన్ యొక్క కొత్త ఉదాహరణ అమలు చేయబడింది 2.0.0.BADఇది డేటాబేస్‌ను అప్‌డేట్ చేస్తుంది v2bad
  2. డేటాబేస్లో v2bad కాలమ్ last_name ఉనికిలో లేదు - ఇది మార్చబడింది surname
  3. డేటాబేస్ మరియు అప్లికేషన్ అప్‌డేట్ విజయవంతమైంది మరియు కొన్ని సందర్భాలు అమలులో ఉన్నాయి 1.0.0, ఇతరులు - లో 2.0.0.BAD. ప్రతిదీ డేటాబేస్కు కనెక్ట్ చేయబడింది v2bad
  4. సంస్కరణ యొక్క అన్ని సందర్భాలు 1.0.0 వారు కాలమ్‌లోకి డేటాను చొప్పించడానికి ప్రయత్నిస్తారు కాబట్టి లోపాలను విసరడం ప్రారంభిస్తుంది last_nameఎవరు ఇప్పుడు లేరు
  5. సంస్కరణ యొక్క అన్ని సందర్భాలు 2.0.0.BAD సమస్యలు లేకుండా పని చేస్తుంది

మీరు చూడగలిగినట్లుగా, మేము డేటాబేస్ మరియు అప్లికేషన్‌లో వెనుకకు అననుకూలమైన మార్పులు చేస్తే, A/B పరీక్ష అసాధ్యం.

అప్లికేషన్ రోల్‌బ్యాక్

A/B విస్తరణ చేయడానికి ప్రయత్నించిన తర్వాత అని అనుకుందాం (సుమారు ప్రతి.: రచయిత బహుశా ఇక్కడ A/B పరీక్షను ఉద్దేశించి ఉండవచ్చు) మేము అప్లికేషన్‌ను వెర్షన్‌కు తిరిగి వెళ్లాలని నిర్ణయించుకున్నాము 1.0.0. మేము డేటాబేస్‌ను రోల్‌బ్యాక్ చేయకూడదనుకుందాం.

దశలు:

  1. మేము వెర్షన్ అప్లికేషన్ ఉదాహరణను నిలిపివేస్తాము 2.0.0.BAD
  2. డేటాబేస్ ఇప్పటికీ ఉంది v2bad
  3. వెర్షన్ నుండి 1.0.0 అది ఏమిటో అర్థం కాలేదు surname, మేము లోపాలను చూస్తాము
  4. నరకం విరిగిపోయింది, మనం ఇక వెనక్కి వెళ్ళలేము

మీరు గమనిస్తే, మేము డేటాబేస్ మరియు అప్లికేషన్‌కు వెనుకకు అననుకూలమైన మార్పులను చేస్తే, మేము మునుపటి సంస్కరణకు తిరిగి వెళ్లలేము.

స్క్రిప్ట్ అమలు లాగ్‌లు

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

డేటాబేస్ మార్పులు

పేరు మార్చే మైగ్రేషన్ స్క్రిప్ట్ last_name в surname

మూలం ఫ్లైవే స్క్రిప్ట్:

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

పేరు మార్చే స్క్రిప్ట్ last_name.

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

కోడ్ మార్పులు

మేము ఫీల్డ్ పేరు మార్చాము lastNamesurname.

వెనుకకు అనుకూల మార్గంలో నిలువు వరుస పేరు మార్చడం

ఇది మనం ఎదుర్కొనే అత్యంత సాధారణ పరిస్థితి. మేము వెనుకకు అననుకూలమైన మార్పులు చేయాలి. జీరో-డౌన్‌టైమ్ డిప్లాయ్‌మెంట్ కోసం, మేము అదనపు దశలు లేకుండా డేటాబేస్ మైగ్రేషన్‌ను వర్తింపజేయకూడదని మేము ఇప్పటికే నిరూపించాము. కథనంలోని ఈ విభాగంలో, వెనుకబడిన అనుకూలతను కొనసాగిస్తూ ఆశించిన ఫలితాన్ని సాధించడానికి మేము డేటాబేస్ మైగ్రేషన్‌లతో పాటు అప్లికేషన్ యొక్క 3 విస్తరణలను నిర్వహిస్తాము.

గమనిక. మాకు వెర్షన్ డేటాబేస్ ఉందని గుర్తుంచుకోండి v1. ఇది నిలువు వరుసలను కలిగి ఉంటుంది first_name и last_name. మనం మారాలి last_namesurname. మా వద్ద యాప్ వెర్షన్ కూడా ఉంది 1.0.0, ఇది ఇంకా ఉపయోగించబడలేదు surname.

దశ 2: ఇంటిపేరును జోడించండి

అనువర్తన సంస్కరణ: 2.0.0
DB వెర్షన్: v2

వ్యాఖ్యను

కొత్త నిలువు వరుసను జోడించడం మరియు దాని కంటెంట్‌లను కాపీ చేయడం ద్వారా, మేము వెనుకకు అనుకూలమైన డేటాబేస్ మార్పులను సృష్టిస్తాము. అదే సమయంలో, మేము JARని రోల్‌బ్యాక్ చేసినా లేదా పాత JAR రన్నింగ్‌లో ఉంటే, అది అమలు సమయంలో విచ్ఛిన్నం కాదు.

మేము కొత్త సంస్కరణను విడుదల చేస్తున్నాము

దశలు:

  1. కొత్త కాలమ్‌ని సృష్టించడానికి డేటాబేస్ మైగ్రేషన్‌ను అమలు చేయండి surname. ఇప్పుడు మీ DB వెర్షన్ v2
  2. నుండి డేటాను కాపీ చేయండి last_name в surname. శ్రద్దమీరు ఈ డేటాను ఎక్కువగా కలిగి ఉంటే, మీరు బ్యాచ్ మైగ్రేషన్‌ను పరిగణించాలి!
  3. వారు ఉపయోగించే కోడ్‌ను వ్రాయండి రెండు и కొత్తమరియు పాతది కాలమ్. ఇప్పుడు మీ యాప్ వెర్షన్ 2.0.0
  4. కాలమ్ నుండి విలువను చదవండి surname, అది కాకపోతే null, లేదా l నుండిast_name, ఉంటే surname పేర్కొనలేదు. మీరు తొలగించవచ్చు getLastName() కోడ్ నుండి, అది అవుట్పుట్ అవుతుంది null నుండి మీ దరఖాస్తును వెనక్కి తీసుకునేటప్పుడు 3.0.0 కు 2.0.0.

మీరు స్ప్రింగ్ బూట్ ఫ్లైవేని ఉపయోగిస్తుంటే, వెర్షన్ స్టార్టప్ సమయంలో ఈ రెండు దశలు అమలు చేయబడతాయి 2.0.0 అప్లికేషన్లు. మీరు డేటాబేస్ సంస్కరణ సాధనాన్ని మాన్యువల్‌గా అమలు చేస్తే, దీన్ని చేయడానికి మీరు రెండు వేర్వేరు పనులను చేయాల్సి ఉంటుంది (మొదట db సంస్కరణను మాన్యువల్‌గా అప్‌డేట్ చేసి, ఆపై కొత్త అప్లికేషన్‌ను అమలు చేయండి).

ఇది ముఖ్యం. కొత్తగా సృష్టించబడిన నిలువు వరుస అని గుర్తుంచుకోండి చేయ్యాకూడని быть NULL కాదు. మీరు రోల్‌బ్యాక్ చేస్తే, పాత యాప్‌కి కొత్త కాలమ్ గురించి తెలియదు మరియు ఆ సమయంలో దాన్ని ఇన్‌స్టాల్ చేయదు Insert. కానీ మీరు ఈ పరిమితిని జోడించినట్లయితే మరియు మీ db ఉంటుంది v2, దీనికి కొత్త నిలువు వరుస విలువను సెట్ చేయడం అవసరం. ఇది పరిమితుల ఉల్లంఘనలకు దారి తీస్తుంది.

ఇది ముఖ్యం. మీరు పద్ధతిని తీసివేయాలి getLastName(), ఎందుకంటే సంస్కరణలో 3.0.0 కోడ్‌లో కాలమ్ అనే భావన లేదు last_name. అంటే అక్కడ శూన్యం సెట్ చేయబడుతుంది. మీరు పద్ధతిని విడిచిపెట్టి, చెక్కులను జోడించవచ్చు null, కానీ తర్కంలో ఉండేలా చూసుకోవడం చాలా మంచి పరిష్కారం getSurname() మీరు సరైన సున్నా కాని విలువను ఎంచుకున్నారు.

A/B పరీక్ష

ప్రస్తుత పరిస్థితి ఏమిటంటే, మనకు అప్లికేషన్ వెర్షన్ ఉంది 1.0.0, ఉత్పత్తి మరియు డేటాబేస్లో అమలు చేయబడింది v1. మేము వెర్షన్ అప్లికేషన్ యొక్క రెండవ ఉదాహరణను అమలు చేయాలి 2.0.0ఇది డేటాబేస్‌ను అప్‌డేట్ చేస్తుంది v2.

దశలు:

  1. సంస్కరణ అప్లికేషన్ యొక్క కొత్త ఉదాహరణ అమలు చేయబడింది 2.0.0ఇది డేటాబేస్‌ను అప్‌డేట్ చేస్తుంది v2
  2. ఈ సమయంలో కొన్ని అభ్యర్థనలు వెర్షన్ ఇన్‌స్టాన్స్‌ల ద్వారా ప్రాసెస్ చేయబడ్డాయి 1.0.0
  3. నవీకరణ విజయవంతమైంది మరియు మీరు వెర్షన్ అప్లికేషన్ యొక్క బహుళ రన్నింగ్ ఇన్‌స్టాన్స్‌లను కలిగి ఉన్నారు 1.0.0 మరియు ఇతర సంస్కరణలు 2.0.0. ప్రతి ఒక్కరూ డేటాబేస్‌తో కమ్యూనికేట్ చేస్తారు v2
  4. వెర్షన్ 1.0.0 డేటాబేస్లో ఇంటిపేరు కాలమ్ను ఉపయోగించదు, కానీ సంస్కరణ 2.0.0 ఉపయోగిస్తుంది. వారు ఒకదానితో ఒకటి జోక్యం చేసుకోరు మరియు లోపాలు ఉండకూడదు.
  5. వెర్షన్ 2.0.0 పాత మరియు కొత్త కాలమ్‌లో డేటాను నిల్వ చేస్తుంది, వెనుకబడిన అనుకూలతను నిర్ధారిస్తుంది

ఇది ముఖ్యం. పాత/కొత్త కాలమ్‌లోని విలువల ఆధారంగా అంశాలను లెక్కించే ఏవైనా ప్రశ్నలు మీకు ఉంటే, మీరు ఇప్పుడు నకిలీ విలువలను కలిగి ఉన్నారని గుర్తుంచుకోవాలి (చాలా మటుకు అవి ఇప్పటికీ వలసపోతున్నాయి). ఉదాహరణకు, మీరు అక్షరాలతో ప్రారంభమైన చివరి పేరు (కాలమ్ ఏదయినా) వినియోగదారుల సంఖ్యను లెక్కించాలనుకుంటే A, డేటా మైగ్రేషన్ పూర్తయ్యే వరకు (oldnew నిలువు వరుస) మీరు కొత్త నిలువు వరుసను ప్రశ్నిస్తే మీరు అస్థిరమైన డేటాను కలిగి ఉండవచ్చు.

అప్లికేషన్ రోల్‌బ్యాక్

ఇప్పుడు మనకు యాప్ వెర్షన్ ఉంది 2.0.0 మరియు డేటాబేస్ లో v2.

దశలు:

  1. మీ అప్లికేషన్‌ను వెర్షన్‌కి తిరిగి వెళ్లండి 1.0.0.
  2. వెర్షన్ 1.0.0 డేటాబేస్లో నిలువు వరుసను ఉపయోగించదు surname, కాబట్టి రోల్‌బ్యాక్ విజయవంతం కావాలి

DB మార్పులు

డేటాబేస్ పేరుతో ఒక నిలువు వరుసను కలిగి ఉంది 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');

స్క్రిప్ట్ జోడించండి surname.

శ్రద్ధ. మీరు జోడిస్తున్న కాలమ్‌కి మీరు ఏ విధమైన శూన్య పరిమితులను జోడించలేరని గుర్తుంచుకోండి. మీరు JARని రోల్‌బ్యాక్ చేస్తే, జోడించిన కాలమ్ గురించి పాత వెర్షన్‌కు తెలియదు మరియు దానిని స్వయంచాలకంగా NULLకి సెట్ చేస్తుంది. అటువంటి పరిమితి ఉంటే, పాత అప్లికేషన్ కేవలం విచ్ఛిన్నమవుతుంది.

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

కోడ్ మార్పులు

మేము డేటాను ఇన్‌లా నిల్వ చేస్తాము last_nameమరియు లోపల surname. అదే సమయంలో మేము నుండి చదువుతాము 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;
    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
                + "]";
    }
}

దశ 3: కోడ్ నుండి చివరి_పేరును తీసివేయడం

అనువర్తన సంస్కరణ: 3.0.0

DB వెర్షన్:v3

వ్యాఖ్యను

గమనిక per.: స్పష్టంగా, అసలు కథనంలో రచయిత ఈ బ్లాక్ యొక్క వచనాన్ని 2వ దశ నుండి పొరపాటుగా కాపీ చేసారు. ఈ దశలో, కాలమ్‌ని ఉపయోగించే కార్యాచరణను తొలగించే లక్ష్యంతో అప్లికేషన్ కోడ్‌లో మార్పులు చేయాలి last_name.

కొత్త నిలువు వరుసను జోడించడం మరియు దాని కంటెంట్‌లను కాపీ చేయడం ద్వారా, మేము వెనుకకు అనుకూల డేటాబేస్ మార్పులను సృష్టించాము. అలాగే, మేము JARని రోల్‌బ్యాక్ చేసినా లేదా పాత JAR రన్నింగ్‌లో ఉంటే, అది అమలు సమయంలో విచ్ఛిన్నం కాదు.

అప్లికేషన్ రోల్‌బ్యాక్

ప్రస్తుతం మా వద్ద యాప్ వెర్షన్ ఉంది 3.0.0 మరియు డేటాబేస్ v3. సంస్కరణ: Telugu 3.0.0 కు డేటాను సేవ్ చేయదు last_name. దీని అర్థం ఇన్ surname అత్యంత తాజా సమాచారం నిల్వ చేయబడుతుంది.

దశలు:

  1. మీ అప్లికేషన్‌ను వెర్షన్‌కి తిరిగి వెళ్లండి 2.0.0.
  2. వెర్షన్ 2.0.0 ఉపయోగాలు మరియు last_name и surname.
  3. వెర్షన్ 2.0.0 తీసుకుంటా surname, అది సున్నా కాకపోతే, లేకపోతే -last_name

డేటాబేస్ మార్పులు

డేటాబేస్‌లో నిర్మాణాత్మక మార్పులు లేవు. పాత డేటా యొక్క చివరి మైగ్రేషన్‌ని నిర్వహించడానికి క్రింది స్క్రిప్ట్ అమలు చేయబడుతుంది:

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

కోడ్ మార్పులు

గమనిక per.: ఈ బ్లాక్ యొక్క వివరణ కూడా 2వ దశ నుండి రచయిత పొరపాటుగా కాపీ చేయబడింది. కథనం యొక్క తర్కానికి అనుగుణంగా, ఈ దశలో కోడ్‌లో మార్పులు కాలమ్‌తో పని చేసే అంశాలను దాని నుండి తీసివేయడం లక్ష్యంగా ఉండాలి. last_name.

మేము డేటాను ఇలా నిల్వ చేస్తాము last_nameమరియు లోపల surname. అదనంగా, మేము కాలమ్ నుండి చదువుతాము 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 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
                + "]";
    }
}

దశ 4: డేటాబేస్ నుండి చివరి_పేరును తీసివేయడం

అనువర్తన సంస్కరణ: 4.0.0

DB వెర్షన్: v4

వ్యాఖ్యను

వెర్షన్ కోడ్ వాస్తవం కారణంగా 3.0.0 కాలమ్‌ని ఉపయోగించలేదు last_name, మేము తిరిగి వెళ్లినట్లయితే అమలు సమయంలో చెడు ఏమీ జరగదు 3.0.0 డేటాబేస్ నుండి నిలువు వరుసను తీసివేసిన తర్వాత.

స్క్రిప్ట్ అమలు లాగ్‌లు

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 మార్పులు

మామూలుకన్నా v3 మేము నిలువు వరుసను తీసివేస్తాము last_name మరియు తప్పిపోయిన పరిమితులను జోడించండి.

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

కోడ్ మార్పులు

కోడ్‌లో ఎలాంటి మార్పులు లేవు.

తీర్మానం

మేము అనేక బ్యాక్‌వర్డ్స్-అనుకూల విస్తరణలను చేయడం ద్వారా బ్యాక్‌వర్డ్స్-అనుకూలమైన నిలువు వరుస పేరు మార్పును విజయవంతంగా అమలు చేసాము. చేసిన చర్యల సారాంశం క్రింద ఉంది:

  1. అప్లికేషన్ వెర్షన్ యొక్క విస్తరణ 1.0.0 с v1 డేటాబేస్ స్కీమా (కాలమ్ పేరు = last_name)
  2. అప్లికేషన్ వెర్షన్ యొక్క విస్తరణ 2.0.0, దీనిలో డేటాను నిల్వ చేస్తుంది last_name и surname. అప్లికేషన్ నుండి చదువుతుంది last_name. డేటాబేస్ సంస్కరణలో ఉంది v2వంటి నిలువు వరుసలను కలిగి ఉంటుంది last_name, మరియు surname. surname l యొక్క కాపీast_name. (గమనిక: ఈ నిలువు వరుస శూన్యమైన నిర్బంధాన్ని కలిగి ఉండకూడదు)
  3. అప్లికేషన్ వెర్షన్ యొక్క విస్తరణ 3.0.0, ఇది డేటాను మాత్రమే నిల్వ చేస్తుంది surname మరియు ఇంటిపేరు నుండి చదువుతుంది. డేటాబేస్ విషయానికొస్తే, చివరి మైగ్రేషన్ జరుగుతోంది last_name в surname. పరిమితి కూడా NULL కాదు నుండి తీసివేయబడింది last_name. డేటాబేస్ ఇప్పుడు వెర్షన్‌లో ఉంది v3
  4. అప్లికేషన్ వెర్షన్ యొక్క విస్తరణ 4.0.0 - కోడ్‌లో ఎలాంటి మార్పులు చేయలేదు. డేటాబేస్ విస్తరణ v4, ఇది తొలగిస్తుంది last_name. ఇక్కడ మీరు డేటాబేస్కు ఏవైనా తప్పిపోయిన పరిమితులను జోడించవచ్చు.

ఈ విధానాన్ని అనుసరించడం ద్వారా, మీరు డేటాబేస్/అప్లికేషన్ అనుకూలతను విచ్ఛిన్నం చేయకుండా ఎల్లప్పుడూ ఒక సంస్కరణను వెనక్కి తీసుకోవచ్చు.

కోడ్

ఈ కథనంలో ఉపయోగించిన మొత్తం కోడ్ ఇక్కడ అందుబాటులో ఉంది Github. క్రింద అదనపు వివరణ ఉంది.

ప్రాజెక్టులు

రిపోజిటరీని క్లోనింగ్ చేసిన తర్వాత, మీరు క్రింది ఫోల్డర్ నిర్మాణాన్ని చూస్తారు.

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

స్క్రిప్ట్‌లు

మీరు దిగువ స్క్రిప్ట్‌లలో వివరించిన స్క్రిప్ట్‌లను అమలు చేయవచ్చు, ఇది డేటాబేస్‌కు వెనుకబడిన-అనుకూలమైన మరియు అననుకూల మార్పులను ప్రదర్శిస్తుంది.

చూడటానికి వెనుకకు అనుకూలమైన మార్పులతో కేసు, అమలు:

./scripts/scenario_backward_compatible.sh

మరియు చూడటానికి వెనుకకు అననుకూలమైన మార్పులతో కేసు, అమలు:

./scripts/scenario_backward_incompatible.sh

స్ప్రింగ్ బూట్ నమూనా ఫ్లైవే

అన్ని ఉదాహరణలు నుండి తీసుకోబడ్డాయి Spring Boot Sample Flyway.

మీరు పరిశీలించగలరు http://localhost:8080/flyway, స్క్రిప్ట్‌ల జాబితా ఉంది.

ఈ ఉదాహరణలో H2 కన్సోల్ కూడా ఉంది (వద్ద http://localhost:8080/h2-console) కాబట్టి మీరు డేటాబేస్ స్థితిని వీక్షించవచ్చు (డిఫాల్ట్ jdbc URL jdbc:h2:mem:testdb).

అదనంగా

మా బ్లాగ్‌లోని ఇతర కథనాలను కూడా చదవండి:

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి