การสำรองฐานข้อมูล MySQL 22 GB ทุกวัน


28

ตอนนี้ฉันสามารถสำรองข้อมูลโดยใช้ mysqldump แต่ฉันต้องลงเว็บเซิร์ฟเวอร์และใช้เวลาประมาณ 5 นาทีในการสำรองข้อมูล ถ้าฉันไม่ลงเว็บเซิร์ฟเวอร์มันจะใช้เวลาตลอดไปและจะไม่เสร็จสิ้น + เว็บไซต์จะไม่สามารถเข้าถึงได้ในระหว่างการสำรองข้อมูล

มีวิธีที่เร็วกว่า / ดีกว่าในการสำรองข้อมูล 22 GB ของฉันและเพิ่มฐานข้อมูลหรือไม่?

ตารางทั้งหมดคือ MyISAM


ดูได้ที่ลิงค์นี้มันเป็นคำถามที่คล้ายกัน serverfault.com/questions/8044/backup-mysql-server
ชาร์ลส์ Faiga

คำตอบ:


28

ใช่.

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

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

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

แก้ไข:แน่นอนดูเหมือนว่าใช้ binlogs สำหรับการสำรองข้อมูลเป็นเอกสาร

คำถามนี้เกี่ยวข้องกันมาก


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

5

ให้อภัยฉันสำหรับสมมติว่าระบบปฏิบัติการเป็น Linux หากคุณไม่ได้ใช้ LVM คุณควรจะเป็น หากคุณอยู่ที่นี่เป็นวิธีที่ง่ายมากในการสำรองข้อมูลผ่านทางสแน็ปช็อต

# Define these vars to meet your needs. These meet mine.
lvol="/dev/VolGroup03/lvol0"
snap_name="nightly_snapshot"
snap_vol="$(dirname $lvol)/$snap_name"
snap_path="/mnt/$snap_name"
snap_size="10g" # Not the size of your data, anticipated data changes during the backup
backup_path="/backups/$snap_name"

/usr/bin/time -f 'Databases were locked for %E' -- \
mysql <<- MYSQL
# based on http://pointyhair.com/tiki-view_blog_post.php?blogId=1&postId=5
FLUSH TABLES WITH READ LOCK;
\! lvcreate --size $snap_size --snapshot --name $snap_name $lvol
UNLOCK TABLES;
MYSQL
mount $snap_vol $snap_path
rsync -av --delete $snap_path/mysql $backup_path/
umount $snap_path
lvremove -f $snap_vol

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


2

ตารางล้างด้วยล็อกการอ่านไม่ใช่สิ่งที่คุณต้องการทำในระบบการผลิตเป็นประจำ (หรือกึ่งปกติ) ควรเป็นทางเลือกสุดท้ายเท่านั้น

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

นอกจากนี้หากหนึ่งในทาสของคุณล้มเหลวคุณสามารถใช้สแนปชอตจากนั้นเพื่อสร้างสลาฟที่สอง (หรือสาม) หากทาสทั้งหมดของคุณล้มเหลวคุณจะกลับไปที่แท็บล้างด้วยล็อกการอ่าน

