MySQL یک سیستم مدیریت پایگاه داده رابطه‌ای منبع باز گسترده (RDMS) است که متعلق به شرکت اوراکل می‌باشد. این سیستم برای برنامه‌های کاربردی مبتنی بر وب سالها یک انتخاب پیش فرض بوده و همچنان در مقایسه با سایر موتورهای پایگاه داده محبوب باقی مانده‌است.
MySQL برای برنامه‌های وب طراحی، بهینه‌سازی شده و بخش وسیعی از برنامه‌های اصلی مبتنی بر وب مانند فیس بوک، توییتر، ویکی پدیا، یوتیوب و ... را تشکیل می‌دهد.
در این مقاله بطور مفصل، ما در مورد نحوه عیب یابی مشکلات و خطاهای رایج در سرور پایگاه داده MySQL توضیح خواهیم داد؛ اگر شما هم از این پایگاه داده محبوب و پرقدرت استفاده می‌کنید، این مقاله برای شماست!

 

1. خطایCan’t Connect to Local MySQL Server  (عدم توانایی اتصال به سرور محلی MySQL)

یکی از خطاهای متداول اتصال کلاینت به سرور در MySQL عبارت است از:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) "


این خطا نشان می‌دهد که هیچ سرور MySQL (mysqld) در سرور در حال اجرا نیست و یا اینکه هنگام اتصال به سرور، پورت TCP/IP اشتباهی را مشخص کرده‌اید.
با بررسی فرایندی به نام mysqld روی سرور پایگاه داده خود، با استفاده از دستور ps و دستور grep در کنار هم، همانطور که در زیر نشان داده شده‌است، مطمئن شوید که سرور در حال اجرا است.

ps xa | grep mysqld | grep -v mysqld

اگر دستورات فوق هیچ خروجی را نشان ندهند، سرور پایگاه داده در حال اجرا نیست؛ بنابراین کلاینت نمی‌تواند به آن وصل شود. برای راه‌اندازی سرور، دستور systemctl را بصورت زیر اجرا کنید:

در صورتی که از توزیع‌هایی مثل Debian و یا Ubuntu استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl start mysql

در صورتی که از توزیع‌هایی مثل RHEL،  CentOS و یا Fedora استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl start mysqld

 

برای تأیید وضعیت سرویس MySQL، از دستور زیر استفاده کنید:
در صورتی که از توزیع‌هایی مثل Debian و یا Ubuntu استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl status mysql

در صورتی که از توزیع‌هایی مثل RHEL،  CentOS و یا Fedora استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl status mysqld


از روی خروجی دستور فوق می‌توان فهمید که سرویس MySQL اجرا نشده‌است. در چنین حالتی، می‌توانید دوباره آن را راه اندازی کنید و وضعیت آن را یک بار دیگر بررسی نمایید.

برای راه‌اندازی مجدد سرویس mysql از دستور زیر استفاده کنید:

sudo systemctl restart mysql

 برای مشاهده وضعیت سرویس mysql از دستور زیر استفاده کنید:

sudo systemctl status mysql


اگر سرور با استفاده از دستور زیر به اجرا در بیاید، اما باز هم خطای فوق نمایش داده شود، این بار باید بررسی کنید که آیا پورت TCP/IP توسط یک فایروال یا هر سرویس مسدود کننده پورت مسدود شده‌است یا خیر.

ps xa | grep mysqld | grep -v mysqld

برای اینکه بفهمید چه پورتی از سرور در حال شنود است، از دستور netstat به صورت زیر استفاده کنید.

sudo netstat -tlpn | grep "mysql"

همچنین برای اطلاعات بیشتر در مورد نحوه بررسی پورت‌های سرور، مقاله زیر برای شماست:

نحوه بررسی پورت های در حال شنود در لینوکس (پورت های مشغول)

 

2. خطای Can’t Connect to MySQL Server (عدم توانایی اتصال به سرورMySQL)

یک خطای اتصال رایج دیگر“(2003) Can’t connect to MySQL server on ‘server’ (10061)”  است، به این معنی که اتصال شبکه انجام نشده‌است.
برای حل این مشکل ابتدا همانطور که در مرحله قبل نشان داده شد، بررسی کنید که آیا سرور MySQL روی سیستم روی سیستم در حال اجرا است. همچنین مطمئن شوید که سرور اتصالات شبکه را فعال کرده‌است و اینکه پورت شبکه‌ای که شما برای اتصال استفاده می‌کنید، همان پورتی است که روی سرور تنظیم شده‌است.
سایر خطاهای رایجی که احتمالا شما هنگام اتصال به سرور MySQL با آنها روبرو می‌شوید عبارت است از:

" ERROR 2003: Can't connect to MySQL server on 'host_name' (111) "

" ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111) "

این خطاها نشان می‌دهد که ممکن است سرور در حال اجرا باشد، اما شما سعی دارید به پورت TCP/IP، اشتباهی متصل شوید.

 

