প্রোডাকশন নষ্ট করবে না এমন মাইগ্রেশন
একটি মাইগ্রেশন আপনার মেশিনে নিখুঁতভাবে কাজ করে। আপনি শুক্রবার সন্ধ্যা ৬টায় এটি ডেপ্লয় করেন কারণ এটি ছোট মনে হয়। তারপর ডেপ্লয়মেন্ট আটকে যায়। অথবা আরও খারাপ, ৮ মিলিয়ন রো (row) বিশিষ্ট একটি টেবিল ৪০ সেকেন্ডের জন্য লক হয়ে যায় এবং আপনার সাইট ক্র্যাশ করে।
প্রোডাকশনে মাইগ্রেশন ভিন্নভাবে আচরণ করে। লোকাল ডেটাবেস খালি এবং দ্রুত। প্রোডাকশন ডেটাবেসে আসল ডেটা এবং সক্রিয় ব্যবহারকারী থাকে।
প্রোডাকশনে বিপর্যয় এড়াতে এই নিয়মগুলো অনুসরণ করুন।
সব সময় একটি কার্যকর down method লিখুন প্রতিটি মাইগ্রেশনের একটি up এবং একটি down ফাংশন প্রয়োজন। down ফাংশনটিকে অবশ্যই up ফাংশনটিকে হুবহু বিপরীত করতে হবে। আপনি যদি রোলব্যাক (rollback) লিখতে না পারেন, তবে আপনার মাইগ্রেশনটি অত্যন্ত জটিল। পুশ করার আগে আপনার মেশিনে
migrateএবং তারপরmigrate:rollbackদিয়ে এটি পরীক্ষা করে নিন।পুরনো মাইগ্রেশন কখনো এডিট করবেন না আপনি হয়তো একটি পুরনো মাইগ্রেশন ফাইলে কলামের সাইজ ঠিক করতে চান। এটি করবেন না। Laravel সার্ভারে সেই ফাইলটি আর পুনরায় চালাবে না। পরিবর্তে, স্ট্রাকচার পরিবর্তন করার জন্য একটি নতুন মাইগ্রেশন তৈরি করুন। মাইগ্রেশন হলো পরিবর্তনের ইতিহাস। আপনি পুরনো অধ্যায়গুলো নতুন করে লেখার পরিবর্তে নতুন অধ্যায় যোগ করেন।
nullable অথবা default ভ্যালু ব্যবহার করুন বিদ্যমান ডেটা থাকা টেবিলে একটি NOT NULL কলাম যোগ করলে ত্রুটি (error) দেখা দেয়। ডেটাবেস জানে না পুরনো রো-গুলোতে কী বসাতে হবে।
পরিবর্তে এই পদ্ধতিগুলো ব্যবহার করুন: • নতুন কলামটিকে nullable করুন। • একটি default ভ্যালু সেট করুন। • যদি কলামটি অবশ্যই প্রয়োজন হয়, তবে এটি তিনটি ধাপে করুন: এটিকে nullable হিসেবে তৈরি করুন, ডেটা পূরণ করুন, তারপর এটিকে NOT NULL-এ পরিবর্তন করুন।
ডেটা হারানো স্থায়ী
dropColumnকমান্ড ডেটা চিরতরে মুছে ফেলে। একটি রোলব্যাক কলামটি পুনরায় তৈরি করতে পারে, কিন্তু এর ভেতরের ডেটা হারিয়ে যায়। কোনো কলাম ড্রপ করার আগে আপনার ব্যাকআপ যাচাই করে নিন। একটি নিরাপদ উপায় হলো প্রথমে আপনার কোডে কলামটি ব্যবহার করা বন্ধ করা, কয়েক সপ্তাহ অপেক্ষা করা এবং তারপর ডেটাবেস থেকে এটি সরিয়ে ফেলা।স্কিমা পরিবর্তনকে ডেটা আপডেট থেকে আলাদা রাখুন মাইগ্রেশনের ভেতরে
User::all()চালানো মেমোরিতে লক্ষ লক্ষ রো লোড করতে পারে এবং আপনার ডেপ্লয়মেন্ট ক্র্যাশ করাতে পারে। যদি আপনাকে মাইগ্রেশনের সময় ডেটা আপডেট করতে হয়, তবে ছোট ছোট ব্যাচে রেকর্ড প্রসেস করার জন্যchunkByIdব্যবহার করুন।পাইপলাইনে force ফ্ল্যাগ ব্যবহার করুন Laravel যদি কনফার্মেশন চায় তবে স্বয়ংক্রিয় ডেপ্লয়মেন্ট পাইপলাইন আটকে যাবে। আপনার ডেপ্লয়মেন্ট স্ক্রিপ্টে এই কমান্ডটি ব্যবহার করুন:
php artisan migrate --forceটেবিল লক সম্পর্কে সতর্ক থাকুন একটি বিশাল টেবিলে কলাম পরিবর্তন করা বা ইনডেক্স যোগ করা সেই টেবিলটিকে লক করে দেয়। এটি ডাউনটাইম (downtime) তৈরি করে। খুব বড় টেবিলের জন্য, অনলাইন স্কিমা চেঞ্জ টুলস ব্যবহার করুন অথবা ট্রাফিক কম থাকে এমন সময়ে পরিবর্তনগুলো চালান।
পুশ করার আগে চেকলিস্ট: • down method কি কাজ করে? • আমি কি লোকালি রোলব্যাক পরীক্ষা করেছি? • আমি কি পুরনো মাইগ্রেশন এডিট করার পরিবর্তে নতুন মাইগ্রেশন তৈরি করছি? • নতুন কলামটি কি nullable নাকি এতে কোনো default ভ্যালু আছে? • কলাম ড্রপ করার আগে কি আমার কাছে ব্যাকআপ আছে?
উৎস: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o
