ฉันจะสำรองฐานข้อมูล mysql ได้อย่างไร แต่มีความสำคัญต่ำ


15

ฉันต้องการสำรองฐานข้อมูล แต่ในระหว่างวันที่มีการโหลดบนเซิร์ฟเวอร์ จำเป็นอย่างยิ่งที่การสำรองข้อมูลจะไม่ส่งผลต่อ apache และฐานข้อมูลอื่น ๆ ที่ทำงานบนเซิร์ฟเวอร์เดียวกัน

มันควรจะเป็นไปได้ที่จะใช้คำสั่งmysqldumpแต่เรียกใช้คำสั่งที่มีลำดับความสำคัญต่ำ

ฉันจะทำสิ่งนี้ได้อย่างไร

อัปเดต: ดูเหมือนว่าการใช้ nice กับ mysqldump จะไม่ทำงานเนื่องจาก mysqldump สร้างกระบวนการใหม่


คุณเคยดู mysqlhotcopy ไหม

@fsb mysqlhotcopy สนับสนุนสิ่งที่ OP ต้องการอย่างไร
โทมัส

คำตอบ:


8

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

เป็นโบนัสที่ดีตอนนี้คุณมีทาสแบบอ่านอย่างเดียวที่คุณสามารถใช้สำหรับการสืบค้นที่ใช้เวลานาน


น่าเสียดายที่ตัวเลือกนี้ดูเหมือนว่าจะใช้งานได้ดีที่สุด แต่ฉันเดาว่าเป็นตัวเลือกจริงเท่านั้นหากฉันต้องการผลกระทบน้อยที่สุดในเซิร์ฟเวอร์หลัก
andyuk

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

15

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

cstreamเป็นเครื่องมือจัดการกระแสข้อมูลทั่วไปเช่น UNIX dd ซึ่งมักใช้ในการสร้างท่อ commandline สิ่งที่ทำให้ cstream มีประโยชน์สำหรับเราคือช่วยให้คุณระบุแบนด์วิดท์สูงสุดสำหรับอินพุตทั้งหมด หมายความว่าคุณสามารถ จำกัด ดิสก์ IO ของคำสั่ง mysqldump ด้วยคำสั่งง่ายๆดังนี้:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

สมมติว่าคุณสำรองฐานข้อมูลที่ใช้ตาราง InnoDB ทั้งหมดคำสั่งข้างต้นจะปลอดภัย (จะไม่ส่งผลต่อการค้นหาอื่น ๆ ) และจะทำการ mysqldump ของคุณในขณะที่ จำกัด ดิสก์ที่อ่านได้เพียงหนึ่งเมกะไบต์ต่อวินาที ปรับแบนด์วิดท์ด้วยพารามิเตอร์ -t เป็นค่าอะไรก็ตามที่จะทำให้สภาพแวดล้อมของคุณทำการสำรองข้อมูลโดยไม่ส่งผลกระทบต่อประสบการณ์ของลูกค้าของคุณ


เพิ่งผ่านการทดสอบและฉันทำงานเหมือนมีเสน่ห์! ขอบคุณสำหรับการแบ่งปันแบรนดอน!
sucotronic

4

FWIW คุณควรทำเช่นนี้กับ pv ( http://linux.die.net/man/1/pv )

mysqldump - ธุรกรรมเดี่ยว - ด่วน -u -p | pv - อัตรา จำกัด 1m> ปลายทาง (หรือ | nc หรือ | tar cfj backup.bz2 -)

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


1

ถ้าคุณใช้ InnoDB คุณสามารถลองxtrabackupกับ --throttle ตัวเลือก

คุณสามารถดูioniceและเรียกใช้ mysqldump ด้วย

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


0

หากคุณใช้งานบน Linux หรือตัวแปร * nix อื่นคุณสามารถทำได้ด้วยสิ่งต่อไปนี้:

nice -n ## mysqldump

สิ่งนี้จะทำให้ลำดับความสำคัญของตารางเวลาลดลง ช่วงความสำคัญของการกำหนดตารางเวลาตั้งแต่ -20 (ลำดับความสำคัญสูงสุด) ถึง 19 (ลำดับความสำคัญต่ำสุด) ค่าเริ่มต้นสำหรับ nice คือ 10 หากไม่ใส่อาร์กิวเมนต์ -n


0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice สำหรับลำดับความสำคัญ I / O และดีสำหรับลำดับความสำคัญของ cpu

เรียกใช้ vmstat 5 ตรวจสอบคอลัมน์ที่ระบุว่า WA ค่าสูงหมายถึง CPU กำลังรอ I / O ใช้ ionice หากโหลด CPU เพียงอย่างเดียวก็ใช้งานได้ดี

การตอบสนองต่อการอัปเดต:

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

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

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


0

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


0

คุณสามารถลองใช้งานไม่ได้ในช่วงเวลาเร่งด่วน ไม่ว่าคุณจะใช้ลำดับความสำคัญใดก็ตามการถ่ายโอนข้อมูลจะยังคงต้องการการล็อกในตารางทั้งหมดของคุณ


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