- 1 1. บทนำ
- 2 2. การเตรียมการก่อนทำ Restore
- 3 3. ขั้นตอนการกู้คืนฐานข้อมูล MySQL
- 4 4. วิธีตรวจสอบข้อมูลหลังการกู้คืน MySQL
- 5 5. การปรับแต่งการกู้คืนสำหรับชุดข้อมูลขนาดใหญ่
- 6 6. การแก้ไขปัญหาการกู้คืน MySQL
- 7 7. คำถามที่พบบ่อย (FAQ)
- 7.1 Q1: ควรทำอย่างไรหากเห็น “Unknown database” ระหว่างการเรียกคืน?
- 7.2 Q2: จะแก้ไขอักขระเสียหายหลังการเรียกคืนอย่างไร?
- 7.3 Q3: ฉันจะกู้คืนไฟล์ SQL ขนาดใหญ่ (1GB หรือมากกว่า) อย่างไร?
- 7.4 Q4: ฉันจะกู้คืนใน AWS RDS (สภาพแวดล้อมคลาวด์) อย่างไร?
- 7.5 Q5: ฉันจะทดสอบสำเนาสำรองและการกู้คืนโดยอัตโนมัติได้อย่างไร?
- 8 8. สรุป
1. บทนำ
MySQL Restore คืออะไร?
MySQL restore คือกระบวนการกู้คืนข้อมูลที่สำรองไว้กลับเข้าสู่ฐานข้อมูลต้นฉบับ
โดยการทำ restore คุณสามารถกู้คืนข้อมูลหลังจากการสูญเสียข้อมูลหรือความล้มเหลวของระบบและดำเนินธุรกิจหรือระบบของคุณต่อได้
ฐานข้อมูลอาจเสียหายหรือหายไปได้จากหลายสาเหตุ ตัวอย่างเช่นกรณีต่อไปนี้เป็นเรื่องทั่วไป
- เซิร์ฟเวอร์ล่มหรือฮาร์ดแวร์เสีย
- การลบข้อมูลโดยบังเอิญ
- การเสียหายของข้อมูลจากการอัปเดตหรือการเปลี่ยนแปลงระบบ
- การสูญเสียข้อมูลจากมัลแวร์หรือการโจมตีจากภายนอก
เพื่อเตรียมพร้อมสำหรับสถานการณ์เหล่านี้ การสำรองข้อมูลล่วงหน้าอย่างเหมาะสมเป็นสิ่งสำคัญ
จากนั้นเมื่อถึงเวลาที่ต้องการ restore คุณจะสามารถกู้ระบบของคุณได้อย่างรวดเร็ว
สิ่งที่คุณจะได้เรียนรู้ในบทความนี้
บทความนี้อธิบายขั้นตอนการทำ MySQL restore อย่างละเอียด
เพื่อรองรับผู้ใช้ตั้งแต่ระดับเริ่มต้นจนถึงระดับสูง เราจะนำเสนอทุกอย่างตั้งแต่วิธีการ restore พื้นฐานจนถึงเทคนิคการกู้คืนขั้นสูง
โดยเฉพาะคุณจะได้เรียนรู้เรื่องต่อไปนี้
- ขั้นตอนการทำ MySQL restore พื้นฐาน
- วิธีการ restore ด้วยบรรทัดคำสั่ง (mysqldump)
- การ restore ด้วยเครื่องมือ GUI (phpMyAdmin, MySQL Workbench)
- วิธีการ restore เฉพาะข้อมูลบางส่วน
- การเพิ่มประสิทธิภาพการ restore สำหรับชุดข้อมูลขนาดใหญ่
- การกู้คืนขั้นสูงด้วย binary log
- วิธีตรวจสอบข้อมูลหลังการ restore
- การแก้ไขปัญหาเมื่อเกิดข้อผิดพลาด
เมื่อทำตามคู่มือนี้ คุณจะสามารถออกแบบกลยุทธ์การสำรองข้อมูลที่เหมาะสมและทำการ restore อย่างรวดเร็วเมื่อจำเป็น
จากส่วนต่อไปนี้ เราจะอธิบายการเตรียมการที่จำเป็นก่อนทำการ restore
2. การเตรียมการก่อนทำ Restore
ประเภทของการสำรองข้อมูล MySQL
เพื่อทำการ restore จำเป็นต้องสร้างการสำรองข้อมูลที่เหมาะสมล่วงหน้า วิธีการสำรองข้อมูล MySQL มีดังนี้
1. การสำรองด้วย mysqldump
mysqldump เป็นเครื่องมือที่ส่งออกฐานข้อมูล MySQL ในรูปแบบ SQL เป็นวิธีที่นิยมที่สุดและง่ายต่อการ restore
mysqldump -u username -p database_name > backup.sql
เนื่องจากวิธีนี้บันทึกข้อมูลเป็นไฟล์ข้อความ จึงแก้ไขได้ง่าย แต่ไม่เหมาะกับชุดข้อมูลขนาดใหญ่มาก
2. การสำรองด้วย phpMyAdmin
วิธีนี้ใช้ GUI ของ phpMyAdmin เพื่อสร้างการสำรองอย่างง่าย คุณสามารถส่งออกเป็นไฟล์ SQL ได้
- เข้าสู่ระบบ phpMyAdmin
- เลือกแท็บ “Export”
- ตั้งค่ารูปแบบเป็น “SQL” แล้วคลิก “Go”
วิธีนี้เหมาะกับผู้เริ่มต้น แต่ไม่เหมาะกับข้อมูลขนาดใหญ่
3. การสำรองด้วย MySQL Workbench
MySQL Workbench สามารถสร้างการสำรองผ่าน GUI ได้ โดยใช้ฟีเจอร์ Data Export คุณสามารถส่งออกฐานข้อมูลหรือ ตารางที่ต้องการได้
4. การสำรองด้วย Binary Log
การใช้ binary log จะบันทึกการเปลี่ยนแปลงจนถึงจุดเวลาที่กำหนด ทำให้สามารถกู้คืนข้อมูลได้
mysqlbinlog --start-datetime="2024-02-01 10:00:00" --stop-datetime="2024-02-01 12:00:00" binlog.000001 > restore.sql
วิธีนี้ช่วยให้ทำการกู้คืนขั้นสูงได้ แต่ต้องมีการจัดการ log อย่างเหมาะสม
รายการตรวจสอบก่อนทำ Restore
เพื่อให้การ restore สำเร็จ คุณต้องตรวจสอบประเด็นต่อไปนี้ล่วงหน้า
1. ตรวจสอบชุดอักขระ (UTF-8 vs. SJIS)
หากชุดอักขระของไฟล์สำรองและไฟล์ที่ทำ restore แตกต่างกัน ข้อความอาจแสดงเป็นอักขระผิดพลาด ตรวจสอบการเข้ารหัสของไฟล์สำรอง
file backup.sql
นอกจากนี้ การระบุ --default-character-set=utf8mb4 ระหว่างการ restore สามารถช่วยหลีกเลี่ยงปัญหาเรื่องชุดอักขระได้
mysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
2. สร้างฐานข้อมูลเป้าหมายสำหรับการ Restore
ก่อนทำ restore ให้ตรวจสอบว่าฐานข้อมูลเป้าหมายมีอยู่หรือไม่ หากไม่มีให้สร้างขึ้นก่อน
mysql -u username -p -e "CREATE DATABASE IF NOT EXISTS database_name;"
3. ตรวจสอบความสมบูรณ์ของไฟล์สำรอง
เพื่อยืนยันว่าไฟล์สำรองไม่เสียหาย ให้ลองแสดงส่วนหนึ่งของเนื้อหาไฟล์
head -n 20 backup.sql
หากขนาดไฟล์ผิดปกติเล็กเกินไป แสดงว่าไฟล์สำรองอาจไม่ได้สร้างอย่างถูกต้อง
วิธีเลือกวิธีการ Restore (ตารางเปรียบเทียบ)
The restore method depends on your environment and data size. Use the table below to choose the most suitable option.
| Method | Difficulty | Pros | Cons |
|---|---|---|---|
mysqldump | Intermediate | Fast and highly reliable | Requires manual commands |
| phpMyAdmin | Beginner | Easy to operate via GUI | Not suitable for large datasets |
| Workbench | Beginner | Simple UI workflow | Can put high load on the server |
| Binary log | Advanced | Point-in-time recovery possible | Complex configuration |
3. ขั้นตอนการกู้คืนฐานข้อมูล MySQL
การกู้คืนฐานข้อมูลเดียว
วิธีการกู้คืนสำรองข้อมูล mysqldump
วิธีการกู้คืนที่พบบ่อยที่สุดคือการกู้คืนข้อมูลสำรองที่สร้างด้วย mysqldump.
ขั้นตอน:
- ตรวจสอบว่าไฟล์สำรองข้อมูลถูกต้อง
head -n 20 backup.sql
→ ตรวจสอบส่วนเริ่มต้นของไฟล์สำรองและยืนยันว่าไม่มีข้อผิดพลาด.
- สร้างฐานข้อมูลเป้าหมาย (หากยังไม่มี)
mysql -u username -p -e "CREATE DATABASE IF NOT EXISTS database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
- กู้คืนข้อมูล
mysql -u username -p database_name < backup.sql
การระบุตัวเลือกเพื่อป้องกันอักขระผิดรูป
หากการเข้ารหัสข้อมูลแตกต่างกัน คุณอาจเห็น อักขระผิดรูป ระหว่างการกู้คืน เพื่อป้องกันสิ่งนี้ มักจะระบุ --default-character-set=utf8mb4.
mysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
หมายเหตุ:
- ยืนยันว่าชุดอักขระที่ใช้ในขณะสำรองตรงกับชุดอักขระที่ใช้ในขณะกู้คืน
- ตั้งค่าชุดอักขระเริ่มต้นของฐานข้อมูลเป็น UTF-8 (utf8mb4) เมื่อสร้างฐานข้อมูล
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
การกู้คืนหลายฐานข้อมูล
หากไฟล์สำรองมี หลายฐานข้อมูล คุณสามารถกู้คืนได้โดยรันการนำเข้าโดยไม่ระบุฐานข้อมูล (มักใช้กับการดัมพ์ที่สร้างด้วย --databases).
mysql -u username -p < backup.sql
หากคุณต้องการกู้คืนเฉพาะฐานข้อมูลหนึ่ง ให้รันคำสั่งต่อไปนี้:
mysql -u username -p --one-database target_database_name < backup.sql
ตัวอย่าง:
mysql -u root -p --one-database sales_db < all_databases_backup.sql
→ กู้คืนเฉพาะ sales_db.
การกู้คืนทุกฐานข้อมูล
เพื่อกู้คืนทุกฐานข้อมูลพร้อมกัน ใช้ --all-databases.
mysql -u username -p --all-databases < backup.sql
ประเด็นสำคัญ:
- การใช้
--all-databasesจะกู้คืน ทุกฐานข้อมูล ในไฟล์สำรอง - ควรตรวจสอบล่วงหน้าว่าไฟล์มีคำสั่งเช่น
DROP DATABASEหรือCREATE DATABASEหรือไม่ . - หากคุณมีข้อมูลจำนวนมาก, ปรับแต่งการตั้งค่าหน่วยความจำ (รายละเอียดอธิบายใน “5. การปรับแต่งการกู้คืนสำหรับชุดข้อมูลขนาดใหญ่”).
การกู้คืนด้วยเครื่องมือ GUI
การกู้คืนโดยใช้ phpMyAdmin
- เข้าสู่ระบบ phpMyAdmin
- เลือกแท็บ “Import”
- เลือกและอัปโหลดไฟล์สำรอง (SQL)
- คลิก “Go” เพื่อเริ่มการกู้คืน
✅ ข้อดี:
- ใช้งานง่ายสำหรับ ผู้เริ่มต้น
- คุณสามารถกู้คืนโดยไม่ต้องใช้เครื่องมือบรรทัดคำสั่ง
⚠️ ข้อเสีย:
- ขนาดไฟล์จำกัด อาจมีผล
- ไม่เหมาะสำหรับข้อมูลขนาดใหญ่
การกู้คืนโดยใช้ MySQL Workbench
- เปิด MySQL Workbench
- เลือก “Server > Data Import”
- เลือกไฟล์สำรอง
- ระบุฐานข้อมูลเป้าหมาย
- คลิก “Start Import” เพื่อดำเนินการกู้คืน
✅ ข้อดี:
- กระบวนการ GUI ที่เข้าใจง่าย
- คุณสามารถกู้คืนเฉพาะตารางที่ต้องการ
⚠️ ข้อเสีย:
- อาจทำให้เซิร์ฟเวอร์โหลดสูง
- ตรวจสอบความเข้ากันได้กับเวอร์ชัน MySQL Server ของคุณ
4. วิธีตรวจสอบข้อมูลหลังการกู้คืน MySQL
คำสั่งพื้นฐานเพื่อยืนยันการกู้คืนสำเร็จ
1. ตรวจสอบรายการฐานข้อมูล
หลังการกู้คืน ยืนยันว่าฐานข้อมูลถูกสร้างอย่างถูกต้อง.
SHOW DATABASES;
✅ จุดตรวจสอบ
- ฐานข้อมูลทั้งหมดที่อยู่ในไฟล์สำรองแสดงหรือไม่?
- ชื่อฐานข้อมูลเป้าหมายการกู้คืนถูกต้องหรือไม่?
2. ตรวจสอบรายการตารางในแต่ละฐานข้อมูล
แม้ฐานข้อมูลจะมีอยู่ แต่หากตารางไม่ได้รับการกู้คืนอย่างถูกต้องก็ไม่มีประโยชน์ ใช้คำสั่งต่อไปนี้เพื่อตรวจสอบรายการตารางในฐานข้อมูล.
USE database_name;
SHOW TABLES;
✅ จุดตรวจสอบ
- ตารางที่จำเป็นทั้งหมดแสดงหรือไม่?
- ขึ้นอยู่กับตัวเลือกของ
mysqldumpมีตารางใดบ้างที่อาจถูกละเว้นโดยบังเอิญ?
3. ตรวจสอบจำนวนแถวในตาราง
แม้กระทั่งหลังจากการกู้คืนเสร็จสิ้น คุณสามารถตรวจสอบว่าข้อมูลถูกกู้คืนอย่างถูกต้องหรือไม่โดยใช้ COUNT(*).
SELECT COUNT(*) FROM table_name;
✅ จุดตรวจสอบ
- ผลลัพธ์ของ
COUNT(*)ตรงกับจำนวนแถวก่อนทำการสำรองหรือไม่? - มีข้อมูลใดหายไปหรือไม่?
- มีค่าที่เป็น
NULLหรือ0จำนวนมากผิดปกติหรือไม่?