อย่าลืมมีกระบวนการที่ตรวจสอบข้อมูลเป็นประจำอยู่เสมอให้ใช้สิ่งต่าง ๆ เช่น mk-table-checksum เพื่อทำสิ่งนี้ (นี่เป็นสิ่งที่ไม่ควรทำในการตั้งค่า

เนื่องจาก 22 GB มีขนาดค่อนข้างเล็กคุณจะไม่มีปัญหาในการทำเช่นนี้ การทำกับฐานข้อมูลขนาดใหญ่อาจเป็นปัญหาได้มากกว่า


1

วิธีแก้ปัญหานี่คือสองเท่าตามที่อธิบายไว้ข้างต้น:

  1. ตั้งค่าการจำลองแบบของเซิร์ฟเวอร์เป็นสลาฟซึ่งคุณสามารถออฟไลน์ได้ วิธีที่ดีที่สุดในการทำเช่นนี้คือการดัมพ์ของฐานข้อมูลโดยใช้ mysqldump และพารามิเตอร์ --master-data
  2. ตั้งค่าการสำรองข้อมูลทุกคืนบนทาส คุณสามารถใช้ mysqldump กับ --master-data --flush-logs และ - flag-transaction หรือคุณสามารถหยุดการทำงานของเซิร์ฟเวอร์ mysql คัดลอกไฟล์ข้อมูลบนดิสก์และทำการรีสตาร์ท มันออกไป)
  3. เรียกใช้สคริปต์บนทาสทุก ๆ (เช่น 5, 10, 20 นาที) เพื่อตรวจสอบและตรวจสอบให้แน่ใจว่า mysql ยังคงทำซ้ำ ฉันเขียนสคริปต์หลามอย่างง่ายที่จะทำซึ่งคุณสามารถใช้ได้

โปรดทราบว่าหากคุณใช้ InnoDB สำหรับตารางของคุณคุณสามารถใช้ --Single-transaction flag เพื่อหลีกเลี่ยงการล็อคตารางใด ๆ และยังคงได้รับการถ่ายโอนข้อมูลที่สอดคล้องกันของฐานข้อมูลแม้ในต้นแบบและทำให้การสำรองข้อมูลของคุณโดยไม่ การลงเซิร์ฟเวอร์ วิธีการแก้ปัญหาข้างต้นเป็นวิธีที่ดีกว่า

นอกจากนี้หากคุณใช้ LVM บน Linux คุณสามารถใช้ LVM snapshot ของพาร์ติชันแล้วสำรองข้อมูลนั้น LVM snapshots เป็นแบบอะตอมมิกดังนั้นถ้าคุณทำ 'flush ตารางด้วย read lock' จากนั้นทำการ snapshot และปลดล็อคคุณจะได้ snapshot ที่สอดคล้องกัน

หากคุณกังวลเกี่ยวกับการโต้แย้งของ I / O ที่ทำให้การถ่ายโอนข้อมูลใช้เวลานานเกินไปคุณสามารถเพิ่มเครื่องที่สามและรัน mysqldump บนเครือข่ายนั้นเพื่อหลีกเลี่ยงการฟาดดิสก์ของคุณ


0

สแนปชอตมักขึ้นอยู่กับสภาพแวดล้อมของคุณ โดยเฉพาะอย่างยิ่งถ้าคุณต้องสำรองข้อมูลต้นแบบด้วยเหตุผลบางอย่าง เรารันคู่ master และ slave และใช้ snapshot backups ทั้งคู่

  1. FLUSH TABLES WITH READ LOCK;
  2. ดึงสแน็ปช็อตบนระบบฐานข้อมูลและล็อกไฟล์
  3. UNLOCK TABLES;
  4. คัดลอกไฟล์ข้อมูลของคุณออกจากสแนปชอตในยามว่าง

ด้วยตาราง InnoDB คุณจะต้องเรียกใช้SET AUTOCOMMIT=0;ก่อนที่จะดำเนินการล็อกการอ่าน



-1

คุณสามารถสำรองข้อมูลอย่างค่อยเป็นค่อยไป สำรองข้อมูล 1 / 24th ของบันทึกทุกชั่วโมง ปัญหาเดียวของวิธีนี้คือหากเกิดปัญหาในช่วงสองสามชั่วโมงแรกของวันคุณจะสูญเสียอะไรจากเวลานั้นไปจนถึงเวลาที่เกิดการขัดข้อง ไม่ว่าจะด้วยวิธีใดมันเป็นระเบียนที่หายไปน้อยกว่า 24 ชั่วโมง (ฉันไม่ทราบว่ามีความสำคัญต่อคุณอย่างไร)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.