Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีเปลี่ยน MySQL Data Directory ไปยังตำแหน่งใหม่บน Ubuntu 16.04

สถานการณ์ที่ต้องย้าย Data Directory

  • Disk เต็ม ต้องย้ายไป Volume ใหญ่กว่า
  • Security: แยก Data ออกจาก Root Partition
  • Performance: ใช้ Disk/SSD เร็วกว่าเฉพาะสำหรับ Database

ข้อกำหนดก่อนเริ่ม

  • Ubuntu + User สามารถ sudo
  • MySQL ติดตั้งและทำงานปกติ
  • Volume/Location ใหม่พร้อมใช้งาน (ตัวอย่าง: /mnt/data_vol/mysql)

ขั้นตอนการย้าย

1. หา Data Directory ปัจจุบัน

$ mysql -u root -p
mysql> SELECT @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+

2. หยุด MySQL Service

$ sudo systemctl stop mysql
$ sudo systemctl status mysql  # ต้องเป็น inactive (dead)

3. คัดลอกข้อมูลไป Location ใหม่ (rsync)

$ sudo rsync -av /var/lib/mysql /mnt/data_vol/
# -a: archive (preserve permissions, ownership, timestamps)
# -v: verbose

4. Backup ไดเรกทอรีเก่า (Rename)

$ sudo mv /var/lib/mysql /var/lib/mysql_backup

5. แก้ไข Config MySQL (mysqld.cnf)

$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
# หาบรรทัด datadir แก้เป็น:
datadir = /mnt/data_vol/mysql/

6. แก้ไข AppArmor Alias (Ubuntu Security)

$ sudo vi /etc/apparmor.d/tunables/alias
# เพิ่มบรรทัดท้ายไฟล์:
alias /var/lib/mysql/ -> /mnt/data_vol/mysql/
$ sudo systemctl restart apparmor

7. สร้าง Directory Stub (สำหรับ Scripts ที่ Hardcode Path)

$ sudo mkdir -p /var/lib/mysql/mysql

8. เริ่ม MySQL และตรวจสอบ

$ sudo systemctl start mysql
$ sudo systemctl status mysql  # ต้องเป็น active (running)
$ mysql -u root -p -e "SELECT @@datadir;"
+----------------------+
| @@datadir            |
+----------------------+
| /mnt/data_vol/mysql/ |
+----------------------+

9. ลบ Backup เก่า (หลังยืนยันทำงานปกติ)

$ sudo rm -rf /var/lib/mysql_backup

ข้อควรระวัง

  • SELinux (RHEL/CentOS): ต้องตั้ง Context: semanage fcontext -a -t mysqld_db_t "/mnt/data_vol/mysql(/.*)?" + restorecon -Rv /mnt/data_vol/mysql
  • Permissions: Owner:Group ต้องเป็น mysql:mysql (rsync -a รักษาไว้)
  • InnoDB Log Files: ต้องคัดลอก ib_logfile* ด้วย (rsync -a ทำได้)
  • Test First: ทดสอบบน Non-Production ก่อน

สรุป

ย้าย MySQL Data Directory ได้ด้วย: Stop Service → Rsync → Update Config → Update AppArmor/SELinux → Restart → Verify → Cleanup