แนวทางปฏิบัติที่ดีที่สุดสำหรับการสำรองฐานข้อมูล MySQL


23

ฉันได้ค้นพบเมื่อเร็ว ๆ นี้ว่าเว็บเซิร์ฟเวอร์ที่ใช้งานจริงของเราไม่ได้ทำการสำรองข้อมูลอยู่เป็นประจำ (หรือเลย) ฉันคุ้นเคยกับการสำรอง SQL Server DB แต่ไม่มีประสบการณ์มากมายกับ MySQL DB แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ 'mysqldump' หรือเครื่องมือสำรองข้อมูลอื่น ๆ

ฉันอาจ cron งานตารางเพื่อให้มันทำทุกคืนแล้วสำรองไฟล์ด้วยระบบสำรองของฉัน

ขอบคุณ

คำตอบ:


29

วิธีปฏิบัติที่ดีที่สุดในการสำรองข้อมูลเซิร์ฟเวอร์ MySQL:

การจำลองแบบ MySQL

ตั้งค่าการจำลองแบบใน MySQL คุณจะต้องติดตั้งเซิร์ฟเวอร์ Master และ Slave การอ่าน - เขียนไปยัง DB ทั้งหมดสามารถไปยัง Slave Server ของคุณได้ ข้อดีของการมีการจำลองแบบคือคุณสามารถสำรองข้อมูลจากเซิร์ฟเวอร์ทาสของคุณโดยไม่ขัดจังหวะเซิร์ฟเวอร์ Master แอปพลิเคชันของคุณจะยังคงทำงานกับ Master ได้โดยไม่ต้องหยุดทำงาน

ใช้การถ่ายโอนข้อมูล MySQL

หากชุดข้อมูลของคุณมีขนาดเล็ก (ฉันรู้ว่า "เล็ก" เป็นคำที่เกี่ยวข้อง .. เพื่อให้มีคุณสมบัติดังกล่าวสมมติว่า <10GB) จากนั้น mysqldump อาจทำงานได้ดี ง่ายมันออนไลน์และยืดหยุ่นมาก มีเพียงไม่กี่สิ่งที่ mysqldump สามารถทำได้: สำรองข้อมูลทุกอย่างหรือสำรองฐานข้อมูลหรือตารางบางอย่างเท่านั้น DDL จะปรับการถ่ายโอนข้อมูลเพื่อการกู้คืนที่รวดเร็วยิ่งขึ้นทำให้ไฟล์ sql ที่เป็นผลลัพธ์นั้นเข้ากันได้กับ RDBMS อื่น ๆ และอีกมากมาย

อย่างไรก็ตามตัวเลือกที่สำคัญที่สุดนั้นเกี่ยวข้องกับความสอดคล้องของข้อมูลสำรองของคุณ ตัวเลือกที่ฉันชอบคือ: - ธุรกรรมเดี่ยว: ตัวเลือกนี้ให้การสำรองข้อมูลที่สอดคล้องกันหาก (และเฉพาะในกรณี) ตารางกำลังใช้เครื่องมือจัดเก็บข้อมูลของ InnoDB หากคุณมีตาราง MyISAM ที่ไม่ใช่แบบอ่านอย่างเดียวอย่าใช้ตัวเลือกนี้เมื่อสำรองข้อมูล --master-data = 2: ตัวเลือกนี้จะทำให้แน่ใจว่าการถ่ายโอนข้อมูลของคุณสอดคล้องกัน (โดยทำการล็อคทุกตารางเว้นแต่ว่าคุณได้เพิ่มตัวเลือก - ธุรกรรมเดี่ยว) ตัวเลือก --master-data ยังบันทึกตำแหน่งบันทึกไบนารีในไฟล์ดัมพ์ผลลัพธ์ (= 2 ทำให้บรรทัดนี้เป็นข้อคิดเห็นในไฟล์ดัมพ์)

หมายเหตุสุดท้ายเกี่ยวกับ mysqldump: โปรดทราบว่าเวลาการเรียกคืนอาจนานกว่าเวลาการสำรองข้อมูลอย่างมาก มันจะขึ้นอยู่กับปัจจัยหลายประการเช่นจำนวนดัชนีที่คุณมี

