اطلاعیه

بستن
هنوز اطلاعیه ای در دست نیست.

نکات مفید برای برطرف کردن خطاهای رایج در MySQL

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    نکات مفید برای برطرف کردن خطاهای رایج در MySQL

    MySQL یک سیستم مدیریت دیتابیس میباشد که به طور گسترده ای استفاده شده و متعلق به Oracle می باشد. سالهاست که نرم افزاهای تحت وب مای اسکیول را به صورت پیش فرض انتخاب کرده و هنوز در مقایسه با دیگر پایگاه های داده محبوبیت بیشتری دارد.


    همچنین توصیه می شود مطالعه کنید:

    نحوه نصب آخرین ورژن MySQL در Ubuntu 18.04


    مای اسکیول برای اپلیکیشن های تحت وب طراحی و بهینه سازی شده است، که بخشی جدایی ناپذیر از نرم افزارهای بزرگ تحت وب مانند فیس بوک، توییتر، ویکی پدیا، یوتیوب و بسیاری دیگر است.

    آیا سایت یا اپلیکیشن تحت وب شما توسط MySQL طراحی شده؟ در این مقاله مفصل، ما میخواهیم نحوه عیب یابی مشکلات و خطاهای رایج در دیتابیس MySQL را شرح دهیم. همچنین میخواهیم علت مشکلات و نحوه برطرف کردن آنها را به شما توضیح دهیم.



    1 - Can’t Connect to Local MySQL Server

    یکی از خطاهای متداول کلاینت برای ارتباط با دیتابیس مای اسکیول “ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)” میباشد.
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	cant-connect-to-local-mysql-db-server-1.png نمایش ها:	0 اندازه:	16.7 KB شناسه:	26639






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

    از طریق چک کردن پروسس mysqld اطمینان حاصل کنید که مای اسکیول سرور دیتابیس تان در حال سرویس دهی میباشد، برای این کار میتوانید به صورت همزمان از دستور ps و دستور grep همانند زیر استفاده کنید.
    کد HTML:
    $ ps xa | grep mysqld | grep -v mysqld
    در صورتی که دستور بالا خروجی نداشت، سرویس mysql در حال اجرا (running) نمیباشد. بنابراین کلاینت ها نمیتوانند به آن وصل شوند. برای start کردن سرویس mysql از دستور systemctl زیر استفاده کنید.
    کد HTML:
    $ sudo systemctl start mysql #Debian/Ubuntu
    $ sudo systemctl start mysqld #RHEL/CentOS/Fedora
    برای چک کردن وضعیت سرویس mysql از دستورات زیر استفاده کنید.
    کد HTML:
    $ sudo systemctl status mysql #Debian/Ubuntu
    $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	check-mysql-status-2.png نمایش ها:	0 اندازه:	122.5 KB شناسه:	26640






    در خروجی دستور بالا، سرویس مای اسکیول failed شده است. در چنین حالتی، شما میتوانید آن را restart کرده و یکبار دیگر وضعیت سرویس را بررسی کنید.
    کد HTML:
    $ sudo systemctl restart mysql
    $ sudo systemctl status mysql
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	restart-mysql-service-3.png نمایش ها:	0 اندازه:	84.5 KB شناسه:	26641






    علاوه براین، اگر سرویس مای اسکیول در حال اجرا باشد، همانند دستور زیر، اما شما هنوز خطای بالا را مشاهده میکنید، شما باید بررسی کنید که پورت TCP/IP توسط فایروال یا هر سرویس مشابه دیگری مسدود نشده باشد.
    کد HTML:
    $ ps xa | grep mysqld | grep -v mysqld
    برای پیدا کردن اینکه چه پورت هایی در سرور در حال listen کردن هستند میتوانید از دستور netstat همانند زیر استفاده کنید.
    کد HTML:
    $ sudo netstat -tlpn | grep "mysql"


    2 - Can’t Connect to MySQL Server

    خطای رایج دیگر، پیغام “(2003) Can’t connect to MySQL server on ‘server’ (10061)” میباشد، که معنی آن وجود مشکل در ارتباطات شبکه ای میباشد.

    در اینجا، همانند بالا شروع کنید به چک کردن سرویس مای اسکیول که در حالت running باشد. همچنین مطمئن شوید که ارتباطات شبکه ای سرور برقرار میباشد و اینکه پورتی که برای ارتباط استفاده میکنید، یکبار در سرور کانفیگ شده باشد.

    خطای رایج دیگر که احتما دارد شما به آن برخورد کنید زمانی هست که شما میخواهید به سرور مای اسکیول وصل شوید و پیغام زیر را دریافت میکنید.
    کد HTML:
    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، به نام pipe، یا یک سوکت فایل یونیکسی متفاوت از آنچه که بر روی سرور در حال listen کردن میباشد، متصل شوید.



    3 - Access Denied Errors in MySQL

    در MySQL، یک اکانت کاربر در قالب یک username و هاست یا هاست های کلاینت تعریف می شود، که کاربر میتواند از طریق آن به سرور متصل شود.

    اگر چه علت های متفاوتی از خطای “Access denied” وجود دارد،‌ اما یکی از رایج ترین علت ها مربوط به اکانت های MySQL است که سرور به برنامه های کلاینت اجازه استفاده از آن ها را به محض وصل شدن میدهد. این خطا نشان دهنده این است که username مشخص شده در اتصال، مجوز دسترسی به دیتابیس را ندارد.

    MySQL امکان ایجاد اکانت هایی که امکان اتصال کاربران کلاینت را به سرور را فعال میکنند، و دسترسی به دیتای مدیریت شده توسط سرور را محیا میکند. در چنین شرایطی اگر شما یک پیغام access denied دریافت کردید، بررسی کنید که آیا اکانت کاربر مجوز اتصال به سرور از طریق برنامه کلاینتی که استفاده میکنید را دارد یا خیر. همچنین هاستی که اتصال از طریق آن برقرار میشود را نیز بررسی کنید.

    با استفاده از اجرا کردن دستور SHOW GRANTS همانند زیر میتوانید مشاهده کنید که یک اکانت چه مجوزهایی دارد.
    کد HTML:
    > SHOW GRANTS FOR 'linux-zone'@'localhost';
    شما میتوانید به یک کاربر خاص روی دیتابیس خاص با استفاده از ip آدرس ریموت و با استفاده از دستور زیر در شل مای اسکیول، مجوز اعطا کنید.
    کد HTML:
    > grant all privileges on *.test_db to 'linux-zone'@'192.168.0.100';
    > flush privileges;
    علاوه بر موارد بالا خطای access denied میتواند در نتیجه مشکل در اتصال به MySQL باشد، همانطور که در خطاهای قبلی شرح داده شد.



    4 - Lost Connection to MySQL Server

    شما ممکن است خطای زیر را به دلیل یکی از علت های زیر دریافت کنید.
    • ارتباط ضعیف شبکه
    • timeout شدن ارتباط
    • یک مشکل با مقدار BLOB که از max_allowed_packet بزرگتر است.

    در مواقعی که مشکل در ارتباط شبکه ای دارید، باید مطمئن شوید که یک ارتباط شبکه ای خوب داشته باشید، خصوصا اگر میخواهید به یک سرور دیتابیس ریموت وصل شوید.

    اگر مشکل connection timeout داشتید، هنگامیکه MySQL سعی به استفاده از یک ارتباط اولیه به سرور دارد باید مقدار پارامتر connect_timeout را افزایش دهید. اما در شرایط مقادیر BLOB که از max_allowed_packet بزرگتر هستند، شما نیاز دارید که یک مقدار بیشتری برای max_allowed_packet در فایل کانفیگ /etc/my.cnf تحت قسمت [mysqld] یا [client] همانند زیر تعریف کنید.
    کد HTML:
    [mysqld]
    connect_timeout=100
    max_allowed_packet=500M
    اگر فایل کانفیگ مای اسکیول برای شما در دسترس نباشد، میتوانید این مقدار را با استفاده از دستور زیر در شل مای اسکیول تعریف کنید.
    کد HTML:
    > SET GLOBAL connect_timeout=100;
    > SET GLOBAL max_allowed_packet=524288000;


    5 - Too Many MySQL Connections

    در شرایطی که کلاینت مای اسکیول خطای “too many connections” را دریافت کند، به این معنی ست که همه ارتباط موجود توسط کلاینت دیگری در حال استفاده هستند. تعداد ارتباطات (پیش فرض 151 عدد) توسط متغییر سیستمی max_connections کنترل میشوند، شما میتوانید مشکل را با افزایش این مقدار برطرف کنید و ارتباطات بیشتری را در فایل کانفیگ /etc/my.cnf مجاز کنید.
    کد HTML:
    [mysqld]
    max_connections=1000


    6 - Out of Memory MySQL

    در مواقعی که شما یک کوئری را با استفاده از برنامه کلاینت مای اسکیول اجرا میکنید و خطای بالا را دریافت میکنید به این معنی ست که مای اسکیول مموری کافی برای ذخیره کل نتیجه کوئری ندارد.

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

    ابزار بی نظیر دیگر MySQL Tuner است - یک اسکریپت مفید که یک سرور مای اسکیول در حال اجرا متصل خواهد شد و برای نحوه کانفیگ به منظور کارایی بیشتر پیشنهاد ارائه میکند.
    کد HTML:
    $ sudo apt-get install mysqltuner #Debian/Ubuntu
    $ sudo yum install mysqltuner #RHEL/CentOS/Fedora
    $ mysqltuner

    برای ترفند های بهینه سازی و افزایش کارایی مای اسکیول مقاله زیر را مطالعه فرمایید.

    15 ترفند مفید برای Tune کردن (بهینه سازی و بهبود عملکرد) MySQL/MariaDB



    7 - MySQL Keeps Crashing

    اگر شما با این مشکل رو به رو شدید،‌ باید مشکل را پیدا کنید که آیا سرور مای اسکیول متوقف شده است یا اینکه کلاینت آن با مشکلی روبه رو شده است. دقت کنید که اکثر crash های سرور به علت فایل های index یا دیتای خراب شده اتفاق می افتند.

    شما میتوانید وضعیت سرور را بررسی کنید که چه مدت است سرور بالاست و در حال کار میباشد.
    کد HTML:
    $ sudo systemctl status mysql #Debian/Ubuntu
    $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
    همچنین، دستور mysqladmin زیر را برای مشاهده uptime سرور مای اسکیول اجرا کنید.
    کد HTML:
    $ sudo mysqladmin version -p
    برای بزرگتر شدن عکس روی آن کلیک کنید  نام:	Find-MySQL-Server-Uptime-4.png نمایش ها:	0 اندازه:	42.0 KB شناسه:	26642






    راهکارهای دیگری وجود دارند اما به متوقف کردن سرور مای اسکیول محدود نمی شوند و دیباگ را نیز فعال میکنند، سپس سرویس را مجدد start میکنند. شما میتوانید یک محیط تست ایجاد کنید که برای تکرار مشکل مورد استفاده قرار میگیرد. علاوه بر این یک پنجره ترمینال اضافی باز کنید و دستور زیر را برای نمایش آمار پروسه MySQL زماینکه شما در حال اجرا کردن کوئری دیگر خود هستید، اجرا کنید.
    کد HTML:
    $ sudo mysqladmin -i 5 status
    OR
    $ sudo mysqladmin -i 5 -r status

    نکته آخر: تشخیص آنچه که باعث یک مشکل یا یک خطا شده است

    اگر چه ما یکسری از مشکلات و خطاهای نسبتا رایج مای اسکیول را بررسی کردیم و روش های ترابل شوت و حل آنها را ارائه دادیم اما مهمترین موضوع برای تشخیص یک خطا فهمیدن این است که خود خطا از چیست و چه معنایی دارد (علت رخ دادن آن چیست).

    چگونه میتوانیم آن را تشخیص دهیم؟ نکات زیر شما را در نحوه شناسایی آنچه که دقیقا باعث ایجاد یک مشکل است راهنمایی میکند :
    • اولین و مهمترین مرحله بررسی لاگ های mysql است که در مسیر /var/log/mysql/ ذخیره شده است. شما میتوانید از ابزارهای کامند لاینی مانند دستور tail برای خواندن log فایل ها استفاده کنید.
    • اگر سرویس MySQL استارت نشود وضعیت آن را با استفاده از دستور systemctl یا journalctl (با استفاده از آپشن -xe) تحت systemd بررسی کنید تا مشکل را تشخیص دهید.
    • همچنین شما میتوانید log فایل سیستم را همانند /var/log/messages بررسی کنید تا علت مشکل را شناسایی کنید.
    • از ابزارهایی مانند Mytop، glances، ps، top یا htop استفاده کنید تا بتوانید بررسی کنید که چه برنامه ای کل cpu شما را مصرف میکند و یا کدام برنامه ماشین را قفل کرده و یا اینکه بررسی کنید که مموری و یا هارد یا مفسر فایل و یا هر گونه ریسورس دیگری را کم میآورید.
    • فرض میکنیم که مشکل از یک پروسه در حال اجراست، شما همیشه میتوانید آنرا با استفاده از ابزار kill یا pkill ببندید، در نتیجه مای اسکیول به درستی کار میکند.
    • با فرض اینکه سرور mysqld باعث اصلی مشکل است شما میتوانید دستور mysqladmin -u root ping یا mysqladmin -u root processlist را برای دریافت هر گونه پاسخی از آن اجرا کنید.
    • اگر هنگام اتصال به سرور مای اسکیول در برنامه کلاینت خود مشکل دارید بررسی کنید که چرا به درستی کار نمی کند و تلاش کنید که به منظور هدف ترابل شوتینگ از آن هر گونه خروجی را بررسی کنید.

    همچنین توصیه میشود مطالعه کنید:

    آموزش MySQL / MariaDB برای مبتدیان - بخش 1

    نحوه مانیتور کردن دیتابیس MySQL/MariaDB با استفاده از Netdata در CentOS 7

    Mytop - یک ابزار مفید برای مانیتورینگ کارایی MySQL/MariaDB در لینوکس

    12 مورد مهم برای امنیت MySQL/MariaDB در لینوکس


    برای کسب اطلاعات بیشتر، راهنمای MySQL را که مربوط به مشکلات و خطاهای رایج است را مطالعه فرمایید، که به صورت وسیعی مشکلات و پیغام های خطای رایجی را که ممکن است شما در حین استفاده از مای اسکیول با آنها رو به رو شوید لیست کرده که شامل مواردیست که در بالا به آنها اشاره کردیم و همچنین موارد تکمیلی دیگر.
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 07-20-2019, 12:11 AM.

درباره انجمن منطقه لینوکسی ها

انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

شبکه های اجتماعی
در حال انجام ...
X