ย้ายฐานข้อมูลจากเซิร์ฟเวอร์หรือคลาวด์อื่น

ย้าย PostgreSQL, MySQL หรือ MariaDB ที่รันอยู่ที่อื่นเข้ามาเป็น Managed Database ด้วย replication ของ engine เอง หยุดระบบแค่ไม่กี่นาที

สร้างฐานข้อมูลปลายทางก่อน ใช้ engine เดียวกัน (PostgreSQL ไป PostgreSQL, MySQL ไป MySQL, MariaDB ไป MariaDB) และเวอร์ชันไม่เก่ากว่าต้นทาง ข้อมูลวิ่งจากต้นทางเข้าฐานข้อมูลใหม่โดยตรง การย้ายไม่มีค่าใช้จ่าย ส่วนฐานข้อมูลคิดค่าบริการตามปกติ

วิธีทำงานอย่างไรช่วงที่ต้องหยุด
ย้ายแล้วซิงก์ต่อเนื่อง (แนะนำ)คัดลอกทั้งหมด แล้วตามการเปลี่ยนแปลงของต้นทางจนกว่าจะ Cutoverไม่กี่นาทีตอน Cutover
ย้ายครั้งเดียว (Full dump)คัดลอกทั้งหมดครั้งเดียวหยุดเขียนต้นทางระหว่างย้าย

ทีละขั้น

  1. เปิดฐานข้อมูลปลายทาง ไปที่แท็บ ย้ายฐานข้อมูล แล้วกด เริ่มย้ายฐานข้อมูล
  2. เลือกวิธี แล้วใส่ host, port, user และรหัสผ่านของต้นทาง พร้อมการเข้ารหัส (ค่าเริ่มต้นคือ TLS)
  3. อนุญาต IP ที่หน้าจอแสดงใน Firewall หรือ Security Group ของต้นทาง ถ้าต้องการ IP ที่ไม่เปลี่ยน ให้เพิ่ม NAT Gateway ให้ Subnet ของฐานข้อมูล
  4. กด ทดสอบการเชื่อมต่อ แล้วเลือกฐานข้อมูลที่จะย้าย แต่ละตัวจะใช้ชื่อเดิม และฐานข้อมูลปลายทางต้องว่าง
  5. กด ตรวจสอบก่อนย้าย แล้วแก้ข้อที่ระบบแจ้ง หน้าจอบอกด้วยว่าต้นทางต้องตั้งค่าอะไร (ดูด้านล่าง)
  6. กด เริ่มย้าย หน้าจอแสดงการคัดลอก แล้วขึ้น ซิงก์ต่อเนื่อง พร้อมบอกว่าตามหลังต้นทางเท่าไร
  7. เมื่อพร้อม หยุดแอปไม่ให้เขียนลงต้นทาง กด Cutover รอจนขึ้น เสร็จแล้ว แล้วเปลี่ยนแอปมาใช้ฐานข้อมูลใหม่

สิ่งที่ต้นทางต้องมีสำหรับการซิงก์ต่อเนื่อง

Engineต้องมี
PostgreSQLwal_level=logical (บน Amazon RDS: rds.logical_replication=1) ผู้ใช้ที่มีสิทธิ์ REPLICATION (RDS: rds_replication) และเป็นเจ้าของตาราง หรือมี publication ที่สร้างไว้ให้ และมี replication slot ว่าง ตารางต้องมี primary key จึงจะซิงก์การ UPDATE และ DELETE ได้
MySQL / MariaDBเปิด binary log ด้วย binlog_format=ROW และเก็บไว้อย่างน้อย 1 วัน server_id ไม่เป็น 0 และผู้ใช้มีสิทธิ์ SELECT, SHOW VIEW, TRIGGER, EVENT, RELOAD, REPLICATION SLAVE และ REPLICATION CLIENT ตาราง MyISAM ไม่ได้คัดลอก ณ จุดเวลาเดียวกัน
  • ระหว่างซิงก์ ฐานข้อมูลปลายทาง MySQL หรือ MariaDB เป็นแบบอ่านอย่างเดียวสำหรับแอป ส่วน PostgreSQL อย่าเขียนลงตารางที่กำลังย้ายบนปลายทาง และอย่าแก้โครงสร้างตารางที่ต้นทาง เพราะ DDL เช่น ALTER TABLE ไม่ถูกซิงก์
  • ตรวจนับแถว เทียบจำนวนแถวทั้งสองฝั่งได้ทุกเมื่อ และตอน Cutover ระบบนับให้อีกครั้ง
  • ผู้ใช้และสิทธิ์ของต้นทางไม่ถูกย้าย ข้อมูลที่ย้ายเป็นของผู้ใช้หลักของปลายทาง เพิ่มผู้ใช้อื่นได้ที่แท็บ ผู้ใช้ & รหัสผ่าน ภายหลัง
  • Read replica เป็นปลายทางไม่ได้ ให้ย้ายเข้าฐานข้อมูลหลัก แล้ว Replica และเครื่องสำรองจะได้ข้อมูลตามไปเอง

ซ้อมก่อน: ย้ายเข้าฐานข้อมูลใน Project ทดสอบ ลองให้แอปทำงานบนนั้น แล้วค่อยย้ายของจริง

ถ้าเจอปัญหา

ทดสอบการเชื่อมต่อไม่ผ่าน

ตรวจ host และ port ตรวจว่าต้นทางอนุญาต IP ที่หน้าจอแสดง และตรวจการเข้ารหัส ใช้ ไม่เข้ารหัส เฉพาะเมื่อต้นทางอยู่ใน VPC เดียวกัน

Cutover หยุดรอ เพราะบางตารางจำนวนแถวไม่ตรง

ยังมีอะไรเขียนลงต้นทางอยู่ หยุดทุกระบบที่เขียน แล้วกด Cutover อีกครั้ง ถ้าตรวจตารางที่ระบบแจ้งแล้ว กด Cutover แม้จำนวนแถวไม่ตรง เพื่อไปต่อได้

ขึ้นว่า replication หายไปจากฐานข้อมูลนี้

เกิดได้หลังฐานข้อมูลสลับไปเครื่องสำรอง กด เริ่มใหม่ เพื่อย้ายตั้งแต่ต้น ข้อมูลที่ย้ายมาแล้วจะถูกล้างก่อน

ระบบให้ลบ replication slot ที่ต้นทาง

ระบบลบ slot ที่สร้างไว้ไม่สำเร็จ ให้รันคำสั่ง pg_drop_replication_slot ที่แสดง ไม่เช่นนั้นต้นทางจะเก็บ WAL ไว้จนดิสก์เต็ม

ยังแก้ไม่ได้? ให้ทีมงานช่วย

เปิด ticket จากหน้าจัดการ บอกชื่อเว็บหรือบริการ สิ่งที่ทำ และข้อความที่เห็นบนจอ ทีมงานจะตอบกลับในเรื่องเดียวกัน ติดตามได้ในที่เดียว