प्रोडक्शनमध्ये अडथळा न आणणारे मायग्रेशन्स

तुमच्या मशीनवर मायग्रेशन अगदी व्यवस्थित चालते. ते लहान वाटते म्हणून तुम्ही शुक्रवारी संध्याकाळी ६ वाजता ते डिप्लॉय करता. मग डिप्लॉयमेंट फ्रीझ होते. किंवा त्याहून वाईट म्हणजे, ८० लाख (8 million) रो (rows) असलेल्या टेबलमुळे ४० सेकंद लॉक होते आणि तुमची साइट क्रॅश होते.

प्रोडक्शनमध्ये मायग्रेशन्सचे वर्तन वेगळे असते. लोकल डेटाबेस रिकामे आणि वेगवान असतात. प्रोडक्शन डेटाबेसमध्ये खरा डेटा आणि सक्रिय युजर्स असतात.

प्रोडक्शनमधील आपत्ती टाळण्यासाठी या नियमांचे पालन करा.

  • नेहमी काम करणारी 'down' मेथड लिहा प्रत्येक मायग्रेशनसाठी 'up' आणि 'down' फंक्शन असणे आवश्यक आहे. 'down' फंक्शनने 'up' फंक्शनच्या कृती अगदी उलट केल्या पाहिजेत. जर तुम्ही रोलबॅक (rollback) लिहू शकत नसाल, तर तुमचे मायग्रेशन खूप गुंतागुंतीचे आहे. पुश करण्यापूर्वी तुमच्या मशीनवर migrate आणि त्यानंतर migrate:rollback वापरून त्याची चाचणी घ्या.

  • कधीही जुने मायग्रेशन्स एडिट करू नका तुम्हाला जुन्या मायग्रेशन फाईलमध्ये कॉलमचा आकार (column size) सुधारायचा असेल, तर असे करू नका. लॅराव्हेल (Laravel) सर्व्हरवर ती फाईल पुन्हा रन करणार नाही. त्याऐवजी, स्ट्रक्चर बदलण्यासाठी नवीन मायग्रेशन तयार करा. मायग्रेशन म्हणजे बदलांचा इतिहास आहे. तुम्ही जुने भाग पुन्हा लिहिण्याऐवजी नवीन प्रकरणांची भर घालता.

  • 'nullable' किंवा 'default' व्हॅल्यूज वापरा अस्तित्वात असलेल्या डेटा असलेल्या टेबलमध्ये NOT NULL कॉलम जोडल्यास एरर येऊ शकतात. जुन्या रो (rows) मध्ये काय भरायचे हे डेटाबेसला माहित नसते.

त्याऐवजी या पद्धती वापरा: • नवीन कॉलम 'nullable' करा. • डिफॉल्ट व्हॅल्यू (default value) सेट करा. • जर कॉलम अनिवार्य (required) असणे आवश्यक असेल, तर ते तीन टप्प्यांत करा: तो 'nullable' म्हणून तयार करा, डेटा भरा आणि नंतर त्याला NOT NULL मध्ये बदला.

  • डेटा लॉस कायमस्वरूपी असतो dropColumn कमांड डेटा कायमचा डिलीट करते. रोलबॅक कॉलम पुन्हा तयार करू शकतो, पण त्यातील डेटा निघून गेलेला असतो. कॉलम ड्रॉप करण्यापूर्वी तुमच्या बॅकअपची खात्री करा. अधिक सुरक्षित मार्ग म्हणजे प्रथम तुमच्या कोडमध्ये त्या कॉलमचा वापर थांबवणे, काही आठवडे थांबणे आणि नंतर तो डेटाबेसमधून काढून टाकणे.

  • स्कीमा बदल (schema changes) आणि डेटा अपडेट्स वेगळे ठेवा मायग्रेशनमध्ये User::all() रन केल्यामुळे लाखो रो मेमरीमध्ये लोड होऊ शकतात आणि तुमचे डिप्लॉयमेंट क्रॅश होऊ शकते. जर तुम्हाला मायग्रेशन दरम्यान डेटा अपडेट करणे आवश्यक असेल, तर रेकॉर्ड्स छोट्या बॅचेसमध्ये प्रोसेस करण्यासाठी chunkById वापरा.

  • पाइपलाईन्समध्ये 'force' फ्लॅग वापरा जर लॅराव्हेलने कन्फर्मेशन मागितले, तर ऑटोमेटेड डिप्लॉयमेंट पाइपलाईन्स हँग होतील. तुमच्या डिप्लॉयमेंट स्क्रिप्टमध्ये ही कमांड वापरा: php artisan migrate --force

  • टेबल लॉकची काळजी घ्या मोठ्या टेबलवर कॉलम बदलल्यामुळे किंवा इंडेक्स (index) जोडल्यामुळे ते टेबल लॉक होते. यामुळे डाउनटाइम (downtime) निर्माण होतो. खूप मोठ्या टेबल्ससाठी, 'online schema change' टूल्सचा वापर करा किंवा कमी ट्रॅफिकच्या वेळी बदल करा.

पुश करण्यापूर्वी चेकलिस्ट: • 'down' मेथड काम करते का? • मी लोकलवर रोलबॅक टेस्ट केला आहे का? • मी जुने मायग्रेशन एडिट करण्याऐवजी नवीन मायग्रेशन तयार करत आहे का? • नवीन कॉलम 'nullable' आहे की त्याला 'default' व्हॅल्यू आहे? • कॉलम ड्रॉप करण्यापूर्वी माझ्याकडे बॅकअप आहे का?

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