วิธีแก้ปัญหาเมื่อตาราง InnoDB ไม่สามารถ alter, optimize, dump ได้เลย by heha

30
Jun
0

เนื่องจากช่วงนี้มีปัญหาโลกแตกที่ตาราง InnoDB อยู่ๆ ก็เกิด alter, optimize, dump ไมได้เลยซักกะอย่าง มันจะบอกว่า “MySQL server has gone away” หรือ “Error 2013: Lost connection to MySQL server during query when …” ซึ่งช่างเป็น error ที่สื่อความหมายได้ดีเยี่ยมเสียจริง! ไปดูใน log error ก็ฟ้องว่า thread MySQL ตายกลางทาง กรุณา submit bug ไปให้ MySQL เอ่อ… พอสั่ง Check table มันก็บอกว่าปกติดี เอะยังไง! สุดท้ายเนื่องจากจนปัญญาจึงต้องมานั่ง query ทีละ rowๆ ออกมาใส่ตารางใหม่ที่โครงสร้างเหมือนเดิม ซึ่งได้ผลดังนี้

1. ตารางที่ query มันใหญ่มาก! ไม่สามารถสั่ง INSERT INTO user2 (SELECT * FROM user) ได้ตรงๆ เลยแบบง่ายๆ

2. ลองสั่ง INSERT INTO user2 (SELECT * FROM user LIMIT 0,1000) ไรทำนองนี้ก็ไม่ให้อีก! มันฟ้องว่า subquery ไม่ support limit เวรจริงๆ ครับ 55

3. ลองใช้ php ช่วย คือสั่ง SELECT * FROM user WHERE user_id NOT IN (SELECT user_id FROM user2) LIMIT 0,1000 แล้วค่อยเอา user_id ที่ได้มา query ต่อเป็น “INSERT INTO user2 (SELECT * FROM user WHERE user_id IN(”.implode(’,', $a_user_id).”))” ก็ยังไม่ได้เพราะแต่ละ row มันใหญ่มาก กว่าจะเสร็จก็ช้ามากๆ

4. สุดท้ายจึงได้เป็น SELECT user_id FROM user WHERE user_id NOT IN (SELECT user_id FROM user2) LIMIT 0,1000 แล้วต่อด้วย ”INSERT INTO user2 (SELECT * FROM user WHERE user_id IN(”.implode(’,', $a_user_id).”))” เหมือนเดิม ก็ใช้ได้ละครับ :)

5. รันไปซักพักพบ “MySQL Server has gone away” อีกแล้ว - -” จึงค่อยๆ ลด Limit มาเหลือ 1 ก็ยังพัง และค่อยๆ ลอง SELECT * FROM user WHERE id=1 ไปเรื่อยๆ โดยเปลี่ยน * เป็น field ในตารางที่มีทีละ field ปรากฏว่าก็เจอ field เจ้าปัญหาจนได้ เป็น Text field นี่เอง! ซึ่งเราไม่สามารถแม้กระทั่งสั่ง DELETE FROM user WHERE id=1 ช่างโหดร้ายยิ่ง!

6. ต่อมาจึงต้องใส่ offset เพื่อ skip row ที่มีปัญหาไป แล้วก็รันๆ ไปซักพักอีกก็เจออีก สรุปว่าข้อมูล user แสนคน เจอ row ที่มีปัญหาทั้งหมด 5 row มันไปทำอีท่าไหนถึงพังก็ไม่อาจทราบได้ และตอนนี้ก็สามารถกลับมาใช้งานได้ตามปกติซะที :)

อัพเดทฐานข้อมูล Mysql ผ่าน Command line by rainbow

30
Aug
0

ตอนทำงานกับฐานข้อมูลใหญ่ๆ และต้องการย้ายหรือคัดลอกฐานข้อมูลขนาดใหญ่แล้ว การ import/export ผ่าน phpmyadmin นั้นจะทำงานได้ช้า หรืออาจจะทำไม่ได้เลยก็เป็นได้ แต่ยังมีขั้นตอนการย้ายฐานข้อมูลผ่านทาง command line ได้ ซึ่งทั้งความเร็ว และการรองรับขนาดข้อมูลต่างสูงกว่าทั้งสิ้น

Backup MySQL Database method by heha

30
Jul
0

การ backup database แบ่งออกเป็นสองประเภทหลักๆ ได้แก่

  1. Physical Backup - เป็นการ backup ข้อมูลโดยการ copy โครงสร้างข้อมูลมาทั้ง directory และ file ทั้งหมดนั่นเอง การ backup แบบนี้มีข้อดีคือสามารถ recovery คืนกลับได้รวดเร็ว และการ backup ก็ใช้เวลาน้อยกว่า Logical เนื่องจากเป็นเพียงการ copy file ธรรมดาๆ แต่มีข้อเสียคือการย้ายฐานข้อมูลจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งซึ่งเป็นคนละ OS หรือเป็น mysql คนละเวอร์ชั่น จะไม่สามารถกระทำได้ โดยปกติมักใช้ mysqlhotcopy(MyISAM), ibbackup (InnoDB) เป็นเครื่องมือในการ backup
  2. Logical Backup - เป็นการ backup ข้อมูลโดย export ข้อมูลทั้งหมดมาเป็นคำสั่ง SQL โดยมีการ CREATE TABLE และข้อมูลทั้งหมดใหม่ มีข้อดีคือสามารถโยกย้ายไปยังเครื่องอีกเครื่องอีกเครื่องหนึ่งได้ง่าย import ได้เลยทันที ไม่ว่าจะเป็น OS คนละตัวหรือไม่ก็ตาม โดยปกติแล้วมักใช้ mysqldump เป็นเครื่องมือในการ backup

Update ค่าหลายๆแถว ที่มีค่าต่างๆกัน พร้อมๆกัน ใน MYSQL by plug.in

27
May
1

ปัญหา

ต้องการอัพเดต หลายๆแถวใน database ที่แต่ละแถวมีค่าต่างๆกันไป โดยใช้ Query เดียว

เพราะถ้าหากใช้แบบปกติ จะกินทรัพยากรสูงมากต่อการ update 1 ครั้ง

เปลี่ยนภาษไทยจาก Latin1 เป็น UTF-8 by rainbow

30
Apr
0

เคยไหมที่ไปเจอ Mysql database ที่จัดเก็บ collation เป็น latin1 แต่เราเขียนโปรแกรมพรอ้ม database ใหม่เป็น utf-8 ทั้งหมด ตอนแรก”คิดว่า”จะไม่ต้องไปเชื่อมต่อกับข้อมูลเก่าๆนี้แล้ว แต่บระเจ้า!!! ต้องเชื่อมต่อกับมันจนได้ ก็เลยเป็นเรื่องราวให้มาเขียนในวันนี้