ย้ายข้อมูล MariaDB 10 ไปใช้งาน MySQL 8

ย้ายข้อมูล MariaDB 10 ไปใช้งาน MySQL 8

บล็อกที่ท่านกำลังอ่านทำงานอยู่บน Ghost CMS ซึ่งก่อนหน้านี้ใช้งาน MariaDB ในการจัดเก็บข้อมูล แต่เนื่องด้วย Ghost 5+ (เวอร์ชั่นใหม่) แนะนำให้ไปใช้งาน MySQL 8

ของเดิมบล็อกรันด้วย docker compose โดยจะมี ghost + mariadb รันคู่กัน

version: "2.1"
services:
  ghost:
    image: ghost:latest
    container_name: ghost
    restart: unless-stopped
    ports:
      - 8081:2368
    environment:
      - database__client=mysql
      - database__connection__host=mariadb
      - database__connection__user=ghost
      - database__connection__password=ghost
      - database__connection__database=ghost
      - url=http://localhost:8081
    volumes:
      - /ghost:/var/lib/ghost/content
    links:
      - mariadb
     
  mariadb:
    image: mariadb:latest
    container_name: mariadb
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=ghost
      - MYSQL_DATABASE=ghost
      - MYSQL_USER=ghost
      - MYSQL_PASSWORD=ghost
    volumes:
      - /mariadb:/var/lib/mysql

เราทำการ backup database ของเก่าออกมาเป็นไฟล์ก่อน โดยใช้คำสั่ง

docker exec mariadb /usr/bin/mysqldump -u ghost --password=ghost ghost > backup.sql

ก็จะได้ไฟล์ backup.sql จากนั้นทำการสร้าง service mysql ต่อจาก docker compose เดิม

  mysql:
    image: mysql:latest
    container_name: mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=ghost
      - MYSQL_DATABASE=ghost
      - MYSQL_USER=ghost
      - MYSQL_PASSWORD=ghost
    volumes:
      - /mysql:/var/lib/mysql

จากนั้นทำการ restoreไฟล์ backup.sql ไปที่ docker mysql ด้วยคำสั่ง

cat backup.sql | docker exec -i mysql /usr/bin/mysql -u ghost --password=ghost ghost

ไม่ผ่านเจอ error message

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OCI runtime exec failed: exec failed: unable to start container process: exec: "' at line 1

ติดปัญหานี้อยู่พักนึง ลองหาวิธีแก้หลายๆวิธีก็ไม่ผ่าน งั้นลองวิธีแบบบ้านๆเลยแระกัน สร้าง service phpmyadmin ต่อจาก docker compose เดิม แล้วทำการ links: mariadb (database ตัวเก่า)

  phpmyadmin:
    image: phpmyadmin
    container_name: phpmyadmin
    ports:
      - 8080:80
    environment:
      PMA_HOST: mariadb
      MYSQL_ROOT_PASSWORD: ghost
      PMA_USER: ghost
      PMA_PASSWORD: ghost
    links:
      - mariadb

จากนั้นเปิด phpmyadmin ผ่านทางเว็บ แล้วทำการ export database ghost ออกมาเป็นไฟล์ ghost.sql (format: SQL)

ทำการแก้ไข docker compose ส่วนของ service phpmyadmin ให้เปลี่ยนจากเดิม

  • PMA_HOST: mariadb แก้เป็น PMA_HOST: mysql
  • links: mariadb แก้เป็น links: mysql

เปิด phpmyadmin อีกครั้ง แล้วทำการ import ไฟล์ ghost.sql

แก้ไข docker compose เพื่อจะรัน ghost + mysql อีกครั้ง

version: "2.1"
services:
  ghost:
    image: ghost:latest
    container_name: ghost
    restart: unless-stopped
    ports:
      - 8081:2368
    environment:
      - database__client=mysql
      - database__connection__host=mysql
      - database__connection__user=ghost
      - database__connection__password=ghost
      - database__connection__database=ghost
      - url=http://localhost:8081
    volumes:
      - /ghost:/var/lib/ghost/content
    links:
      - mysql
     
  mysql:
    image: mysql:latest
    container_name: mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=ghost
      - MYSQL_DATABASE=ghost
      - MYSQL_USER=ghost
      - MYSQL_PASSWORD=ghost
    volumes:
      - /root/ghost-mysql:/var/lib/mysql

ตอนนี้ตัว Ghost CMS ได้เปลี่ยนมาใช้งาน mysql8 เรียบร้อยแล้ว

How to Migrate From MariaDB 10 to MySQL 8
This how-to will guide you through the steps to migrate from MariaDB 10 to MySQL 8. Ghost 5+ requires MySQL 8, as it’s a breaking change, so upgrade now if you’re running MariaDB. I use an Ubuntu 20.04 LTS server hosted on Linode. However, the guide should work equally well on other platforms. Th…