3. خطاهای Access Denied (رد شدن دسترسی) در MySQL

در MySQL، یک حساب کاربری از نظر نام کاربری و هاست کلاینت یا هاست‌هایی تعریف می‌شود که کاربر در آن می‌تواند به سرور وصل شود. علاوه بر این، یک حساب ممکن است دارای اعتبار احراز هویت مانند یک رمز عبور نیز باشد.
اگرچه دلایل مختلف بسیاری باعث خطاهای “Access denied” می‌شود، ولیکن یکی از دلایل عمده مربوط به حساب‌های کاربری MySQL است که سرور اجازه می‌دهد برنامه‌های کلاینت هنگام اتصال از آن استفاده کند. این نشان می‌دهد که نام کاربری مشخص شده در اتصال، مجوز دسترسی به پایگاه داده را ندارد.
MySQL امکان ایجاد حساب‌هایی را فراهم می‌کند که کاربران را قادر می‌سازد به سرور وصل شده و به داده‌های مدیریت شده توسط سرور دسترسی پیدا کنند. در این مورد، اگر با یک خطای رد کردن دسترسی روبرو شدید، بررسی کنید که آیا حساب کاربری از طریق برنامه‌ی که از آن استفاده می‌کند و احتمالاً هاستی که اتصال از آن آمده مجاز است به سرور وصل شود.
می‌توانید با اجرای دستور SHOW GRANTS بصورت زیر، مشاهده کنید یک حساب کاربری چه مجوزهایی دارد.

SHOW GRANTS FOR 'jeyserver'@'localhost';

شما می‌توانید با استفاده از دستورات زیر در پوسته MySQL، به یک کاربر خاص روی یک پایگاه داده خاص برای آدرس IP ریموت مجوز اعطا کنید.

grant all privileges on *.test_db to 'tecmint'@'192.168.0.100';
flush privileges;

علاوه‌براین، خطاهای رد شدن دسترسی می‌تواند ناشی از مشکلات اتصال به MySQL نیز باشد، به خطاهای قبلی توضیح داده شده مراجعه کنید.

 

4. خطای Lost Connection to MySQL Server (قطع شدن اتصال به سرور MySQL)

خطای قطع شدن اتصال به سرور MySQL ممکن است به دلیل اتصال ضعیف شبکه، اتمام زمان اتصال یا مشکل بزرگتر بودن مقادیر BLOB از  max_allowed_packet باشد. در موارد بروز مشکلات مربوط به اتصال شبکه، ابتدا مطمئن شوید که یک اتصال شبکه خوب دارید، به خصوص زمانی که در حال دسترسی به یک سرور پایگاه داده ریموت هستید.
اگر دلیل خطا، مشکل اتمام زمان اتصال باشد، به خصوص وقتی MySQL در تلاش است از یک اتصال اولیه به سرور استفاده کند، مقدار پارامتر   connect_timeout را افزایش دهید. اما در مورد مقادیر BLOB که از max_allowed_packet بزرگتر هستند، باید مقدار بیشتری را برای max_allowed_packet در فایل تنظیمات  /etc/my.cnf  در قسمت [mysqld] یا [client] تنظیم کنید:

[mysqld]
connect_timeout=100
max_allowed_packet=500M

اگر فایل تنظیمات MySQL برای شما قابل دسترسی نباشد، می‌توانید با استفاده از دستور زیر در پوسته MySQL، این مقدار را تنظیم کنید.

SET GLOBAL connect_timeout=100;
SET GLOBAL max_allowed_packet=524288000;

 

5. خطای Too Many MySQL Connections (بیش از حد بودن اتصالات MySQL)

اگر کلاینت MySQL با خطای "too many connections" روبرو شود، بدین معنی است که کلیه اتصالات در دسترس، توسط سایر کلاینت‌ها مورد استفاده قرار گرفته‌اند. تعداد اتصالات (پیش فرض 151 است) توسط متغیر سیستم max_connections کنترل می‌شود. شما می‌توانید با افزایش مقدار آن، مشکل را حل کنید؛ تا اجازه اتصالات بیشتری در فایل تنظیمات   /etc/my.cnf  خود داشته باشید.

[mysqld]
max_connections=1000

 

6. خطای Out of Memory MySQL (کمبود حافظه MySQL)

در صورتی که با استفاده از برنامه کلاینت MySQL یک پرس و جو را اجرا کردید و در درخواست با خطا روبرو شدید، این بدان معنی است که MySQL، حافظه کافی برای ذخیره کل نتیجه پرس و جو ندارد.
اولین قدم اطمینان از صحت پرس و جو است، در صورت صحت آن، سپس موارد زیر را انجام دهید:

    • اگر مستقیماً از کلاینت MySQL استفاده می‌کنید، آن را با --quick switch راه‌اندازی کنید تا ذخیره کردن نتایج را غیرفعال کنید یا
    • اگر از درایور MyODBC استفاده می‌کنید، رابط کاربری تنظیمات (UI) یک بخش پیشرفته برای پرچم‌ها (flags) دارد. عبارت “Do not cache result” را تیک بزنید
