Upgrade WordPress จาก MySQL 5.7 ไปเป็น 8.0 ใน docker

เสือกอุตริไปนั่งอัพเกรด image ใน docker เพราะอยากจะทำให้มันเป็นของใหม่ ๆ ก็ไปเจอ docker compose ของเว็บนี้แหละ มันใช้ mysql 5.7 อยู่ เลยไปค้น ๆ ดู ตอนนี้ mysql มันออก 8.0 แล้ว และไอ้ 5.7 เนี่ย มันหลายปีก่อนมากแล้ว เลยคิดว่า เออ อัพเกรดแม่งเลยละกัน

เริ่มต้นจากอัพเกรดแม่งดื้อ ๆ เลย แก้ tag จาก 5.7 ไปเป็น 8.0.14 ซึ่งเป็นเวอร์ชั่นล่าสุดตอนนี้ แล้วก็สั่ง build เลย … ทำจนทุก container ขึ้น ok หมดก็นึกได้ว่า สัส!! ไม่ได้ backup อะไรไว้เลย

เริ่มเลย

สิ่งที่ทำอย่างแรกเลย คือเข้าไปดูหน้าเว็บก่อน ยังใช้ได้หรือเปล่า ปรากฏว่า เออ เข้าเว็บได้ ดึงข้อมูลมาแสดงได้เหมือนปกติ เลยไม่ได้อะไรมาก จนจะมาเข้าไปที่หน้า admin ก็เจอปัญหาว่า login ไม่ได้ … เอ๊ะ! ทำไมนะ รหัสผ่านก็ใส่ถูกนี่นา ลองหลายรอบก็ไม่สำเร็จ เลยใช้แผนสำรองต่อไป จิ้ม Forget password แม่งเลย แล้วก็ใส่ user เพื่อให้มันทำเรื่อง recover ให้ มันบอกว่ามันไม่สามารถอัพเดท database ได้ นั่นไงล่ะ ปัญหามาให้แก้แล้ว

กลับตัวก็ไม่ได้ ให้เดินต่อไปก็ไปไม่ถึง

วิธีแก้ที่ทำไปคือ downgrade mysql กลับไป 5.7 ก่อน ก็เจอว่า มึงมา 8 แล้ว การจะกลับไป 5.7 มันไม่ใช่เรื่องง่าย ๆ นะ ใช่ครับ แม่งกลับไปไม่ได้ database มันบอกว่า database file เจ๊ง อะไรสักอย่าง ไม่ได้แคปหน้าจอมา และใช่ครับ ถ้าย้อนกลับไปตอนต้น จะเห็นได้ว่า ไม่ได้ backup database ไว้ด้วย ไปต่อสิครับ

ถอยไม่ได้แล้ว

กลับมาที่ mysql 8 ต่อ ตัดสินใจลองใช้ cli เข้าไป export database ออกมาทั้งหมด ด้วย mysqldump แล้วกะว่าจะระเบิด database ทิ้งเลย แล้ว import เข้าไปใหม่ น่าจะช่วยได้ ปรากฏว่าตอนพยายาม access เข้าไปด้วย user root ก็เจอ error หน้าตาแบบนี้

Mysql Error:The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist’ when trying to dump tablespaces

Clue ใหม่

นั่นไง ไปกันใหญ่แล้ว มันคืออะไรวะ google โลด ก็เจอว่าตัว database structure ข้างในมันไม่ได้ compat กัน จัดการโดย upgrade มันซะ ด้วยวิธีนี้

# shell เข้าไปที่ mysql ก่อน
mysql -uroot -p
# ใส่ password ที่ตั้งไว้ซะ
# ถึงตรงนี้ ควรจะเข้าไปที่ mysql shell ได้แล้ว เซ็ตค่า config มันก่อนไปต่อ
mysql> SET GLOBAL innodb_fast_shutdown = 1;
# ออกจาก shell ของ mysql
mysql> quit
# เสร็จแล้วสั่ง upgrade โลด
mysql_upgrade -uroot -p

เสร็จแล้วรอสักแป๊บ จนกว่ามันจะบอกว่าอัพเกรดเรียบร้อยแล้ว ก็จะเห็นว่า สามารถใช้ mysqldump ได้แล้ว ไม่ติดปัญหาอะไร ทีนี้ลองกลับไปที่หน้า login ก็จะเห็นว่าสามารถ login ได้แล้วเช่นกัน แสดงว่าปัญหาน่าจะเกิดจาก database file เองที่มันไม่ได้ compatible กัน

แล้วไงต่อ

จริง ๆ จะเห็นได้ว่า ปัญหานี้ไม่ได้เกี่ยวอะไรเลยกับ wordpress แค่มันเกิดขึ้นเพราะตอนอยากจะ upgrade พวก dependencies ที่ wordpress ใช้อยู่เท่านั้น ดังนั้นหากใครมือลั่นอัพเกรด mysql แล้วเจอปัญหาเดียวกัน ก็ลองแก้ปัญหาด้วยวิธีนี้ได้นะ

ที่เหลือจากนี้ก็อย่าลืม backup database นะครับ รออะไร 🙂

อ้างอิง

  • https://stackoverflow.com/questions/49992868/mysql-errorthe-user-specified-as-a-definer-mysql-infoschemalocalhost-doe

Leave a Reply

Your email address will not be published. Required fields are marked *