MySQL
MySQL Table Crash คืออะไร และเกิดขึ้นได้อย่างไร?
MySQL Table Crash หรือ Table ที่เสียหาย เป็นปัญหาที่พบได้บ่อยในเว็บไซต์ที่ใช้ฐานข้อมูล MySQL โดยเฉพาะ WordPress, Joomla, OpenCart และ CMS อื่น ๆ ที่มีการเขียนข้อมูลลงฐานข้อมูลอย่างต่อเนื่อง อาการที่พบบ่อย ได้แก่ เว็บไซต์แสดงข้อความ Error เช่น "Error establishing a database connection" หรือ "Table '...' is marked as crashed and should be repaired" รวมถึงเว็บไซต์ช้าลงผิดปกติ หรือหน้าเพจบางส่วนโหลดไม่ขึ้น
สาเหตุหลักที่ทำให้ Table เสียหายมีหลายอย่าง เช่น เซิร์ฟเวอร์รีสตาร์ทกะทันหันขณะที่มีการเขียนข้อมูล, ฮาร์ดดิสก์เต็ม, การ Query ที่ซับซ้อนเกินไปจนหยุดกลางคัน หรือแม้แต่การอัปเดต Plugin ที่ค้างระหว่างการเปลี่ยนแปลงโครงสร้างฐานข้อมูล
เตรียมตัวก่อนทำ Repair: Backup ฐานข้อมูลก่อนเสมอ
ก่อนจะทำการ Repair หรือ Optimize Table ใด ๆ ควร Backup ฐานข้อมูลไว้ก่อนเสมอ เพื่อป้องกันความเสียหายที่อาจเกิดขึ้น โดยสามารถทำได้ผ่าน cPanel ดังนี้
- เข้าสู่ cPanel ของ Hosting
- ไปที่เมนู Databases > phpMyAdmin
- เลือกฐานข้อมูลที่ต้องการจากแถบด้านซ้าย
- คลิกแท็บ Export ด้านบน
- เลือก Format เป็น SQL แล้วกด Go เพื่อดาวน์โหลดไฟล์ Backup
วิธี Repair MySQL Table ผ่าน phpMyAdmin
เมื่อ Backup เรียบร้อยแล้ว สามารถทำการ Repair Table ได้ทันทีผ่าน phpMyAdmin ซึ่งเป็นวิธีที่ง่ายและปลอดภัยสำหรับผู้ใช้ Shared Hosting ที่ไม่มีสิทธิ์เข้าถึง SSH
ขั้นตอนที่ 1: เข้า phpMyAdmin
- Login เข้า cPanel ของคุณ
- ค้นหาและคลิกที่ phpMyAdmin ในส่วน Databases
- เลือก ฐานข้อมูล ที่ต้องการจากแถบซ้าย
ขั้นตอนที่ 2: เลือก Table ที่ต้องการ Repair
- เมื่อเข้ามาในฐานข้อมูลแล้ว จะเห็นรายการ Table ทั้งหมด
- สังเกตที่คอลัมน์ Overhead — ถ้ามีตัวเลข แสดงว่า Table นั้นควร Optimize
- Table ที่ Status แสดงว่า in use หรือ crashed คือ Table ที่ต้องการ Repair
- ทำเครื่องหมายถูกที่ช่องด้านซ้ายของ Table ที่ต้องการ หรือคลิก "Check all" เพื่อเลือกทั้งหมด
ขั้นตอนที่ 3: เลือกคำสั่งจากเมนูด้านล่าง
หลังจากเลือก Table แล้ว ให้มองหาเมนู Dropdown ที่อยู่ด้านล่างของรายการ Table มีตัวเลือกดังนี้
- Repair table — ซ่อมแซม Table ที่เสียหาย (ใช้เมื่อ Table Crash)
- Optimize table — คืนพื้นที่ที่ถูกใช้โดย Overhead และจัดเรียงข้อมูลใหม่
- Analyze table — วิเคราะห์และอัปเดต Index Statistics เพื่อให้ Query เร็วขึ้น
- Check table — ตรวจสอบว่า Table มีปัญหาหรือไม่โดยไม่แก้ไข
วิธี Optimize ทุก Table พร้อมกันด้วย SQL Query
นอกจากการใช้ UI ของ phpMyAdmin แล้ว ยังสามารถรัน SQL Query โดยตรงเพื่อ Optimize หรือ Repair ทุก Table ในฐานข้อมูลได้ในครั้งเดียว โดยคลิกที่แท็บ SQL ด้านบน แล้วพิมพ์คำสั่งดังนี้
-- Optimize Table เฉพาะตาราง
OPTIMIZE TABLE wp_posts, wp_postmeta, wp_options;
-- Repair Table เฉพาะตาราง
REPAIR TABLE wp_posts;
-- Check Table ว่ามีปัญหาไหม
CHECK TABLE wp_comments, wp_commentmeta;
-- Analyze Table เพื่ออัปเดต Index Statistics
ANALYZE TABLE wp_posts, wp_users;
wp_ ตามที่ตั้งค่าไว้ในไฟล์ wp-config.php ตรงตัวแปร $table_prefixความแตกต่างระหว่าง Repair, Optimize, Analyze และ Check
ผู้ใช้หลายคนสับสนว่าควรใช้คำสั่งไหน ขอสรุปให้ชัดเจน
- CHECK TABLE — แค่ตรวจสอบ ไม่แก้ไข เหมาะสำหรับ Diagnose ปัญหา
- REPAIR TABLE — ใช้เมื่อ Table Crash หรือเสียหาย ซ่อมแซมข้อมูลที่หายไป (รองรับเฉพาะ MyISAM)
- OPTIMIZE TABLE — ลบข้อมูลที่ถูก Mark ว่าลบแล้วออก, คืน Overhead Space, จัดเรียง Index ใหม่
- ANALYZE TABLE — อัปเดตสถิติ Index ให้ MySQL Query Optimizer ทำงานได้ดีขึ้น
เมื่อไหรควร Optimize ฐานข้อมูล?
ควร Optimize ฐานข้อมูลเป็นประจำในสถานการณ์ต่อไปนี้
- หลังจากลบบทความ, Comment หรือ User จำนวนมาก
- เมื่อเว็บไซต์ช้าลงโดยไม่มีสาเหตุชัดเจน
- เมื่อ Overhead ของ Table มีขนาดใหญ่ (เกิน 10% ของขนาด Table)
- หลังจาก Update หรือ Migration ฐานข้อมูลขนาดใหญ่
- ทำเป็นประจำทุก 1-3 เดือน สำหรับเว็บที่มีการเขียนข้อมูลบ่อย
การ Repair Table ด้วย SQL สำหรับ InnoDB
InnoDB เป็น Storage Engine ที่ WordPress และ CMS สมัยใหม่นิยมใช้ แต่ InnoDB ไม่รองรับคำสั่ง REPAIR TABLE โดยตรง ต้องใช้วิธีอื่นแทน
-- สำหรับ InnoDB: ใช้วิธี Dump แล้ว Import ใหม่
-- หรือใช้ ALTER TABLE เพื่อ Rebuild Table
ALTER TABLE wp_options ENGINE=InnoDB;
-- ตรวจสอบ Engine ของแต่ละ Table
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'ชื่อฐานข้อมูล';
-- Force Optimize สำหรับ InnoDB
OPTIMIZE TABLE wp_options;
-- (phpMyAdmin จะรัน ALTER TABLE แทน ซึ่งให้ผลเหมือนกัน)
ตรวจสอบว่า MySQL Table ทำงานถูกต้อง
หลังจาก Repair หรือ Optimize เสร็จแล้ว ควรตรวจสอบสถานะของ Table เพื่อยืนยันว่าการซ่อมแซมสำเร็จ ด้วย SQL Query ต่อไปนี้
-- ตรวจสอบสถานะ Table ทั้งหมด
CHECK TABLE wp_posts, wp_postmeta, wp_options, wp_usermeta;
-- ดู Overhead ของทุก Table ในฐานข้อมูล
SELECT TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024,2) AS 'Data (MB)',
ROUND(INDEX_LENGTH/1024/1024,2) AS 'Index (MB)',
ROUND(DATA_FREE/1024/1024,2) AS 'Overhead (MB)'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'ชื่อฐานข้อมูล'
ORDER BY DATA_FREE DESC;
แก้ปัญหาที่พบบ่อย
Error: "Table '...' is marked as crashed and should be repaired"
ข้อผิดพลาดนี้เกิดขึ้นบ่อยกับ MyISAM Table เมื่อเซิร์ฟเวอร์รีสตาร์ทกะทันหัน วิธีแก้คือเข้า phpMyAdmin เลือก Table ที่มีปัญหา แล้วเลือก "Repair table" จาก Dropdown ด้านล่าง ถ้าทำซ้ำหลายครั้งแล้วยังไม่หาย ลองรัน
REPAIR TABLE ชื่อ_table EXTENDED;
ตัวเลือก EXTENDED จะใช้เวลานานกว่าแต่ซ่อมแซมได้ละเอียดกว่า
Error: "Got error 28 from storage engine" หรือ Disk Full
ข้อผิดพลาดนี้หมายความว่าพื้นที่ดิสก์เต็ม ทำให้ MySQL ไม่สามารถเขียนข้อมูลได้ วิธีแก้เร่งด่วน ให้เข้า cPanel และตรวจสอบ Disk Usage ลบไฟล์ที่ไม่จำเป็นออก เช่น Backup เก่า, Error Log ขนาดใหญ่ หรือ Cache ที่ค้างอยู่ แล้วรัน OPTIMIZE TABLE เพื่อคืนพื้นที่จาก Overhead
Error: "MySQL server has gone away"
เกิดขึ้นเมื่อ Query ใช้เวลานานเกิน Timeout ที่กำหนด หรือขนาด Packet เกิน max_allowed_packet ใน Shared Hosting อาจไม่สามารถแก้ Config ได้โดยตรง แต่สามารถแก้ได้โดยแบ่ง Import/Export เป็นไฟล์เล็กลง หรือใช้ cPanel Backup Wizard แทน phpMyAdmin Import โดยตรง
Error: "REPAIR is not supported for InnoDB tables"
InnoDB ไม่รองรับ REPAIR TABLE ให้ใช้วิธีนี้แทน
-- Rebuild InnoDB Table ด้วย ALTER TABLE
ALTER TABLE ชื่อ_table ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
-- หรือ Export แล้ว Import ใหม่ผ่าน phpMyAdmin
phpMyAdmin แสดง Overhead แต่ Optimize แล้วยังไม่หาย
บางครั้ง Optimize Table ที่มี InnoDB อาจแสดง Overhead ปลอมใน phpMyAdmin เนื่องจากวิธีที่ InnoDB จัดการพื้นที่ภายใน ให้ลองรีเฟรชหน้า phpMyAdmin หรือดูผล Overhead จาก information_schema แทน ถ้าเว็บยังทำงานปกติและไม่มี Error ก็ถือว่าใช้ได้
คำถามที่พบบ่อย
Q: ต้องหยุดเว็บไซต์ก่อน Repair Table ไหม?
ไม่จำเป็นต้องหยุดเว็บไซต์ก่อน แต่ควรทำในช่วงเวลาที่มีผู้เข้าชมน้อย เพราะ Repair และ Optimize จะ Lock Table ชั่วคราวระหว่างดำเนินการ ทำให้ Request ที่เข้ามาพร้อมกันอาจต้องรอ หรืออาจเจอ Error ชั่วคราวได้
Q: ควร Optimize ฐานข้อมูลบ่อยแค่ไหน?
สำหรับเว็บทั่วไปที่มีการอัปเดตเนื้อหาสม่ำเสมอ ควร Optimize ทุก 1-3 เดือน สำหรับเว็บ E-commerce หรือเว็บที่มีการเขียน/ลบข้อมูลบ่อย อาจต้องทำถี่ขึ้น เช่น รายเดือน หรือตั้ง Cron Job ให้รันอัตโนมัติ
Q: Repair Table แล้วข้อมูลจะหายไหม?
โดยทั่วไป Repair Table จะไม่ทำให้ข้อมูลหาย แต่ในกรณีที่ Table เสียหายมาก อาจมีข้อมูลบางส่วนที่กู้คืนไม่ได้ นั่นจึงเป็นเหตุผลว่าทำไมต้อง Backup ก่อนทุกครั้ง ถ้า Repair แล้วข้อมูลยังไม่ครบ การ Restore จาก Backup เป็นตัวเลือกที่ดีที่สุด