یک ابزار عالی دیگر، MySQL Tuner (یک اسکریپت مفید که به یک سرور MySQL در حال اجرا متصل می‌شود و پیشنهاداتی را برای نحوه پیکربندی آن، برای عملکرد بالاتر ارائه می‌دهد) است.

برای نصب MySQL Tuner در صورتی که از توزیع‌هایی مثل Debian و یا Ubuntu استفاده می‌کنید، دستور زیر را وارد کنید:

sudo apt-get install mysqltuner

در صورتی که از توزیع‌هایی مثل RHEL،  CentOS و یا Fedora استفاده می‌کنید، دستور زیر را وارد کنید:

sudo yum install mysqltuner

بعد از نصب mysqltuner با استفاده از دستور زیر آن را اجرا کنید:

mysqltuner

 

7. خطای MySQL Keeps Crashing (خرابی MySQL)

اگر با این مشکل روبرو شدید، باید سعی کنید متوجه شوید که آیا مشکل این است که سرور MySQL خراب شده‌است، یا اینکه کاربر آن دارای یک مشکل است. توجه داشته باشید که بسیاری از خرابی‌های سرورها به‌دلیل خرابی فایل‌های داده یا فایل‌های فهرست بندی ایجاد می‌شوند.
با استفاده از دستور زیر می‌توانید وضعیت سرور را بررسی کنید؛ تا مشخص شود چه مدت از زمان کار و اجرای آن گذشته است.

در صورتی که از توزیع‌هایی مثل Debian و یا Ubuntu استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl status mysql

در صورتی که از توزیع‌هایی مثل RHEL،  CentOS و یا Fedora استفاده می‌کنید، دستور زیر را وارد کنید:

sudo systemctl status mysqld

روش دیگر، اجرای دستور mysqladmin به‌صورت زیر برای یافتن زمان کار سرور MySQL می‌باشد.

sudo mysqladmin version -p


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

sudo mysqladmin -i 5 status

و یا

sudo mysqladmin -i 5 -r status

 

تعیین آنچه باعث ایجاد یک مشکل یا خطا می شود!

اگرچه ما به برخی از مشکلات و خطاهای رایج MySQL پرداختیم و همچنین راه‌هایی برای عیب یابی و حل آنها ارائه دادیم، اما مهمترین چیز برای تشخیص یک خطا، درک علت آن است (از این نظر که چه چیز باعث ایجاد آن می شود).
اما چگونه می توانید این را تعیین کنید؟ نکات زیر به شما یاد می دهد که چگونه می توان دقیقا فهمید که چه چیز باعث ایجاد یک مشکل می شود:

    • اولین و مهمترین مرحله، بررسی گزارش‌های مربوط به MySQL است که در دایرکتوری  /var/log/mysql/  ذخیره شده‌اند. برای خواندن فایل‌های گزارش log می توانید از ابزارهای خط فرمان مانند tail استفاده کنید. (در صورتی که نمی‌دانید دستور tail چیست یا چگونه می‌توان با آن کار کرد، این مقاله برای شماست: دستور Tail در لینوکس )

    • اگر سرویس MySQL نتوانست راه‌اندازی شود، وضعیت آن را با استفاده از دستور  systemctl  بررسی کنید یا از دستور  Journaletctl  (با پرچم –xe)در بخش systemd برای بررسی مشکل استفاده کنید.

    • همچنین می توانید برای یافتن دلیل مشکلات خود، فایل گزارش سیستم  /var/log/message  یا موارد مشابه را بررسی کنید.

    • سعی کنید از ابزارهایی مانند Mytop، glances، top، ps  یا htop استفاده نمایید تا بررسی کنید که کدام برنامه تمام CPU را می گیرد یا دستگاه را قفل می کند یا اینکه بررسی کنید که آیا از حافظه، فضای دیسک، شاخص‌های دسترسی فایل (file descriptor) یا منابع مهم دیگر بیش از حد استفاده نکرده باشید.

    • با فرض اینکه مشکل یک فرایند فرار است، شما همیشه می توانید آن فرایند را غیرفعال نمایید (با استفاده از ابزار pkill یا kill) تا MySQL به صورت عادی کار کند.
    • با فرض اینکه سرور mysqld باعث ایجاد مشکلات می شود، می توانید دستور mysqladmin -u root ping یا mysqladmin -u root processlist را برای دریافت هر گونه پاسخ از آن اجرا نمایید.

    • اگر در برنامه کلاینت شما، در حین تلاش برای اتصال به سرور MySQL مشکلی وجود دارد، با دقت بررسی کنید که چرا برنامه به خوبی کار نمی کند، سعی کنید به‌منظور عیب یابی، از هرگونه خروجی‌های آن استفاده کنید.

 

اقتباس از:

Useful Tips to Troubleshoot Common Errors in MySQL