ایسی مائیگریشنز جو پروڈکشن کو خراب نہیں کریں گی
ایک مائیگریشن آپ کی مشین پر بالکل ٹھیک چلتی ہے۔ آپ اسے جمعہ کے دن شام 6 بجے ڈیپلائے کر دیتے ہیں کیونکہ یہ چھوٹی سی معلوم ہوتی ہے۔ پھر ڈیپلائمنٹ رک جاتی ہے۔ یا اس سے بھی برا، 8 ملین rows والا ایک ٹیبل 40 سیکنڈ کے لیے لاک ہو جاتا ہے اور آپ کی سائٹ کریش ہو جاتی ہے۔
پروڈکشن میں مائیگریشنز کا رویہ مختلف ہوتا ہے۔ لوکل ڈیٹا بیس خالی اور تیز ہوتے ہیں۔ پروڈکشن ڈیٹا بیس میں حقیقی ڈیٹا اور فعال صارفین ہوتے ہیں۔
پروڈکشن کی تباہ کاریوں سے بچنے کے لیے ان اصولوں پر عمل کریں۔
ہمیشہ ایک کام کرنے والا
downمیتھڈ لکھیں ہر مائیگریشن کے لیے ایکupاور ایکdownفنکشن کی ضرورت ہوتی ہے۔downفنکشن کو بالکلupفنکشن کے برعکس ہونا چاہیے۔ اگر آپ رول بیک (rollback) نہیں لکھ سکتے، تو آپ کی مائیگریشن بہت پیچیدہ ہے۔ پش کرنے سے پہلے اپنی مشین پرmigrateکے بعدmigrate:rollbackچلا کر اسے ٹیسٹ کریں۔پرانی مائیگریشنز کو کبھی ایڈٹ نہ کریں آپ کسی پرانی مائیگریشن فائل میں کالم کا سائز ٹھیک کرنا چاہ سکتے ہیں۔ ایسا نہ کریں۔ لاراول (Laravel) سرور پر اس فائل کو دوبارہ نہیں چلائے گا۔ اس کے بجائے، ڈھانچے (structure) کو تبدیل کرنے کے لیے ایک نئی مائیگریشن بنائیں۔ مائیگریشن تبدیلیوں کی ایک تاریخ ہے۔ آپ پرانے ابواب کو دوبارہ لکھنے کے بجائے نئے ابواب شامل کرتے ہیں۔
nullableیا ڈیفالٹ ویلیوز کا استعمال کریں موجودہ ڈیٹا والے ٹیبل میںNOT NULLکالم شامل کرنے سے غلطیاں (errors) آتی ہیں۔ ڈیٹا بیس کو معلوم نہیں ہوتا کہ پرانی rows میں کیا رکھا جائے۔
اس کے بجائے ان طریقوں کا استعمال کریں:
• نئے کالم کو nullable بنائیں۔
• ایک ڈیفالٹ ویلیو سیٹ کریں۔
• اگر کالم کا ہونا لازمی ہے، تو اسے تین مراحل میں کریں: اسے nullable کے طور پر بنائیں، ڈیٹا بھریں، پھر اسے NOT NULL میں تبدیل کریں۔
ڈیٹا کا نقصان مستقل ہوتا ہے
dropColumnکمانڈ ڈیٹا کو ہمیشہ کے لیے حذف کر دیتی ہے۔ ایک رول بیک کالم کو دوبارہ بنا سکتا ہے، لیکن اس کے اندر کا ڈیٹا ختم ہو چکا ہوتا ہے۔ کالم کو حذف کرنے سے پہلے اپنے بیک اپ کی تصدیق کر لیں۔ ایک محفوظ طریقہ یہ ہے کہ پہلے اپنے کوڈ میں کالم کا استعمال بند کر دیں، چند ہفتے انتظار کریں، اور پھر اسے ڈیٹا بیس سے ہٹا دیں۔اسکیما (schema) کی تبدیلیوں کو ڈیٹا اپ ڈیٹس سے الگ رکھیں مائیگریشن کے اندر
User::all()چلانے سے لاکھوں rows میموری میں لوڈ ہو سکتے ہیں اور آپ کی ڈیپلائمنٹ کریش ہو سکتی ہے۔ اگر آپ کو مائیگریشن کے دوران ڈیٹا اپ ڈیٹ کرنا ہی ہے، تو ریکارڈز کو چھوٹے بیچز (batches) میں پروسیس کرنے کے لیےchunkByIdکا استعمال کریں۔پائپ لائنز میں
forceفلیگ کا استعمال کریں اگر لاراول تصدیق (confirmation) مانگے گا تو خودکار ڈیپلائمنٹ پائپ لائنز رک جائیں گی۔ اپنے ڈیپلائمنٹ اسکرپٹس میں یہ کمانڈ استعمال کریں:php artisan migrate --forceٹیبل لاکس (table locks) سے ہوشیار رہیں ایک بہت بڑے ٹیبل پر کالم تبدیل کرنے یا انڈیکس (index) شامل کرنے سے وہ ٹیبل لاک ہو جاتا ہے۔ اس سے ڈاؤن ٹائم (downtime) پیدا ہوتا ہے۔ بہت بڑے ٹیبلز کے لیے، آن لائن اسکیما چینج ٹولز (online schema change tools) کا استعمال کریں یا کم ٹریفک والے اوقات میں تبدیلیاں کریں۔
پش کرنے سے پہلے چیک لسٹ:
• کیا down میتھڈ کام کرتا ہے؟
• کیا میں نے لوکل پر رول بیک ٹیسٹ کیا ہے؟
• کیا میں پرانی مائیگریشن کو ایڈٹ کرنے کے بجائے نئی مائیگریشن بنا رہا ہوں؟
• کیا نیا کالم nullable ہے یا اس کی کوئی ڈیفالٹ ویلیو ہے؟
• کیا کالمز کو حذف کرنے سے پہلے میرے پاس بیک اپ ہے؟
ماخذ: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o
