Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

คู่มือการแก้ไขปัญหา MySQL/MariaDB Slave Replication ไม่ทำงาน

🧩 ปัญหาเบื้องต้น

Slave ไม่สามารถเชื่อมต่อกับ Master ได้ และแสดงสถานะดังนี้:

  • Slave_IO_Running: Connecting หรือ No
  • ข้อผิดพลาด:
    • Access denied for user
    • SSL connection error
    • Fatal error: ...equal MariaDB server ids

1. แก้ปัญหา Access Denied (user replication ไม่ผ่าน)

🔍 สาเหตุ:

  • user สำหรับ replication (slave@<IP>) ไม่มีอยู่ หรือไม่มีสิทธิ์ REPLICATION SLAVE

🛠 วิธีแก้ (ทำบน Master):

CREATE USER 'slave'@'xx.xx.xx.xx' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'xx.xx.xx.xx';
FLUSH PRIVILEGES;

แก้ไข IP และรหัสผ่านให้ตรงกับที่ใช้ในเครื่อง Slave

ลบโดนบล๊อค FLUSH HOSTS;


2. ปิดการใช้ SSL (กรณี Master ไม่รองรับ SSL)

🔍 สาเหตุ:

  • Slave ตั้งให้ใช้ SSL (MASTER_SSL=1) แต่ Master ไม่เปิด SSL

🛠 วิธีแก้ (ทำบน Slave):

STOP SLAVE;

CHANGE MASTER TO
  MASTER_HOST='xx.xx.xx.xx',
  MASTER_USER='slave',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.000070',
  MASTER_LOG_POS=933399992,
  MASTER_SSL = 0;

START SLAVE;

หาก Master ไม่ได้ตั้งค่า SSL ต้องปิดที่ Slave ด้วย MASTER_SSL = 0


3. แก้ไข server-id ซ้ำ (Master และ Slave มีค่า server-id เท่ากัน)

🔍 สาเหตุ:

  • ทั้ง Master และ Slave มีค่า server-id เหมือนกัน ทำให้ Replication ไม่ทำงาน

🛠 วิธีแก้ (ทำบน Slave):

เปิดไฟล์ config:

แก้ไข sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

ตรวจสอบและแก้ไข:

แก้ไข[mysqld]
server-id = 2

ห้ามใช้ server-id ซ้ำกับ Master

บันทึกแล้วรีสตาร์ต MySQL:

bashคัดลอกแก้ไขsudo systemctl restart mysql

4. ตรวจสอบสถานะหลังแก้ไข

SHOW SLAVE STATUS 

ควรได้ผลลัพธ์:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: (มีค่า)
  • ไม่มีข้อความใน Last_IO_Error และ Last_SQL_Error

🧪 ทดสอบเชื่อมต่อจาก Slave

mysql -h xx.xx.xx.xx -u slave -p

🎯 สรุป Checklist

รายการตรวจสอบ
✅ Master เปิดพอร์ต 3306 และไม่ block IP✔️
✅ มี user 'slave'@'<slave_ip>' และมีสิทธิ์✔️
✅ ตั้ง MASTER_SSL=0 ถ้า Master ไม่รองรับ SSL✔️
✅ ตั้ง server-id ของ Slave ให้ไม่ซ้ำ Master✔️
✅ ใช้ SHOW SLAVE STATUS\G ตรวจสอบสถานะ✔️

ถ้าต้องการเวอร์ชัน PDF หรือ Markdown สำหรับแนบเป็นคู่มือบริษัท ผมสามารถจัดทำให้ได้เพิ่มเติมครับ 😊

คุณพูดว่า:

แล้วข้อมูลที่ปรับที่ master ก่อนหน้า จะถูกแก้ไขใน slave ไหม

ChatGPT พูดว่า:

คำตอบคือ: “แล้วแต่สถานการณ์ของการ Sync ณ เวลานั้น” — มาดูรายละเอียดเพื่อความเข้าใจที่ชัดเจนครับ:


🔄 ถาม: ข้อมูลที่มีอยู่ใน Master ก่อนหน้า

“จะถูกดึงมายัง Slave ภายหลังจากแก้ replication แล้วหรือไม่?”

คำตอบ:

