وقایع نگاری یک دیباگ: وقتی MySQL چیزی ذخیره نمی‌کند!

مشکل از آن‌جا شروع شد که نوید خبر داد که چند ساعتی است یک وبلاگ وردپرسی که برای یکی از پروژه‌هاست ، عکس‌العمل‌های عجیب و غریب نشان می‌دهد! چطور؟ این که باکس متن بعضی از مطالب نشان داده نمی‌شوند. اولین حدسم این بود که شاید بخاطر تغییرات اخیری که در آدرس وبلاگ داده بودم همچین مشکلی پیش آمده و خواستم که تنظیمات را به حالت قبل برگردانند… و مشکل یپچیده‌تر شد! چطور؟ تنظیمات جدید ذخیره نمی‌شد.

نوید چند تایی روش پیشنهاد کرد تا شاید بتوانیم اطلاعات بیشتر در رابطه با وضعیت به دست بیاوریم. به سرور لاگین می‌کنم و… tab completion کار نمی‌کند. یک همچین اخطاری می‌دهد:

bash: cannot create temp file for here-document: No space left on device

خوب راست هم می‌گوید انگار… یک df -h معلوم می‌کند که پوشهٔ home کاربر حاضر‌، تا خرخره پر شده. یک فایل log که از دیباگ قبلی باقیمانده، وزنش به ۵ گیگ رسیده و دیگر نمی‌تواند نفس بکشد.

rm -rfv PATH_TO_FAT_FILE

و دوباره df -h… و؟ فضا خالی نشده. فایل پاک نشده؟ ls -lh PATH_TO_FAT_FILE می‌گوید که همچین فایلی نداریم. ها از قرار آن پروسهٔ لاگ همچنان فعال است (این‌طوری سیستم فایل فضایش را بعد از پاک کردن فایل مذکور به روز نمی‌کند). پروسه چه بوده حالا؟ Only GOD knows :)

ps -aux | grep PATH_TO_FAT_FILE

امیدوار بودم که با شل پایپ کرده باشند که نه انگار… می‌دانم کار کیست ولی او هم به خاطر نمی‌آورد که دستور چه بوده. هوم… لینوکس دیگر اینقدر‌ها هم بی‌شعور نیست. راه حل خودش چیست؟ lsof

lsof PATH_TO_FAT_FILE

حل شد؟ نه! همچین پروسه‌ای نداریم. یک کم پرزورتر می‌پرسیم:

sudo !!

ها ها، پیدا شد! یک kill -9 مهمانش کردیم و حالا باید مشکل حل شده باش. ولی…

bash: cannot create temp file for here-document: No space left on device

هوم… باز هم؟ می‌گوید temp، حالا اگر فرض بگیریم مثل آدم این‌جور فایل‌ها را در ‎/tmp ذخیره می‌کند، ۱.۵ گیگابایت فضای خالی داریم. پس این اخطار برای چیست؟ قضیه آن‌جا عجیب می‌شود که یک عالمه (عدد جدید است. یک کم بیشتر از خیلی زیاد :)) فایل یک کیلوبایتی داخل ‎/tmp ذخیره شده. محتوایش؟ چیز خاصی نیست. ولی چه ربطی می‌تواند به مشکل داشته باشد؟ کمی جستجو و df -i:

...
tmpfs                             494K    494K   0    100% /tmp
...

که چه؟ inode پر است؟ چی هست اصلا؟ به نقل از ویکی‌پدیا:

آی‌نود (به انگلیسی: inode) به ساختمان داده‌هایی گفته می‌شود که در سیستم‌فایل‌های شبیه به یونیکس مانند UFS استفاده می‌شود. یک inode اطلاعات پایه‌ای در مورد فایل‌ها، دایرکتوری‌ها و اشیاء دیگر موجود در فایل‌سیستم را در خود نگهداری می‌کند.

و خوب طبیعی است. اگر این فضا پر شده که دستور قبل همچین چیزی نشان می‌دهد، امکان ساختن فایل جدید وجود ندارد. یک find خوشگل سر هم می‌کنیم که همهٔ فایل‌های با اسم عجیب غریب یکسانشان را باطل کند. (در پست بعدی جریان این فایل‌ها را شرح می‌دهنم):

find -regextype posix-egrep -type f -regex '.*[^/]{40}' -delete

خیلی ساده یعنی هر فایلی که طول اسمش دقیقا ۴۰ کاراکتر است را پاک کن. و تست دوباره‌، auto completion به کار افتاده. خوب اصلا برای چه لاگین کرده بودیم؟ مشکل دیتابیس MySQL و وردپرس بود. یک بار دیگر صفحه را باز کنیم تا ببینیم دقیقا چه اتفاقی می‌افتد… و… عه؟ مشکل حل شده! بریم ببینیم تنظیمات جدید را ذخیره می‌کند؟ ها‌، آره آن هم حل شده. ضرب‌المثل ربط … به … این‌جا خیلی قشنگ صدق می‌کند :)

به هر حال چند تا درس گنده یاد گرفتم، همچین باگ‌هایی ارزش یک کلاس درس واقعی را دارند‌، این‌طور نیست؟

python ./share.py help
If you enjoyed it you can use following links to share this article:
  1. twitter
  2. google_plus
  3. facebook
ls ./tags

دیدگاه‌‌‌ها

Comments powered by Disqus