🧩 ปัญหาเบื้องต้น
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 ทั้งฐานข้อมูล (รวมถึงข้อมูลก่อนหน้า):
✅ แนวทางที่ปลอดภัย:
- ล็อค Master ชั่วคราว: sqlคัดลอกแก้ไข
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
- Dump ข้อมูลจาก Master: bashคัดลอกแก้ไข
mysqldump -u root -p --all-databases --master-data=2 > full_backup.sql
- ปลดล็อค Master: sqlคัดลอกแก้ไข
UNLOCK TABLES;
- นำ dump ไป restore ที่ Slave: bashคัดลอกแก้ไข
mysql -u root -p < full_backup.sql
- ตั้งค่า
CHANGE MASTER TO
โดยใช้MASTER_LOG_FILE
และMASTER_LOG_POS
จากขั้นตอนที่ 1 - เริ่ม 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 ทำให้ไม่สามารถเชื่อมต่อเซิร์ฟเวอร์อื่นที่ไม่ได้กำหนดไว้ล่วงหน้าได้
วิธีแก้ไข
- เปิดไฟล์
config.inc.php
ของ phpMyAdmin
ตัวอย่างตำแหน่งไฟล์:/etc/phpmyadmin/config.inc.php
(บน Linux)- หรือในโฟลเดอร์ติดตั้ง phpMyAdmin ของคุณ
- หาและเพิ่ม (หรือแก้ไข) บรรทัดนี้ในไฟล์: phpคัดลอกแก้ไข
$cfg['AllowArbitraryServer'] = true;
- บันทึกไฟล์ และรีเฟรชหน้า phpMyAdmin ใหม่
หมายเหตุ
- การเปิด
AllowArbitraryServer
จะอนุญาตให้คุณเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ที่ไม่ได้กำหนดใน config ก่อนหน้า - ควรใช้งานด้วยความระมัดระวัง เพราะอาจมีความเสี่ยงด้านความปลอดภัยถ้าเว็บ phpMyAdmin เปิดให้คนอื่นเข้าถึงได้