How to copy folder MySQL InnoDB for backup

ถ้าใครไม่เจอกับตัว จะไม่รู้เลยว่า เหตุการณ์นี้มันทำให้เราอกสั่นขวัญกระเจิงขนาดไหน สืบเนื่องมาจาก กระทู้เก่าของผมที่ถามว่าไว้

เดิมทีเครื่องที่ผมใช้จะติดตั้ง XAMPP 1.8.1 ไว้ ทีนี้ผมต้องการทดสอบ PHP 5.5 เลยติดตั้งตัว XAMPP 1.8.3 มาใหม่ เมื่อผม copy ไฟล์ใน mysql/data ไว้แล้ว จากเดิมที่เคยเอาแค่ folder ฐานข้อมูลไปใส่ ก็ใช้งานได้แล้ว แต่ปัญหามันเกิดตรงนี้ครับ

มันมีบาง table เป็น MyISAM และบาง table ก็เป็น InnoDB ซึ้งตอนที่สร้างนั้นผมไม่ได้สังเกตุ เพิ่งจะมาเห็นก็ตอนมีปัญหานี่แหละ

แบบ MyISAM มันจะมีไฟล์ 3 ไฟล์ คือ .frm .MYD และ . MYI

ส่วน InnoDB มันมีแค่ .frm ไฟล์เดียวเท่านั้น

หลังจากผมคัดลอกใส่แล้ว ผลปรากฏว่า มันแจ้งว่า table doesn’t exist

ทำอะไรต่อไม่ได้เลยครับ

ทีนี้ผมเลยลองคัดลอกทั้ง folder data ไปใส่ในอีกเครื่องที่ใช้ XAMPP 1.8.1 ปรากฏว่าใช้งานได้ครับ เลยอยากทราบว่า

ผมจะคัดลอกไฟล์ขอ InnoDB ข้ามเครื่องได้อย่างไร (เผื่อกรณีที่ข้อมูลมากๆ แล้ว dump sql ไม่ไหว)ต้องคัดลอกอะไรไปบ้าง และมีขั้นตอนทีถูกต้องอย่างไรครับ

———-

ผมก็ไม่ได้คำตอบ…จนต้องลองมั่วๆ ดูเอง ในครั้งแรกพบว่า ถ้าเราใช้ Windows และติดตั้งพวก Vistual Server อาทิเช่น AppServ, XAMPP, LAMP, WAMP เป็นต้น พวกนี้มันจะสร้าง folder ของ package MySQL เอาไว้ใน path แบบเดียวกัน คือ

xxx/mysql/data

ใส่ data เราก็จะพบว่ามันมี folder เยอะแยะเลย ตามชื่อ Database ที่เราสร้าง ซึ่งเดิมทีถ้าเราใช้ ตารางประเภท MyIsam มันจะมีไฟล์ 3 ประเภทด้วยกัน คือ .frm .MYD และ .MYI

แต่เมื่อเราเปลี่ยนประเภทตารางมาใช้แบบ InnoDB มันจะเหลือเพียง 2 ไฟล์เท่านั้นคือ .frm และ .ibd นี่แหละคือปัญหาครับ

เดิมทีเวลาที่ผม upgrade version ของ Vistual Web Server ผมก็จะมักง่ายโดยการ copy folder ไว้ทั้งก้อนเลย แล้วพอติดตั้งตัวใหม่เสร็จ ก็โยนเข้ามาใส่ หรือ อัพเดททับของเดิมไปเลย ซึ่งหากถ้าเราใช้แบบ MyISAM ก็คงไม่เป็นอะไร ตารางมันเคยอยู่ยังไง ก็จะอยู่แบบนั้น

แต่เจ้า InnoDB นี่ มันมากกว่านั้ครับ เราต้อง copy มาทั้งหมด ทั้งหมดในที่นี้คือ “เอาสารบัญมันมาด้วย”

ไฟล์ที่จะชี้เป็นชี้ตายคือ ibdata1 ครับ ถ้าเราจะมักง่าย copy ข้อมูลแบบนี้อยู่ ห้ามลบเด็ดขาด ซึ่งมันก็จะโตขึ้นเรื่อยๆ ตาม index ที่มันเก็บสะสมไว้

ซึ่งโดยส่วนมากผมจะ copy มาทั้งหมดครับ ทั้ง ibdata1 , ib_logfile… เพื่อให้มันต่อเนื่องจากเดิม