LVM snapshot

สำหรับผู้ที่มีชุดข้อมูลที่ใหญ่กว่าการสำรองข้อมูลแบบฟิสิคัลเป็นวิธีที่จะดำเนินการ ในขณะที่คุณสามารถสำรองข้อมูลเย็น (เช่นปิดบริการ MySQL คัดลอกไดเรกทอรีข้อมูลเริ่มบริการ) หลายคนไม่ต้องการหยุดทำงาน ทางออกที่ฉันชอบคือสแน็ปช็อต สิ่งนี้อาจร้อน (สำหรับ InnoDB) หรือต้องการล็อคแบบย่อ (สำหรับ MyISAM) อย่าลืมที่จะรวมข้อมูลทั้งหมดของคุณ (รวมถึง ib_logfiles) Lenz จัดเตรียมยูทิลิตี้ที่ดีที่จะช่วยในเรื่องนี้: http://www.lenzg.net/mylvmbackup/

ใช้การสำรองข้อมูล MySQL Enterprise

ข้อดีของการใช้ MySQL Enterprise Backup:

  • การสำรองข้อมูล "ร้อน" ของตาราง InnoDB จะเกิดขึ้นออนไลน์โดยไม่ต้องปิดกั้นการสำรองข้อมูลเฉพาะตารางหรือพื้นที่ตารางโดยเฉพาะ
  • สำรองข้อมูลที่เปลี่ยนแปลงตั้งแต่การสำรองข้อมูลก่อนหน้าเท่านั้น
  • การบีบอัดข้อมูลสำรอง - ประหยัดพื้นที่จัดเก็บมากถึง 90% และอีกมากมาย ..

การอ้างอิง: http://www.mysql.com/products/enterprise/backup/features.html http://www.mysql.com/products/enterprise/backup.html


7

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

สำหรับกระบวนการจริงคุณมีสองสามตัวเลือกโดยไม่มีเครื่องมือของบุคคลที่สาม ภาพรวมสามารถนำมาใช้mysqldumpคำสั่ง (สมมติว่าคุณกำลังใช้ mysqldump --all-databases --single-transaction > all_databases.sqlInnoDB): ขึ้นอยู่กับขนาดของข้อมูลมันอาจจะดีกว่าที่จะปิด MySQL และสำรองไฟล์ข้อมูลโดยตรง เมื่อรีสตาร์ทเรพลิคามันจะเล่นซ้ำเหตุการณ์ทั้งหมดที่ได้รับในช่วงเวลาหลัก หากคุณใช้งาน MySQL Enterprise mysqlbackupยูทิลิตี้ทำสิ่งนี้

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


3
+1 --single-transactionแต่อย่าลืมที่จะเพิ่ม--events --routinesและฉันก็มักจะใช้--triggersด้วยแม้ว่าจะเปิดใช้งานตามค่าเริ่มต้นแล้วเนื่องจากมันสามารถปิดการใช้งานใน my.cnf ได้ ฉันจะบอกว่ามันค่อนข้างดีเสมอที่จะใช้สิ่งเหล่านี้เป็นแบบฝึกหัดมาตรฐานไม่ว่าคุณจะมีวัตถุประเภทนั้นอยู่ในฐานข้อมูลหรือไม่ก็ตาม
Michael - sqlbot

หมายเหตุ mysqldump - ฐานข้อมูลทั้งหมดอาจก่อให้เกิดข้อผิดพลาดเมื่อคุณมีการตั้งค่าตารางเปิดสูงสุดที่ต่ำ ดังนั้นจับจ้อง mysql.log ของคุณ การจำลองแบบจะเป็นวิธีสำรองที่ดีที่สุดแน่นอน
Raymond Nijland

คุณจะเก็บสำเนาข้อมูลในอดีตได้อย่างไร? (บ่อยครั้งที่ลูกค้าจะต้องการการสำรองข้อมูลอย่างน้อยหนึ่งเดือนและเมื่อบั๊กแอปพลิเคชันทำลายข้อมูลผู้พัฒนาต้องการคัดลอกฐานข้อมูลจากก่อนหน้าข้อบกพร่อง)
RonJohn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.