ถ้า Replication ยังอยู่ในช่วงเริ่มต้น (ยังไม่มีข้อมูล sync):

  • ไม่ถูก sync ย้อนหลังอัตโนมัติ
  • Slave จะเริ่ม sync เฉพาะข้อมูล จากตำแหน่ง MASTER_LOG_POS ที่กำหนดใน CHANGE MASTER TO เท่านั้น
  • ข้อมูลเดิมก่อน MASTER_LOG_POS จะ ไม่ถูกนำเข้ามา

ถ้าเคย sync ไปบ้างแล้ว และแก้ไขเฉพาะการเชื่อมต่อ:

  • Slave จะ ต่อจากตำแหน่งล่าสุดที่หยุดไว้ (ตาม Exec_Master_Log_Pos)
  • ข้อมูลก่อนหน้านั้นที่ sync แล้ว ยังคงอยู่
  • และจะ sync ข้อมูลใหม่ต่อโดยอัตโนมัติ

🔧 สรุปวิธีให้ Slave มีข้อมูลตรงกับ Master (ถ้าต้องการ sync ย้อนหลังทั้งหมด)

หากต้องการให้ Slave มีข้อมูลเท่ากับ Master ทั้งฐานข้อมูล (รวมถึงข้อมูลก่อนหน้า):

✅ แนวทางที่ปลอดภัย:

  1. ล็อค Master ชั่วคราว: sqlคัดลอกแก้ไขFLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
  2. Dump ข้อมูลจาก Master: bashคัดลอกแก้ไขmysqldump -u root -p --all-databases --master-data=2 > full_backup.sql
  3. ปลดล็อค Master: sqlคัดลอกแก้ไขUNLOCK TABLES;
  4. นำ dump ไป restore ที่ Slave: bashคัดลอกแก้ไขmysql -u root -p < full_backup.sql
  5. ตั้งค่า CHANGE MASTER TO โดยใช้ MASTER_LOG_FILE และ MASTER_LOG_POS จากขั้นตอนที่ 1
  6. เริ่ม Replication: sqlคัดลอกแก้ไขSTART SLAVE;

✅ สรุปสุดท้าย:

สถานการณ์ผลลัพธ์
Slave แก้การเชื่อมต่อสำเร็จ (หลังเคย sync ไปแล้ว)Sync ต่อจากจุดเดิมทันที
Slave เริ่มต้นใหม่ และไม่มีข้อมูลไม่ได้ดึงข้อมูลเก่าจาก Master มาอัตโนมัติ
ต้องการให้ Slave มีข้อมูลครบเท่า Masterต้องทำการ dump & restore ด้วยตนเอง

Connection to server is disabled, please enable $cfg[‘AllowArbitraryServer’] in phpMyAdmin configuration.

ChatGPT พูดว่า:

ข้อความนี้เกิดจากการที่คุณพยายามเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ผ่าน phpMyAdmin แต่ฟีเจอร์ AllowArbitraryServer ถูกปิดไว้ในไฟล์ config ของ phpMyAdmin ทำให้ไม่สามารถเชื่อมต่อเซิร์ฟเวอร์อื่นที่ไม่ได้กำหนดไว้ล่วงหน้าได้


วิธีแก้ไข

  1. เปิดไฟล์ config.inc.php ของ phpMyAdmin
    ตัวอย่างตำแหน่งไฟล์:
    • /etc/phpmyadmin/config.inc.php (บน Linux)
    • หรือในโฟลเดอร์ติดตั้ง phpMyAdmin ของคุณ
  2. หาและเพิ่ม (หรือแก้ไข) บรรทัดนี้ในไฟล์: phpคัดลอกแก้ไข$cfg['AllowArbitraryServer'] = true;
  3. บันทึกไฟล์ และรีเฟรชหน้า phpMyAdmin ใหม่

หมายเหตุ

  • การเปิด AllowArbitraryServer จะอนุญาตให้คุณเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ที่ไม่ได้กำหนดใน config ก่อนหน้า
  • ควรใช้งานด้วยความระมัดระวัง เพราะอาจมีความเสี่ยงด้านความปลอดภัยถ้าเว็บ phpMyAdmin เปิดให้คนอื่นเข้าถึงได้