ایسی مائیگریشنز جو پروڈکشن کو خراب نہیں کریں گی

ایک مائیگریشن آپ کی مشین پر بالکل ٹھیک چلتی ہے۔ آپ اسے جمعہ کے دن شام 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