วิธีการกู้คืนฐานข้อมูล MySQL (คู่มือครบถ้วน: mysqldump, เครื่องมือ GUI, และบันทึกไบนารี)

目次

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 ได้

  1. เข้าสู่ระบบ phpMyAdmin
  2. เลือกแท็บ “Export”
  3. ตั้งค่ารูปแบบเป็น “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.

MethodDifficultyProsCons
mysqldumpIntermediateFast and highly reliableRequires manual commands
phpMyAdminBeginnerEasy to operate via GUINot suitable for large datasets
WorkbenchBeginnerSimple UI workflowCan put high load on the server
Binary logAdvancedPoint-in-time recovery possibleComplex configuration

3. ขั้นตอนการกู้คืนฐานข้อมูล MySQL

การกู้คืนฐานข้อมูลเดียว

วิธีการกู้คืนสำรองข้อมูล mysqldump

วิธีการกู้คืนที่พบบ่อยที่สุดคือการกู้คืนข้อมูลสำรองที่สร้างด้วย mysqldump.

ขั้นตอน:

  1. ตรวจสอบว่าไฟล์สำรองข้อมูลถูกต้อง
    head -n 20 backup.sql
    

→ ตรวจสอบส่วนเริ่มต้นของไฟล์สำรองและยืนยันว่าไม่มีข้อผิดพลาด.

  1. สร้างฐานข้อมูลเป้าหมาย (หากยังไม่มี)
    mysql -u username -p -e "CREATE DATABASE IF NOT EXISTS database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
  1. กู้คืนข้อมูล
    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

  1. เข้าสู่ระบบ phpMyAdmin
  2. เลือกแท็บ “Import”
  3. เลือกและอัปโหลดไฟล์สำรอง (SQL)
  4. คลิก “Go” เพื่อเริ่มการกู้คืน

ข้อดี:

  • ใช้งานง่ายสำหรับ ผู้เริ่มต้น
  • คุณสามารถกู้คืนโดยไม่ต้องใช้เครื่องมือบรรทัดคำสั่ง

⚠️ ข้อเสีย:

  • ขนาดไฟล์จำกัด อาจมีผล
  • ไม่เหมาะสำหรับข้อมูลขนาดใหญ่

การกู้คืนโดยใช้ MySQL Workbench

  1. เปิด MySQL Workbench
  2. เลือก “Server > Data Import”
  3. เลือกไฟล์สำรอง
  4. ระบุฐานข้อมูลเป้าหมาย
  5. คลิก “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. วิธีการใช้

  1. แก้ไขไฟล์สำรองและเพิ่มบรรทัดต่อไปนี้:
    ALTER TABLE table_name DISABLE KEYS;
    
  1. รันกระบวนการกู้คืน
    mysql -u username -p database_name < backup.sql
    
  1. หลังจากการกู้คืนเสร็จสิ้น ให้เปิดใช้งานดัชนีอีกครั้ง:
    ALTER TABLE table_name ENABLE KEYS;
    

จุดตรวจสอบ

  • การใช้ DISABLE KEYS จะช่วยเพิ่มความเร็วในการกู้คืนอย่างมากสำหรับการแทรกข้อมูลขนาดใหญ่.
  • อย่าลืมรัน ENABLE KEYS หลังการกู้คืน.

6. การแก้ไขปัญหาการกู้คืน MySQL

ข้อความแสดงข้อผิดพลาดทั่วไปและวิธีแก้

1. ข้อผิดพลาด “Unknown Database”

ข้อความแสดงข้อผิดพลาด

ERROR 1049 (42000): Unknown database 'database_name'

สาเหตุ

  • ฐานข้อมูลเป้าหมายไม่ได้ถูกสร้างก่อนทำการกู้คืน.

วิธีแก้

  1. สร้างฐานข้อมูลด้วยตนเอง
    mysql -u username -p -e "CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
  1. 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

  1. Check the encoding of the backup file
    file backup.sql
    
  1. Specify --default-character-set=utf8mb4 when restoring
    mysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
    
  1. 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

  1. Increase max_allowed_packet
    SET GLOBAL max_allowed_packet=256M;
    
  1. Adjust innodb_buffer_pool_size
    [mysqld]
    innodb_buffer_pool_size=2G
    
  1. 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
    
  1. 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;

คำเตือนทั่วไป

MessageCauseSolution
Duplicate entryPrimary key duplicationUse INSERT IGNORE
Table already existsThe table already existsRun DROP TABLE IF EXISTS before restore
Data truncated for columnString exceeds column limitIncrease VARCHAR size

7. คำถามที่พบบ่อย (FAQ)

Q1: ควรทำอย่างไรหากเห็น “Unknown database” ระหว่างการเรียกคืน?

Error Message

ERROR 1049 (42000): Unknown database 'database_name'

Cause

  • ไฟล์สำรองไม่มีคำสั่ง CREATE DATABASE
  • ฐานข้อมูลที่ระบุไม่มีอยู่ในขณะทำการเรียกคืน

Solution

  1. Create the database manually
    mysql -u username -p -e "CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
    
  1. Run the restore again
    mysql -u username -p database_name < backup.sql
    

Q2: จะแก้ไขอักขระเสียหายหลังการเรียกคืนอย่างไร?

Error Message

ERROR 1366 (HY000): Incorrect string value

Cause

  • ความไม่ตรงกันของชุดอักขระระหว่างการสำรองและการเรียกคืน
  • ชุดอักขระเริ่มต้นของฐานข้อมูลไม่เหมาะสม

Solution

  1. Check backup file encoding
    file backup.sql
    
  1. ระบุ --default-character-set=utf8mb4 ระหว่างการกู้คืน
    mysql -u username -p --default-character-set=utf8mb4 database_name < backup.sql
    
  1. ทำให้ชุดอักขระของฐานข้อมูลเป็นแบบเดียวกัน
    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

วิธีแก้

  1. เพิ่ม max_allowed_packet
    SET GLOBAL max_allowed_packet=256M;
    
  1. ปรับ innodb_buffer_pool_size
    [mysqld]
    innodb_buffer_pool_size=2G
    
  1. บีบอัดสำเนาสำรองก่อนการกู้คืน
    mysqldump -u username -p database_name | gzip > backup.sql.gz
    gunzip < backup.sql.gz | mysql -u username -p database_name
    
  1. แยกไฟล์ SQL
    split -b 500M backup.sql backup_part_
    

กู้คืนตามลำดับ:

cat backup_part_* | mysql -u username -p database_name

Q4: ฉันจะกู้คืนใน AWS RDS (สภาพแวดล้อมคลาวด์) อย่างไร?

ขั้นตอน

  1. สร้างสำเนาสำรองในเครื่อง
    mysqldump -u username -p --databases database_name > backup.sql
    
  1. โอนไฟล์สำเนาสำรองไปยังอินสแตนซ์ AWS RDS
    scp backup.sql username@server_ip:/path/to/backup/
    
  1. เชื่อมต่อกับ 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

MethodDifficultyProsCons
mysqldumpIntermediateFast and versatileRequires command-line operations
phpMyAdminBeginnerEasy GUI operationNot suitable for large datasets
WorkbenchBeginnerSimple UI workflowHigh server load
Binary logAdvancedPoint-in-time recovery possibleComplex 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 ของคุณและยืนยันการกู้คืนที่สำเร็จ.
นอกจากนี้, บันทึกขั้นตอนการกู้คืนของคุณ และแชร์กับทีมของคุณ.

ปรับปรุงกระบวนการสำรองและกู้คืนของคุณอย่างต่อเนื่องเพื่อปกป้องข้อมูลของคุณ! 🚀