ప్రొడక్షన్‌ను దెబ్బతీయని మైగ్రేషన్లు

ఒక మైగ్రేషన్ మీ మెషీన్‌లో అద్భుతంగా పనిచేస్తుంది. అది చిన్నదిగా అనిపించి, మీరు శుక్రవారం సాయంత్రం 6 గంటలకు దానిని డిప్లాయ్ చేస్తారు. అప్పుడు డిప్లాయ్‌మెంట్ ఫ్రీజ్ అయిపోతుంది. లేదా అంతకంటే దారుణంగా, 8 మిలియన్ల రోస్ (rows) ఉన్న ఒక టేబుల్ 40 సెకన్ల పాటు లాక్ అయిపోయి మీ సైట్ క్రాష్ అవుతుంది.

ప్రొడక్షన్‌లో మైగ్రేషన్లు భిన్నంగా ప్రవర్తిస్తాయి. లోకల్ డేటాబేస్‌లు ఖాళీగా మరియు వేగంగా ఉంటాయి. ప్రొడక్షన్ డేటాబేస్‌లలో నిజమైన డేటా మరియు యాక్టివ్ యూజర్లు ఉంటారు.

ప్రొడక్షన్ విపత్తులను నివారించడానికి ఈ నియమాలను పాటించండి.

  • ఎల్లప్పుడూ పనిచేసే down మెథడ్‌ను వ్రాయండి ప్రతి మైగ్రేషన్‌కు ఒక up మరియు ఒక down ఫంక్షన్ అవసరం. down ఫంక్షన్ up ఫంక్షన్‌ను ఖచ్చితంగా రివర్స్ చేయాలి. మీరు రోల్‌బ్యాక్ (rollback) చేయలేకపోతే, మీ మైగ్రేషన్ చాలా సంక్లిష్టంగా ఉన్నట్లు అర్థం. పుష్ చేసే ముందు మీ మెషీన్‌లో migrate తర్వాత migrate:rollback ఉపయోగించి దానిని పరీక్షించండి.

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

  • nullable లేదా default విలువలను ఉపయోగించండి ఇప్పటికే డేటా ఉన్న టేబుల్‌కు NOT NULL కాలమ్‌ను జోడించడం వల్ల ఎర్రర్స్ వస్తాయి. పాత రోస్‌లో ఏమి ఉంచాలో డేటాబేస్‌కు తెలియదు.

దానికి బదులుగా ఈ పద్ధతులను ఉపయోగించండి: • కొత్త కాలమ్‌ను nullable గా చేయండి. • ఒక default విలువను సెట్ చేయండి. • ఒకవేళ కాలమ్ తప్పనిసరిగా ఉండాలి అనుకుంటే, మూడు దశల్లో చేయండి: దానిని nullable గా సృష్టించండి, డేటాను నింపండి, ఆపై దానిని NOT NULL గా మార్చండి.

  • డేటా నష్టం శాశ్వతం dropColumn కమాండ్ డేటాను శాశ్వతంగా తొలగిస్తుంది. రోల్‌బ్యాక్ ఒక కాలమ్‌ను తిరిగి సృష్టించగలదు, కానీ దానిలోని డేటా పోతుంది. ఒక కాలమ్‌ను తొలగించే ముందు, మీ బ్యాకప్‌లను సరిచూసుకోండి. సురక్షితమైన మార్గం ఏమిటంటే, మొదట మీ కోడ్‌లో ఆ కాలమ్‌ను ఉపయోగించడం ఆపివేయడం, కొన్ని వారాలు వేచి ఉండటం మరియు ఆపై డేటాబేస్ నుండి దానిని తొలగించడం.

  • స్కీమా మార్పులను డేటా అప్‌డేట్‌ల నుండి వేరు చేయండి మైగ్రేషన్ లోపల User::all() రన్ చేయడం వల్ల మిలియన్ల కొద్దీ రోస్ మెమరీలోకి లోడ్ అయ్యి మీ డిప్లాయ్‌మెంట్ క్రాష్ అయ్యే అవకాశం ఉంది. మైగ్రేషన్ సమయంలో మీరు డేటాను అప్‌డేట్ చేయాల్సి వస్తే, రికార్డులను చిన్న బ్యాచ్‌లుగా ప్రాసెస్ చేయడానికి chunkById ఉపయోగించండి.

  • పైప్‌లైన్‌లలో force ఫ్లాగ్‌ను ఉపయోగించండి Laravel కన్ఫర్మేషన్ అడిగితే ఆటోమేటెడ్ డిప్లాయ్‌మెంట్ పైప్‌లైన్‌లు ఆగిపోతాయి. మీ డిప్లాయ్‌మెంట్ స్క్రిప్ట్‌లలో ఈ కమాండ్‌ను ఉపయోగించండి: php artisan migrate --force

  • టేబుల్ లాక్‌ల పట్ల జాగ్రత్తగా ఉండండి ఒక భారీ టేబుల్‌లో కాలమ్‌ను మార్చడం లేదా ఇండెక్స్‌ను జోడించడం వల్ల ఆ టేబుల్ లాక్ అవుతుంది. దీనివల్ల డౌన్‌టైమ్ (downtime) ఏర్పడుతుంది. చాలా పెద్ద టేబుల్‌ల కోసం, ఆన్‌లైన్ స్కీమా చేంజ్ టూల్స్ (online schema change tools) గురించి తెలుసుకోండి లేదా ట్రాఫిక్ తక్కువగా ఉన్న సమయంలో మార్పులు చేయండి.

పుష్ చేసే ముందు చెక్‌లిస్ట్: • down మెథడ్ పనిచేస్తుందా? • నేను లోకల్‌గా రోల్‌బ్యాక్‌ను పరీక్షించానా? • నేను పాత దానిని ఎడిట్ చేయకుండా కొత్త మైగ్రేషన్‌ను సృష్టిస్తున్నానా? • కొత్త కాలమ్ nullable గా ఉందా లేదా దానికి default విలువ ఉందా? • కాలమ్స్‌ను తొలగించే ముందు నా దగ్గర బ్యాకప్ ఉందా?

Source: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o