Mysqld ไม่สามารถใช้งานได้ แต่ status ก็ไม่ตาย ใครเคยเจอบ้าง

แบบอยู่ๆ ทุกเว็บก็ connect mysqld ไม่ได้
แต่พอ ssh เข้าไปเช็ค
[root@server root]# service mysqld status
mysqld (pid 22214) is running…

ผมแก้แค่
[root@server root]# kill -9 22214

มันก็ใช้งานได้เลยนะครับ โดยเปลี่ยน pid
[root@server root]# service mysqld status
mysqld (pid 22548) is running…

แต่ปัญหาคือต้องมาค่อย kill มันนะครับเลยไม่รู้สาเหตุว่าทำไมอยู่ๆมันถึงทำงานไม่ได้นะครับ
มีใครเคยเจอบ้างไหมครับ
ใช้ linux + plesk นะครับ
ขอบคุณครับ

เช็ค log มันขึ้นแบบนี้นะครับจาก /var/log/mysqld.log
[root@server log]# cat mysqld.log.1
A mysqld process already exists at

ถ้าไม่มีการใช้ innodb ก็ใส่ --skip-innodb ใน my.cnf

น่าจะใส่ตรงไหนหรือครับ
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

[mysql.server]
user=mysql
basedir=/var/lib

[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

ผมเจอแปลกเรื่องนึงนะครับ
คือ ผมลอง
[root@server root]# ps auxww |grep mysql
root

ผมสังเหตุเครื่องนี้ แปลกกว่าเครื่องอื่นตรง pid file ที่เก็บ mysql นะครับ ไม่รู้เกียวหรือเปล่า

เครื่องอื่น
mysql

ใส่ในส่วนของ mysqld ครับ

http://dev.mysql.com/doc/refman/5.1/en/server-options.html

ส่วน pid ไฟล์ จะสร้างไว้ตรงไหนก็ได้ครับ ให้มี permission ในการเข้าถึงก็พอ

ลอง mysqladmin processlist ดูคับ ว่ามี slow query หรือว่า connection เอยะเกินไปหรือเปล่า

ปัญหาน่าจะมาจาก pid ไฟล์ที่ว่ามาครับ
ประมาณว่า service on อยู่แต่ไ่ม่มี pid อยุ่ในไฟล์
ตัว monitor service ก็เลยคิดว่า down และทำการ start ให้

ลองสั่ง /etc/init.d/mysql(d) stop ติดกัน 2 ครั้ง (เริ่มสั่งตอนต้นนาทีเพื่อหลีกเลี่ยง cron)
แล้วตามด้วย killall mysqld
ps ดูว่ามี process mysql เหลืออยู่หรือเปล่า ถ้ามีก็ kill ออกให้หมด
ระหว่างนี้ไม่ควรจะมี process mysql run ขึ้นมาเอง

เสร็จแล้วสั่ง start mysql จากใน plesk หรือถ้าใน plesk ไม่มี ก็ /etc/init.d/mysql(d) restart
เช็คว่ามี pid ในไฟล์หรือเปล่า

อึ่ม… check log mysqld & apache ควบคู่กันไปว่ามีเรียก process และมี connection เกิดไหม
เคยเจอคือ library บางตัวมันเสีย แต่ process ทำงานเหมือนปกติ แต่ติดต่อ db ไม่ได้

เป็นอีกแล้วนะครับ เลย status ดูได้ตามนี้
[root@server root]# mysql
ERROR 1040: Too many connections

[root@server mysql]# mysqladmin processlist
mysqladmin: connect to server at ‘localhost’ failed
error: ‘Too many connections’

[root@server mysqld]# /etc/init.d/mysqld stop
Stopping MySQL:

แก้ไข

ทำ mysqld processlist

Uptime: 1151

พอทราบปัญหาละครับ ตอนแรกนึกว่าเป็นที่ script ลุกค้าแต่เข้าไปเช็คแล้ว
เป็นหลายเว็บเลย โดยเฉพาะเว็บที่เป็น script สำเร็จรูป พวก phpbb smf
มันจะเหลือ process ค้างไว้
เช่น
UPDATE smf_members

จาก error มันแจ้งว่า memory pool นั้นมีขนาดใหญ่เกินไป

แต่ว่า my.cnf ของคุณก็ไม่ได้กล่าวถึงเอาไว้เลย

ดังนั้น มันคือการดึงค่า default ออกมาใช้นั่นเอง

ที่มันเกิขึ้นก็เพราะว่า ram ของคุณหมด และมีไม่เพียงพอที่จะจับจองมารองรับการทำงาน

วิธีแก้ก็คือ ให้ตั้งค่าในส่วนของ innodb ใหม่ โดยที่ตั้งเพื่อให้ใช้งาน หรือจอง memory ให้น้อยลง เพราะว่าไม่ตั้งมันจะใช้ค่า default

ซึ่งตอนนี้เป็นค่าเท่าไร สามารถตรวจสอบได้จาก show status ครับ หรือจะล็อกอินฐานะ root ใน phpmyadmin เพื่อทำการดูค่าปัจจุบันแล้วไปปรับให้น้อยลงก็ได้ครับ

หรือไม่อยากเครียด ไม่อยากคิดมาก ก็

–skip-innodb

ใน my.cnf มันซะเลย ง่ายดี แต่ผลที่ตามมาคือ

รบกวนเช็ค my.cnf หน่อยได้ไหมครับว่ามันผิดตรงไหน เพราะรู้สึกว่ามันสั้นๆผิดปกตินะครับ
[root@server etc]# cat /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

ถ้าอยากรักษา innodb เอาไว้ แนะนำว่าให้เปิด google ดูเกี่ยวกับการตั้งค่า my.cnf ในส่วนของ innodb ดูครับ จะเจอที่ให้เราตั้งเพียบบบบบ