Restore MySQL DB ด้วย Binlog file
สวัสดีครับ วันนี้พลาดครับ เรื่องของเรื่องคือผมจะกลับมาเขียน blog เลยมาเช็ต blog ที่ผมรันไว้ ซึ่งผมรัน Ghost CMS blog บน docker แต่ดั๊นใช้ tag <:latest> ซึ่งใน compose file มีทั้ง ghost และ mysql ด้วยความที่รันไว้นานแล้ว และไม่ได้บันทึกอะไรไว้ มาถึงผมก็จัดแจง restart .... ไม่ขึ้นครับ
สวัสดีครับ วันนี้พลาดครับ เรื่องของเรื่องคือผมจะกลับมาเขียน blog เลยมาเช็ต blog ที่ผมรันไว้ ซึ่งผมรัน Ghost CMS blog บน docker แต่ดั๊นใช้ tag <:latest> ซึ่งใน compose file มีทั้ง ghost และ mysql ด้วยความที่รันไว้นานแล้ว และไม่ได้บันทึกอะไรไว้ มาถึงผมก็จัดแจง restart .... ไม่ขึ้นครับ container ผมรันไม่ขึ้น แต่ผมนี่ขึ้นเลย เลยลองเช็ค log
docker logs Ghostก็ปรากฎว่ามันตายเพราะไม่สามารถ connect เข้ากับ DB ได้. ไม่รอช้าผมเช็ค db's log ต่อ
docker logs Ghost-DBปรากฎว่าจาก mysql 5 มันรันอยู่ที่ version 8 😱แถม version ของ ghost ก็เปลี่ยนด้วย แก้ไปแก้มาอยู่สักพักก็ไม่ได้ซึ่งการกู้คืน db ใน container เป็นอะไรที่ยากมาก(สำหรับผม) เลยมองไปที่การกู้คืน db ซึ่งในมือที่ผมมีตอนนี้คือ binlog และ .ibd file ซึ่งโชคดีมาก ผมเคยอ่าน blog ของพี่ Kemakorn Sudchukiat เลยทำการ backup DB directory เพื่อความชัวร์
mysqlbinlog
งั้นเราจะใช้ mysqlbinlog ในการกู้คืนกัน
แต่ก่อนอื่น binlog คืออะไร?
binlog file เป็นไฟล์สำหรับใช้เก็บร่องรอยการบันทึก (log) ของตัว database และเพื่อใช้ในการ replicate ไปยัง database ตัวลูกข่ายอื่นๆ (master to slave) ซึ่งจะสำรองเป็น version ไปเรื่อยๆ (mysql-bin.000001, mysql-bin.000002, mysql-bin.000003 …..) ครับ
ซึ่งผมไม่เคยลบเลย

วิธีการก็ง่าย โดยการใช้คำสั่ง mysqlbinlog เพื่อถอดให้เป็น sql file
mysqlbinlog /tmp/db/binlog.000001 > restore_bin/allbinlog.sqlกรณีที่มีหลายไฟล์ ก็ใช้ (ความต่างคือ > และ >> ครับ)
mysqlbinlog /tmp/db/binlog.000002 >> restore_bin/allbinlog.sql
mysqlbinlog /tmp/db/binlog.000003 >> restore_bin/allbinlog.sql
mysqlbinlog /tmp/db/binlog.000004 >> restore_bin/allbinlog.sqlเมื่อได้ไฟล์ sql มาแล้ว ผมก็ deploy mysql server ขึ้นมาใหม่ แล้วทำการสร้าง db จากนั้น restore

จากนั้นแก้ config ใน compose file แล้ว spin it up!
และในที่สุด blog ผมก็กลับมาแล้ว 🎉
บทเรียนที่ได้คือ
- Don't use docker latest tag in production
- Always backup (จริงๆก็ทำตลอด แต่อันนี้มันเก่ามาก ไม่เคยทำเลย เพราะฉะนั้นข้อนี้น่าจะ Always check backup 😂)
Ref:
