Saturday, February 12, 2011

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  Sat May 3 20:02:28 ICT 2008
080503 20:02:55  mysqld ended

080503 20:05:27  mysqld started
080503 20:05:28  InnoDB: Out of memory in additional memory pool.
InnoDB: InnoDB will start allocating memory from the OS.
InnoDB: You may get better performance if you configure a bigger
InnoDB: value in the MySQL my.cnf file for
InnoDB: innodb_additional_mem_pool_size.
080503 20:05:28  InnoDB: Started
080503 20:05:28  Found invalid password for user: 'dbservicesrn'@'localhost'; Ignoring user
080503 20:05:28  Found invalid password for user: 'school'@'localhost'; Ignoring user
080503 20:05:28  Found invalid password for user: 'p5wd2'@'localhost'; Ignoring user
080503 20:05:28  Found invalid password for user: 'wixx8'@'localhost'; Ignoring user
/usr/libexec/mysqld: ready for connections

 ===========================

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



ถ้าไม่มีการใช้ 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    24035  0.0  0.1  4248  544 ?        S    May03  0:00 /bin/sh /usr/bin/safe_mysqld --defaults-file=/etc/my.cnf
mysql    32330  0.1  4.2 104588 21988 ?      S    09:58  0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking
root      315  0.0  0.1  3684  660 pts/0    S    10:01  0:00 grep mysql

แต่ พอลอง cat /var/run/mysqld/mysqld.pid กลับไม่มีอะไรเลย เพราะลองเครื่องอื่นแล้วมันจะต้องมี อันเดียวกับ pid เช่น pid 32330
[root@server root]# cat /var/run/mysqld/mysqld.pid

อย่างนี้ผม [root@serverroot]# vi /var/run/mysqld/mysqld.pid
ใส่ id ไปจะเป็นไปไหมครับ

และน่าจะเกียวกับปัญหานี้ไหมครับ

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

เครื่องอื่น
mysql    21365  5.9  0.9 68452 4284 ?        S    Apr18 1364:29 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/lib/mysql/mysqld.pid --skip-locking

ตรง --pid-file=/var/lib/mysql/mysqld.pid จะอยู่ที่ /var/lib/mysql/....xxx


เครื่องที่มีปัญหา
mysql    32330  0.1  4.3 104680 22328 ?      S    09:58  0:00 /usr/libexec/mysqld --defaults-file=/etc/my.cnf --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-locking


มันเป็น --pid-file=/var/run/mysqld/mysqld.pid  คือไปอยู่ที่ /var/run/mysqld/..xxxx

ไม่ รู้ว่าอันไหนน่าจะถูกต้องหรือครับ แล้วมันคืออะไรมีผลอย่างไร น่าจะเกี่ยวกับปัญหาหรือเปล่าเพราะ ผมไปเช็คดูที่ file =/var/run/mysqld/mysqld.pid ปรากฏว่าไม่มีนะครับ เลยได้สร้างขี้นมาแล้วก็ใส่ pid เกียวกับ mysql status เข้าไป
ตอนนี้ ลองอยู่ว่าจะมีปัญหาอีกหรือเปล่า

ปัญหาน่าจะมาจาก 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 ในไฟล์หรือเปล่า
 


เป็นอีกแล้วนะครับ เลย 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:                                            [FAILED]
[root@server mysqld]# /etc/init.d/mysqld stop
Stopping MySQL:                                            [FAILED]


[root@server mysqld]# killall mysqld

[root@server mysqld]# ps auxww |grep mysql
root      7668  0.0  0.1  3688  660 pts/2    S    18:13  0:00 grep mysql

[root@server mysqld]# /etc/init.d/mysqld restart
Stopping MySQL:                                            [FAILED]
Starting MySQL:     


[root@server mysqld]# cat /var/run/mysqld/mysqld.pid

สุดท้ายเหมือนมันสร้าง file ขึ้นมาแต่ไม่ใส่ pid เข้าไปคือ เป็นfile ว่างๆ

================================

ทำ mysqld processlist

Uptime: 1151  Threads: 1  Questions: 12155  Slow queries: 0  Opens: 704  Flush tables: 1  Open tables: 64 Queries per second avg: 10.560