4. ยืนยันว่าข้อมูลเฉพาะที่กู้คืนแล้วถูกต้อง
เพื่อให้แน่ใจว่าข้อมูลถูกกู้คืนอย่างถูกต้อง ให้ดึงและตรวจสอบไม่กี่แถว.
SELECT * FROM table_name LIMIT 10;
✅ จุดตรวจสอบ
- การเรียงลำดับและค่าต่าง ๆ ปกติหรือไม่?
- มีข้อความที่เสียหายหรือไม่?
การตรวจสอบอักขระเสียหายและข้อมูลเสียหาย
หากการเข้ารหัสอักขระไม่ได้รับการจัดการอย่างถูกต้องระหว่างการกู้คืน ข้อความอาจกลายเป็นเสียหาย
เพื่อป้องกันปัญหานี้ ให้ตรวจสอบการเข้ารหัสอักขระหลังการกู้คืน.
1. ตรวจสอบการเข้ารหัสของฐานข้อมูล
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='database_name';
2. ตรวจสอบการเข้ารหัสของตาราง
SHOW CREATE TABLE table_name;
💡 เคล็ดลับเพื่อป้องกันอักขระเสียหาย
- เมื่อทำการส่งออกด้วย
mysqldumpให้ระบุ--default-character-set=utf8mb4 - เมื่อทำการกู้คืน ให้ระบุ
--default-character-set=utf8mb4ด้วย - แก้ไขการตั้งค่า
SET NAMESภายในไฟล์สำรองหากจำเป็น
ตรวจสอบความสมบูรณ์ของดัชนีและคีย์ต่างประเทศ
1. ตรวจสอบว่าดัชนีถูกตั้งค่าอย่างถูกต้องหรือไม่
SHOW INDEX FROM table_name;
✅ จุดตรวจสอบ
- ดัชนีถูกกู้คืนอย่างถูกต้องหรือไม่?
- คำสั่งค้นหาบนคอลัมน์เฉพาะช้ากว่าปกติหรือไม่?
2. ตรวจสอบข้อจำกัดคีย์ต่างประเทศ
หากคุณกู้คืนตารางที่มีข้อจำกัดคีย์ต่างประเทศ คุณต้องยืนยันว่าข้อจำกัดเหล่านั้นถูกนำไปใช้อย่างถูกต้อง.
SELECT TABLE_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'database_name';
✅ จุดตรวจสอบ
- ข้อจำกัดคีย์ต่างประเทศทั้งหมดถูกกู้คืนหรือไม่?
- การตั้งค่าเช่น
ON DELETE CASCADEและON UPDATE CASCADEถูกต้องหรือไม่?
ตรวจสอบไฟล์บันทึกเพื่อสืบสวนปัญหาการกู้คืน
หากเกิดข้อผิดพลาดระหว่างการกู้คืน คุณสามารถระบุปัญหาได้โดยตรวจสอบบันทึกข้อผิดพลาดของ MySQL.
1. ตรวจสอบบันทึกข้อผิดพลาดของ MySQL
sudo cat /var/log/mysql/error.log
✅ สิ่งที่ควรมองหาในบันทึกข้อผิดพลาด
ERROR 1366 (HY000): Incorrect string value→ ปัญหาการเข้ารหัสที่อาจเกิดขึ้นERROR 1452 (23000): Cannot add or update a child row→ ข้อผิดพลาดข้อจำกัดคีย์ต่างประเทศERROR 2006 (HY000): MySQL server has gone away→ ไฟล์สำรองอาจใหญ่เกินไป
การปรับประสิทธิภาพหลังการกู้คืน
หลังจากการกู้คืน การตรวจสอบไม่เพียงแต่ความสมบูรณ์ของข้อมูล แต่ยังรวมถึงผลกระทบต่อประสิทธิภาพเป็นสิ่งสำคัญ.
1. ตรวจสอบความเร็วการดำเนินการของคิวรี
หากการค้นหาข้อมูลช้าลงหลังการกู้คืน ดัชนีอาจไม่ได้รับการกู้คืนอย่างถูกต้อง.
EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
2. ปรับแต่งตาราง
เพื่อลดการกระจายและปรับปรุงประสิทธิภาพ ให้ทำการปรับแต่งตาราง.
OPTIMIZE TABLE table_name;
3. ล้างแคช
หากมีการกู้คืนข้อมูลจำนวนมาก การล้างแคชชั่วคราวอาจช่วยปรับปรุงประสิทธิภาพ.
RESET QUERY CACHE;
สรุป
เพื่อยืนยันว่าข้อมูลที่กู้คืนถูกต้อง ขั้นตอนต่อไปนี้เป็นสิ่งสำคัญ:
✅ การตรวจสอบฐานข้อมูลและตารางพื้นฐาน
✅ ตรวจสอบจำนวนแถวและตรวจหาอักขระเสียหาย
✅ ตรวจสอบดัชนีและคีย์ต่างประเทศ
✅ วิเคราะห์บันทึกข้อผิดพลาดเพื่อระบุปัญหา
✅ ใช้การปรับประสิทธิภาพ
การกู้คืนฐานข้อมูลไม่เสร็จสมบูรณ์เพียงแค่ทำการสำรอง; จะเสร็จสมบูรณ์ก็ต่อเมื่อทำการตรวจสอบความสมบูรณ์และการยืนยันการทำงานแล้ว.
5. การปรับแต่งการกู้คืนสำหรับชุดข้อมูลขนาดใหญ่
การปรับค่าการตั้งค่า max_allowed_packet
1. max_allowed_packet คืออะไร?
MySQL จำกัดขนาดแพ็กเก็ตสูงสุดที่สามารถส่งได้ในครั้งเดียวโดยใช้การตั้งค่า max_allowed_packet
หากค่านี้เล็กเกินไป อาจเกิดข้อผิดพลาดเมื่อทำการกู้คืนคำสั่ง SQL ขนาดใหญ่
2. ตรวจสอบการตั้งค่าปัจจุบัน
SHOW VARIABLES LIKE 'max_allowed_packet';
ค่าเริ่มต้นโดยทั่วไปคือ 16MB (16,777,216 ไบต์) เมื่อทำการกู้คืนชุดข้อมูลขนาดใหญ่ แนะนำให้เพิ่มเป็น 256MB หรือมากกว่า
3. เปลี่ยนการตั้งค่าแบบชั่วคราว
เพื่อแก้ไขแบบชั่วคราวภายในเซสชันของ MySQL:
SET GLOBAL max_allowed_packet=268435456; -- 256MB
4. เปลี่ยนการตั้งค่าแบบถาวร
แก้ไขไฟล์กำหนดค่าของ MySQL (my.cnf หรือ my.ini) และเพิ่มหรือแก้ไขบรรทัดต่อไปนี้:
[mysqld]
max_allowed_packet=256M
หลังจากทำการเปลี่ยนแปลงแล้ว ให้รีสตาร์ท MySQL:
sudo systemctl restart mysql
✅ จุดตรวจสอบ
- หากคุณเห็น
ERROR 2006 (HY000): MySQL server has gone awayให้เพิ่มค่าmax_allowed_packet. - หากการกู้คืนล้มเหลวกลางทางเมื่อจัดการข้อมูลขนาดใหญ่ ให้ตรวจสอบการตั้งค่านี้.
การปรับขนาด innodb_buffer_pool_size
1. innodb_buffer_pool_size คืออะไร?
innodb_buffer_pool_size กำหนดว่าหน่วยความจำที่เครื่องยนต์จัดเก็บข้อมูล InnoDB ใช้เท่าใด หากค่าต่ำเกินไป การดำเนินการกู้คืนจะต้องเข้าถึงดิสก์บ่อยครั้ง ทำให้ประสิทธิภาพลดลง
2. ตรวจสอบการตั้งค่าปัจจุบัน
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
ค่าเริ่มต้นโดยทั่วไปอยู่ที่ประมาณ 128MB สำหรับชุดข้อมูลขนาดใหญ่ แนะนำให้จัดสรร 50–70% ของหน่วยความจำเซิร์ฟเวอร์ทั้งหมด
3. วิธีการกำหนดค่า
แก้ไข my.cnf และเพิ่มหรือแก้ไขบรรทัดต่อไปนี้:
[mysqld]
innodb_buffer_pool_size=2G
จากนั้นรีสตาร์ท MySQL:
sudo systemctl restart mysql
✅ จุดตรวจสอบ
- หากมีหน่วยความจำเซิร์ฟเวอร์เพียงพอ การเพิ่มค่า
innodb_buffer_pool_sizeจะช่วยเพิ่มความเร็วในการกู้คืน. - ในสภาพแวดล้อมขนาดเล็ก ควรเฝ้าติดตามการใช้หน่วยความจำอย่างระมัดระวังเมื่อทำการปรับค่า.
การแบ่งพาร์ทิชันเพื่อเพิ่มความเร็วในการกู้คืน
1. ประโยชน์ของการแบ่งพาร์ทิชัน
เมื่อฐานข้อมูลเติบโต ตารางเดียวอาจมีข้อมูลจำนวนมาก ทำให้ภาระการกู้คืนเพิ่มขึ้น การแบ่งตารางเป็นพาร์ทิชันสามารถปรับปรุงประสิทธิภาพการกู้คืนได้
2. ตัวอย่างการกำหนดค่าพาร์ทิชัน
ตัวอย่างเช่น การแบ่งพาร์ทิชันตามวันที่ created_at:
CREATE TABLE orders (
id INT NOT NULL,
created_at DATE NOT NULL,
PRIMARY KEY (id, created_at)
) PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
สิ่งนี้ยังทำให้คุณสามารถกู้คืนเฉพาะพาร์ทิชันที่ต้องการได้เท่านั้น
✅ จุดตรวจสอบ
- แทนที่จะกู้คืนข้อมูลทั้งหมดในครั้งเดียว การแยกตามพาร์ทิชันสามารถปรับปรุงประสิทธิภาพได้อย่างมาก.
- ออกแบบตารางโดยคำนึงถึงการแบ่งพาร์ทิชันเพื่อจัดการชุดข้อมูลขนาดใหญ่ได้ดีขึ้น.
การกู้คืนที่เร็วขึ้นโดยใช้ --disable-keys
1. --disable-keys คืออะไร?
เมื่อแทรกข้อมูลจำนวนมากลงในตารางที่มีดัชนี MySQL จะอัปเดตดัชนีสำหรับแต่ละการแทรก ทำให้การกู้คืนช้าลง การใช้ DISABLE KEYS ชั่วคราวจะระงับการอัปเดตดัชนีและเร่งความเร็วการกู้คืน
2. วิธีการใช้
- แก้ไขไฟล์สำรองและเพิ่มบรรทัดต่อไปนี้:
ALTER TABLE table_name DISABLE KEYS;
- รันกระบวนการกู้คืน
mysql -u username -p database_name < backup.sql
- หลังจากการกู้คืนเสร็จสิ้น ให้เปิดใช้งานดัชนีอีกครั้ง:
ALTER TABLE table_name ENABLE KEYS;
✅ จุดตรวจสอบ
- การใช้
DISABLE KEYSจะช่วยเพิ่มความเร็วในการกู้คืนอย่างมากสำหรับการแทรกข้อมูลขนาดใหญ่. - อย่าลืมรัน
ENABLE KEYSหลังการกู้คืน.
6. การแก้ไขปัญหาการกู้คืน MySQL
ข้อความแสดงข้อผิดพลาดทั่วไปและวิธีแก้
1. ข้อผิดพลาด “Unknown Database”
✅ ข้อความแสดงข้อผิดพลาด
ERROR 1049 (42000): Unknown database 'database_name'
✅ สาเหตุ
- ฐานข้อมูลเป้าหมายไม่ได้ถูกสร้างก่อนทำการกู้คืน.
✅ วิธีแก้
- สร้างฐานข้อมูลด้วยตนเอง
mysql -u username -p -e "CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
- Run the restore again
mysql -u username -p database_name < backup.sql
2. “Incorrect String Value” (อักขระเสียหาย)
✅ Error Message
ERROR 1366 (HY000): Incorrect string value
✅ Cause
- ความไม่ตรงกันของชุดอักขระระหว่างการสำรองและการเรียกคืน
- ชุดอักขระเริ่มต้นของฐานข้อมูลไม่เหมาะสม
✅ Solution
- Check the encoding of the backup file
file backup.sql
- Specify
--default-character-set=utf8mb4when restoringmysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
- Unify the database character set
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. “MySQL Server Has Gone Away” ระหว่างการเรียกคืน
✅ Error Message
ERROR 2006 (HY000): MySQL server has gone away
✅ Cause
- ไฟล์สำรองมีขนาดใหญ่เกินไป
max_allowed_packetมีขนาดเล็กเกินไป- MySQL เกิดข้อผิดพลาดเนื่องจากหน่วยความจำไม่เพียงพอ
✅ Solution
- Increase
max_allowed_packetSET GLOBAL max_allowed_packet=256M;
- Adjust
innodb_buffer_pool_size[mysqld] innodb_buffer_pool_size=2G
- Compress the backup before restoring
mysqldump -u username -p database_name | gzip > backup.sql.gz gunzip < backup.sql.gz | mysql -u username -p database_name
- Split the SQL file
split -b 500M backup.sql backup_part_
Restore split files sequentially:
cat backup_part_* | mysql -u username -p database_name
การจัดการไฟล์สำรองขนาดใหญ่
1. Split the SQL File Before Restoring
If the data to restore is too large, splitting the file into smaller chunks increases the success rate.
split -b 500M backup.sql backup_part_
Restore the split files sequentially:
cat backup_part_* | mysql -u username -p database_name
2. Use the --single-transaction Option with mysqldump
This option performs the dump within a single transaction, reducing locking and lowering load when restoring large datasets.
mysqldump --single-transaction -u username -p database_name > backup.sql
3. Temporarily Disable innodb_flush_log_at_trx_commit
Reducing transaction log write frequency during large restores can significantly improve restore speed.
After the restore, do not forget to revert to the original setting (default: 1).
SET GLOBAL innodb_flush_log_at_trx_commit=0;
SET GLOBAL innodb_flush_log_at_trx_commit=1;
ตรวจสอบไฟล์บันทึกเพื่อสืบค้นปัญหาการเรียกคืน
1. Review MySQL Error Logs
If the restore fails, reviewing the MySQL error log helps identify the root cause.
sudo cat /var/log/mysql/error.log
2. Use SHOW WARNINGS; to Display Detailed Messages
SHOW WARNINGS;
คำเตือนทั่วไป
| Message | Cause | Solution |
|---|---|---|
Duplicate entry | Primary key duplication | Use INSERT IGNORE |
Table already exists | The table already exists | Run DROP TABLE IF EXISTS before restore |
Data truncated for column | String exceeds column limit | Increase VARCHAR size |
7. คำถามที่พบบ่อย (FAQ)
Q1: ควรทำอย่างไรหากเห็น “Unknown database” ระหว่างการเรียกคืน?
✅ Error Message
ERROR 1049 (42000): Unknown database 'database_name'
✅ Cause
- ไฟล์สำรองไม่มีคำสั่ง
CREATE DATABASE - ฐานข้อมูลที่ระบุไม่มีอยู่ในขณะทำการเรียกคืน
✅ Solution
- Create the database manually
mysql -u username -p -e "CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
- Run the restore again
mysql -u username -p database_name < backup.sql
Q2: จะแก้ไขอักขระเสียหายหลังการเรียกคืนอย่างไร?
✅ Error Message
ERROR 1366 (HY000): Incorrect string value
✅ Cause
- ความไม่ตรงกันของชุดอักขระระหว่างการสำรองและการเรียกคืน
- ชุดอักขระเริ่มต้นของฐานข้อมูลไม่เหมาะสม
✅ Solution
- Check backup file encoding
file backup.sql
- ระบุ
--default-character-set=utf8mb4ระหว่างการกู้คืนmysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
- ทำให้ชุดอักขระของฐานข้อมูลเป็นแบบเดียวกัน
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Q3: ฉันจะกู้คืนไฟล์ SQL ขนาดใหญ่ (1GB หรือมากกว่า) อย่างไร?
✅ ปัญหา
- การกู้คืนใช้เวลานาน
ERROR 2006 (HY000): MySQL server has gone away
✅ วิธีแก้
- เพิ่ม
max_allowed_packetSET GLOBAL max_allowed_packet=256M;
- ปรับ
innodb_buffer_pool_size[mysqld] innodb_buffer_pool_size=2G
- บีบอัดสำเนาสำรองก่อนการกู้คืน
mysqldump -u username -p database_name | gzip > backup.sql.gz gunzip < backup.sql.gz | mysql -u username -p database_name
- แยกไฟล์ SQL
split -b 500M backup.sql backup_part_
กู้คืนตามลำดับ:
cat backup_part_* | mysql -u username -p database_name
Q4: ฉันจะกู้คืนใน AWS RDS (สภาพแวดล้อมคลาวด์) อย่างไร?
✅ ขั้นตอน
- สร้างสำเนาสำรองในเครื่อง
mysqldump -u username -p --databases database_name > backup.sql
- โอนไฟล์สำเนาสำรองไปยังอินสแตนซ์ AWS RDS
scp backup.sql username@server_ip:/path/to/backup/
- เชื่อมต่อกับ AWS RDS และกู้คืน
mysql -h rds_endpoint -u username -p database_name < backup.sql
✅ สำคัญ
- เนื่องจาก AWS RDS ไม่ได้ให้สิทธิ์
SUPERจึงต้องระบุ--set-gtid-purged=OFFเมื่อสร้างสำเนาสำรอง.mysqldump -u username -p --set-gtid-purged=OFF --databases database_name > backup.sql
Q5: ฉันจะทดสอบสำเนาสำรองและการกู้คืนโดยอัตโนมัติได้อย่างไร?
✅ วิธีแก้
ใช้งาน cron ของ Linux เพื่อทำการสำเนาสำรองและทดสอบการกู้คืนแบบอัตโนมัติทุกวัน.
1. สคริปต์สำเนาสำรองอัตโนมัติ
#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +"%Y%m%d")
DB_NAME="your_database"
USER="your_user"
PASSWORD="your_password"
# Create backup
mysqldump -u $USER -p$PASSWORD $DB_NAME > $BACKUP_DIR/backup_$DATE.sql
# Delete backups older than 30 days
find $BACKUP_DIR -type f -name "backup_*.sql" -mtime +30 -exec rm {} \;
2. สคริปต์ทดสอบการกู้คืนอัตโนมัติ
#!/bin/bash
DB_NAME="restore_test"
USER="your_user"
PASSWORD="your_password"
BACKUP_FILE="/var/backups/mysql/backup_latest.sql"
# Create test database
mysql -u $USER -p$PASSWORD -e "DROP DATABASE IF EXISTS $DB_NAME; CREATE DATABASE $DB_NAME;"
# Execute restore
mysql -u $USER -p$PASSWORD $DB_NAME < $BACKUP_FILE
3. เพิ่มลงในงาน Cron
crontab -e
เพิ่มบรรทัดต่อไปนี้ (สำเนาสำรองเวลา 03:00 น., ทดสอบการกู้คืนเวลา 04:00 น. ทุกวัน):
0 3 * * * /path/to/backup_script.sh
0 4 * * * /path/to/restore_test_script.sh
✅ จุดตรวจสอบ
- ทำการสำเนาสำรองและทดสอบการกู้คืนอัตโนมัติเป็นประจำ
- ตรวจสอบความสมบูรณ์ของไฟล์สำเนาสำรองอย่างต่อเนื่อง
8. สรุป
ทบทวนขั้นตอนการกู้คืน MySQL พื้นฐาน
✅ การเตรียมก่อนการกู้คืน
- ทำความเข้าใจประเภทของสำเนาสำรอง (
mysqldump,phpMyAdmin, binary logs, เป็นต้น) - ตรวจสอบการมีอยู่ของฐานข้อมูลและชุดอักขระก่อนการกู้คืน
- เลือกวิธีการกู้คืนที่เหมาะสม
✅ วิธีการกู้คืน MySQL
| Method | Difficulty | Pros | Cons |
|---|---|---|---|
mysqldump | Intermediate | Fast and versatile | Requires command-line operations |
phpMyAdmin | Beginner | Easy GUI operation | Not suitable for large datasets |
Workbench | Beginner | Simple UI workflow | High server load |
| Binary log | Advanced | Point-in-time recovery possible | Complex configuration |
✅ การตรวจสอบหลังการกู้คืน
- ใช้
SHOW DATABASES;เพื่อยืนยันว่าฐานข้อมูลถูกสร้าง - ใช้
SHOW TABLES;เพื่อยืนยันว่าตารางถูกกู้คืน - ใช้
SELECT COUNT(*)เพื่อตรวจสอบจำนวนแถว - ใช้
SHOW WARNINGS;เพื่อตรวจสอบคำเตือนการกู้คืน
✅ การปรับประสิทธิภาพสำหรับการกู้คืนชุดข้อมูลขนาดใหญ่
- ปรับ
max_allowed_packetและinnodb_buffer_pool_size - แยกไฟล์สำเนาสำรองก่อนการกู้คืน (
split -b 500M backup.sql backup_part_) - ใช้
DISABLE KEYSเพื่อปรับประสิทธิภาพการสร้างดัชนีใหม่
✅ การแก้ไขปัญหาระหว่างการกู้คืน
- “ฐานข้อมูลไม่รู้จัก” → เรียกใช้
CREATE DATABASE - “อักขระผิดรูปแบบ” → ระบุ
--default-character-set=utf8mb4 - “การกู้คืนหยุดกลางทาง” → เพิ่ม
max_allowed_packet - “การกู้คืนข้อมูลขนาดใหญ่” → แยกไฟล์หรือใช้
--single-transaction - “การกู้คืน AWS RDS” → ใช้
--set-gtid-purged=OFF - ตรวจสอบบันทึก → ใช้
SHOW WARNINGS;
แนวทางปฏิบัติที่ดีที่สุดสำหรับการสำรองและกู้คืนข้อมูล
การจัดการการสำรองและการกู้คืนอย่างเหมาะสมช่วยลดความเสี่ยงของการสูญเสียข้อมูลลง
โดยการทำ การสำรองและการทดสอบการกู้คืนเป็นประจำ, คุณสามารถกู้คืนข้อมูลได้อย่างราบรื่นในกรณีที่ระบบล้มเหลวจริง
1. กำหนดการสำรองข้อมูลเป็นประจำ
- กำหนดการสำรองข้อมูลรายวันหรือรายสัปดาห์
- รวมการสำรองข้อมูลเต็มกับการสำรองข้อมูลเพิ่ม
- เก็บสำรองข้อมูลไว้ในเครื่องและระยะไกล
- Local:
/var/backups/mysql/ - ที่เก็บข้อมูลบนคลาวด์ (S3, Google Drive, FTP)
2. ทำสคริปต์การสำรองอัตโนมัติ
การทำสำรองอัตโนมัติช่วยลดข้อผิดพลาดของมนุษย์และป้องกันการพลาดการสำรอง
#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +"%Y%m%d")
DB_NAME="your_database"
USER="your_user"
PASSWORD="your_password"
# Create backup
mysqldump -u $USER -p$PASSWORD $DB_NAME > $BACKUP_DIR/backup_$DATE.sql
# Delete backups older than 30 days
find $BACKUP_DIR -type f -name "backup_*.sql" -mtime +30 -exec rm {} \;
3. การทดสอบการกู้คืนอัตโนมัติ
เป็นสิ่งสำคัญที่ต้องทดสอบเป็นประจำว่าการสำรองข้อมูลสามารถกู้คืนได้จริงหรือไม่.
#!/bin/bash
DB_NAME="restore_test"
USER="your_user"
PASSWORD="your_password"
BACKUP_FILE="/var/backups/mysql/backup_latest.sql"
# Create test database
mysql -u $USER -p$PASSWORD -e "DROP DATABASE IF EXISTS $DB_NAME; CREATE DATABASE $DB_NAME;"
# Execute restore
mysql -u $USER -p$PASSWORD $DB_NAME < $BACKUP_FILE
4. การเฝ้าติดตามและการแจ้งเตือน
- รับการแจ้งเตือนหากการสำรองล้มเหลว
- ตั้งค่า
MAILTOในcron - ใช้การแจ้งเตือนผ่าน
SlackหรืออีเมลMAILTO="your_email@example.com" 0 3 * * * /path/to/backup_script.sh
การรับประกันการกู้คืน MySQL ที่สำเร็จ
กระบวนการสำรองและกู้คืนเป็นส่วนสำคัญของการปกป้องข้อมูล.
โดยเฉพาะในการดำเนินธุรกิจและสภาพแวดล้อมการพัฒนา, การสำรองและการทดสอบการกู้คืนเป็นประจำเป็นสิ่งจำเป็น.
ใช้ขั้นตอนที่แนะนำในบทความนี้เพื่อ ปรับปรุงการสำรองและการกู้คืน MySQL ของคุณ.
🔹 รายการตรวจสอบความสำเร็จการกู้คืน MySQL
☑ ทำการสำรองข้อมูลเป็นประจำหรือไม่?
☑ คุณได้ตรวจสอบเนื้อหาของไฟล์สำรองล่วงหน้าหรือยัง?
☑ คุณทำการตรวจสอบความสมบูรณ์หลังการกู้คืนหรือไม่?
☑ การตั้งค่าการกู้คืนชุดข้อมูลขนาดใหญ่ถูกกำหนดอย่างเหมาะสมหรือไม่?
☑ คุณมีขั้นตอนการแก้ไขปัญหาเตรียมไว้หรือไม่?
☑ คุณได้ทำกระบวนการสำรองและกู้คืนเป็นอัตโนมัติหรือยัง?
ขั้นตอนต่อไป
จากบทความนี้, ทดสอบกระบวนการกู้คืน MySQL ของคุณและยืนยันการกู้คืนที่สำเร็จ.
นอกจากนี้, บันทึกขั้นตอนการกู้คืนของคุณ และแชร์กับทีมของคุณ.
ปรับปรุงกระบวนการสำรองและกู้คืนของคุณอย่างต่อเนื่องเพื่อปกป้องข้อมูลของคุณ! 🚀


