Friday, 1 December 2023

วิธีการกู้คืนฐานข้อมูล InnoDB MySQL จากการสำรองข้อมูลดิบ

คุณต้องได้รับสำเนาของไดเร็กทอรีฐานข้อมูล mysql แบบ raw 

/var/lib/mysql/your_database

คุณต้องมีสำเนาของไฟล์ ib ต่อไปนี้ที่อยู่ใน /var/lib/mysql/

ib_logfile0

ib_logfile1

อิบดาต้า1

ib_buffer_pool

⚠ คำเตือน! ระวังอย่ากู้คืนไฟล์เหล่านั้นไปยังเซิร์ฟเวอร์ที่ใช้งานจริง ไม่เช่นนั้นฐานข้อมูลจะเสียหาย

ทำงานบนเซิร์ฟเวอร์ทดสอบ

เราจะทำงานกับไดเร็กทอรีฐานข้อมูลและไฟล์ ib* บนเซิร์ฟเวอร์ทดสอบ ดังนั้นเราจึงไม่ทำลายสิ่งใดๆ ในการผลิต เราขอแนะนำให้ใช้เวอร์ชัน MySQL และกลไกการจัดเก็บข้อมูลเดียวกัน

ขั้นแรก ให้ปิด mysql บนเซิร์ฟเวอร์ทดสอบของคุณ สำหรับ centos ให้ทำดังนี้


systemctl stop mysqld

ทำสำเนาสำรองของไดเร็กทอรี mysql จะดีกว่าถ้าปลอดภัยกว่าขออภัย:

****ย้ายไปอยู่ /var/lib/mysql


cp -pr /var/lib/mysql /var/lib/mysql2


จากนั้น คุณสามารถคัดลอกและเขียนทับไฟล์ ib* และไดเร็กทอรีฐานข้อมูลของคุณไปยัง /var/lib/mysql บนเซิร์ฟเวอร์ทดสอบ ด้วยวิธีใดก็ได้ที่คุณต้องการ


ตรวจสอบให้แน่ใจว่าได้เปลี่ยนเจ้าของไฟล์ของไฟล์ ib* และไดเร็กทอรีฐานข้อมูล & ไฟล์ให้ตรงกับ mysql.mysql หรืออะไรก็ตามที่เซิร์ฟเวอร์ mysql ของคุณใช้งานอยู่


chown mysql.mysql -R /var/lib/mysql/your_database
chown mysql.mysql /var/lib/mysql/ib*

ถึงเวลาที่ต้องกลับมาเปิดเซิร์ฟเวอร์ mysqld อีกครั้ง:


systemctl start mysqld


ตอนนี้คุณควรจะสามารถสร้าง mysqldump ของฐานข้อมูลได้แล้ว:


mysqldump your_database > your_database.sql


หากคุณสร้าง mysqldump สำเร็จแล้ว คุณสามารถคืนค่าการเปลี่ยนแปลงทั้งหมดที่เราทำบนเซิร์ฟเวอร์ทดสอบได้แล้ว


 systemctl stop mysqld
 mv /var/lib/mysql /var/lib/mysql.del
 mv /var/lib/mysql2 /var/lib/mysql
 systemctl start mysqld 

ตอนนี้คุณสามารถลบโฟลเดอร์สำรอง mysql.del ได้แล้ว:

rm -rf /var/lib/mysql.del


การนำเข้าไฟล์ mysqldump

ใกล้เสร็จแล้ว ถึงเวลาล็อกอินเข้าสู่เซิร์ฟเวอร์ปลายทางและสร้างฐานข้อมูล:


mysql -e "CREATE DATABASE your_database;"   


คัดลอกไฟล์ดัมพ์ของ your_database.sql ไปยังเซิร์ฟเวอร์ปลายทางและนำเข้าไปยังฐานข้อมูลที่สร้างขึ้นใหม่:


mysql your_database < your_database.sql


คุณควรจะสามารถแสดงตารางจากฐานข้อมูลที่นำเข้าได้ นอกจากนี้ คุณยังสามารถเชื่อมโยงผู้ใช้กับฐานข้อมูลและให้สิทธิ์การเข้าถึงทั้งหมดที่จำเป็นได้แล้ว


mysql -e "SHOW TABLES FROM your_database;"

ที่มา https://www.linuxadmingeeks.com/how-to-recover-an-innodb-mysql-database-from-raw-backup/