และมันมี process เหมือนมัน Lock นะครับ ไม่ยอมหายไปเองจาก processlist เราจะkill มันauto ได้ไหมครับหรือมัน น่ามีปัญหาอะไรทำไมมันไม่ยอมหาย
| 1127 | dbdb| localhost | dbdb| Query          | 3417 | update          | insert into nuke_msanalysis_search ( words, hits, today, hitstoday, xdays, hitsxdays ) values ( '๠|
| 1148 | dbdb| localhost | dbdb| Query          | 3392 | Locked          | update nuke_msanalysis_search set hits=hits+1, today='2008-05-04', hitstoday=hitstoday+1, hitsxdays= |
| 1163 | dbdb| localhost | dbdb| Query          | 3380 | Locked          | update nuke_msanalysis_search set hits=hits+1, today='2008-05-04', hitstoday=hitstoday+1, hitsxdays= |
| 1178 | dbdb| localhost | dbdb| Query          | 3365 | Locked          | update nuke_msanalysis_search set hits=hits+1, today='2008-05-04', hitstoday=hitstoday+1, hitsxdays= |
| 1508 | dbdb| localhost | dbdb| Query          | 2849 | Locked          | insert into nuke_msanalysis_search ( words, hits, today, hitstoday, xdays, hitsxdays ) values ( 'ภ|
| 1522 | dbdb| localhost | dbdb| Query          | 2819 | Locked          | insert into nuke_msanalysis_search ( words, hits, today, hitstoday, xdays, hitsxdays ) values ( '๠|
| 2307 | dbdb| localhost | dbdb| Query          | 1715 | Locked          | update nuke_msanalysis_search set hits=hits+1, today='2008-05-04', hitstoday=hitstoday+1, hitsxdays= |
| 2419 | dbdb| localhost | dbdb| Query          | 1535 | Locked          | update nuke_msanalysis_search set hits=hits+1, today='2008-05-04', hitstoday=hitstoday+1, hitsxdays= |
| 2448 | Loli_phpBB    | localhost | phpBB          | Query          | 1472 | update          | INSERT INTO phpbb_posts_text (post_id, post_subject, bbcode_uid, post_text) VALUES (14924, 'CODE GEA |
| 2538 | Loli_phpBB    | localhost | phpBB          | Query          | 1326 | Locked          | INSERT INTO phpbb_posts_text (post_id, post_subject, bbcode_uid, post_text) VALUES (14925, 'CODE GEA |

(อันนี้แค่ส่วนนึงนะครับ)

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

INSERT INTO smf_messages
                        (ID_BOARD, ID_TOPIC, ID_MEMBER, subject, body, posterName, posterEmai |


เลยคิดว่าเครือ่งน่าจะมีปัญหาที่ไม่ชอบ เคลียร์ process เก่าๆ ทิ้ง ทำให้มันเต็มและก็ค้างให้ที่สุดนะครับ
แบบนี้เราจะแก้อย่างไรดีมีทาง เช็คให้มัน kill auto ไหมครับ 

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

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

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

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

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

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


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

--skip-innodb

ใน my.cnf มันซะเลย ง่ายดี แต่ผลที่ตามมาคือ  user จะไม่สามารถใช้งานแบบ innodb ได้

สำหรับ เรื่องที่สคริป sql ค้างอยู่นั้น ปรกติผมจะไม่เจอครับ แต่ผมเคยเจอทีนึง ซึ่งคราวนั้นเกิดจากการ restart apache ครับ ทำให้ process SQL ทำงานยังไม่สำเร็จ

โดยปรกติจะเกิดจากการ lock table ครับ แล้วไป restart apache ณ จุดนั้นพอดี ทำให้ SQL ไม่สมบูรณ์และไม่สามารถ ปลดล็อค table ได้ พอมีการทำ DML ใน table นั้นก็ทำให้เกิดการ lock ได้ เพราะว่า table ยังไม่ได้ถูกปลด lock นั่นเอง

สำหรับส่วนนี้ผมยังไม่แน่ใจว่า แก้ด้วยวิธีใดครับ เพราะว่าผมลองไม่ได้ เพราะถ้า lock ทีแล้ว load จะพุ่งขึ้นมาเลยครับ เพราะว่ามันจะเกิดการรอการเข้ามาเปลี่ยนค่า แต่มันทำไม่ได้ครับ

ตอนนี้ลองปรับค่า mysql persistance ให้เป็น 0 ดูนะครับ แล้วตั้งค่า time out ของ mysql เอาไว้ให้ต่ำลง จะทำให้ clear connection ได้เร็วขึ้นครับ

รบกวนเช็ค 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
   
[mysql.server]
user=mysql
basedir=/var/lib

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


หรือ เราสามารถ copy my.cnf เครื่องอื่นทีทำงานปกติมาทับได้เลยไหมครับ
ผมลองเทียบกับเครื่องอื่นจะมี คำสั่งมากกว่าเยอะเลย
เช่น
# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
set-variable    = key_buffer=16M
set-variable    = max_allowed_packet=1M
set-variable    = table_cache=64
set-variable    = sort_buffer=512K
set-variable    = net_buffer_length=8K
set-variable    = myisam_sort_buffer_size=8M

เลยสงสัยว่าอยู่ๆทำไมมันหายไป 

0 comments:

Post a Comment

 
Design by Laikeng | Bloggerized by Storesu - sutoday | Court