ฉันจะเพิ่มประสิทธิภาพ mysqldump ของฐานข้อมูลขนาดใหญ่ได้อย่างไร


173

ฉันมีแอพพลิเคชั่น symfony ที่มีฐานข้อมูล InnoDB ที่ ~ 2GB พร้อม 57 ตาราง ขนาดส่วนใหญ่ของฐานข้อมูลอยู่ในตารางเดียว (~ 1.2GB) ฉันกำลังใช้ mysqldump เพื่อสำรองฐานข้อมูลทุกคืน

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

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

BTW ฉันกำลังทำงานในการลดขนาดของฐานข้อมูลโดยรวมเพื่อแก้ไขปัญหานี้


2
คุณกำลังส่งผ่านพารามิเตอร์ใด (ถ้ามี) ไปที่คำสั่ง mysqldump?
Toby

การเพิ่ม - ขนาดกะทัดรัดอาจเป็นตัวเลือกสำหรับคุณ
Toby

ไม่มีอะไรจริงๆ -mysqldump [database] -u[user] -p'[password]' > db_backup.sql
แพทริค

4
ทางเลือกง่ายๆscreenสำหรับสถานการณ์ของคุณคือการใช้nohupมันจะทำให้คำสั่งของคุณทำงานบนเซิร์ฟเวอร์ต่อไปแม้ว่าการเชื่อมต่อของคุณจะลดลง nohup mysqldump [options] > backup.sql 2> backup.err &เช่น หากคุณไม่ได้เตรียมไฟล์เอาต์พุตไว้ไฟล์nohupจะสร้างnohup.outโดยค่าเริ่มต้น
dabest1

1
ดูatและscreen(หลังถ้าติดตั้ง แต่atเป็นมาตรฐานสำหรับยูนิกซ์ทั้งหมด) หรือServerAliveIntervalตัวเลือกสำหรับ SSH สำหรับวิธีจัดการกับไฟร์วอลล์ที่ปิดคุณลงหลังจากการเชื่อมต่อที่ไม่ได้ใช้งานนานเกินไป
MattBianco

คำตอบ:


134

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

  • ตรวจสอบให้แน่ใจว่าเอาต์พุตของคุณไปยังไดรฟ์อื่นที่ไม่ใช่ไฟล์ฐานข้อมูลที่เก็บไว้ซึ่งจะสร้างความแตกต่างอย่างมากกับดิสก์หมุนเนื่องจากหัวไดรฟ์จะไม่กระพริบระหว่างตำแหน่งที่อ่าน และตำแหน่งที่ถูกเขียนไป
  • ผลลัพธ์ของ mysqldump จะถูกบีบอัดได้มากดังนั้นหากคุณไม่สามารถแยกเอาท์พุทออกจากอินพุตตามที่กล่าวถึงไปป์เอาท์พุตผ่านgzipหรือคล้ายกัน วิธีนี้จะลดจำนวนการเขียนที่ทำลงไป (เพื่อลดการโหลด IO โดยรวมและจำนวนการเคลื่อนไหวของศีรษะ) โดยเสียเวลา CPU (ซึ่งคุณอาจมีจำนวนมากในเวลานี้)
  • นอกจากนี้ (หรือบีบอัดแทน) ส่งผ่านเอาต์พุตไปยังยูทิลิตี้ไปป์ (เช่นpv ) ที่รองรับบัฟเฟอร์การเขียนขนาดใหญ่ไปยังกลุ่มบล็อกที่เขียนไปยังไดรฟ์ด้วยกันอีกครั้งเพื่อลดผลกระทบของความล่าช้าในการเคลื่อนที่ของหัว ค่อนข้างแตกต่างถ้าใช้--quickตัวเลือกเพื่อลดผลกระทบ RAM ของการสำรองข้อมูลตารางขนาดใหญ่)
  • รันกระบวนการสำรองข้อมูลของคุณเฉพาะเมื่อโหลด IO ต่ำเท่านั้น

คุณอาจกำลังแก้ไขปัญหาที่ผิด: มันอาจจะง่ายกว่าที่จะแก้ไขการเชื่อมต่อที่ลดลงแทน (แม้ว่าการลดการโหลด I / O ที่กำหนดโดยการสำรองข้อมูลของคุณจะช่วยลดผลกระทบที่คุณมีต่อผู้ใช้คนอื่น ๆ คุณสามารถเรียกใช้การสำรองข้อมูลด้วยตนเองผ่านหน้าจอ (หรือเครื่องมือที่คล้ายกันเช่นtmux ) ได้หรือไม่? ด้วยวิธีนี้หากการเชื่อมต่อของคุณไปยังเซิร์ฟเวอร์ลดลงคุณสามารถเชื่อมต่อและเชื่อมต่อscreenเซสชันอีกครั้งโดยไม่ต้องมีกระบวนการใดขัดจังหวะ

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

เป็นส่วนหนึ่งของ "การลดขนาดของฐานข้อมูลโดยรวมของคุณเพื่อแก้ไขปัญหานี้" ฉันเดาว่าข้อมูลจำนวนมากของคุณจะไม่เปลี่ยนแปลง คุณอาจสามารถย้าย 1.2Gb ขนาดใหญ่จากตารางหลักนั้นออกไปยังอีกอันหนึ่งและลบออกจากสิ่งที่ถูกคัดลอกโดยการmysqldumpโทร คุณไม่จำเป็นต้องสำรองข้อมูลนี้ทุกครั้งหากไม่มีการเปลี่ยนแปลง การแยกข้อมูลระหว่างตารางและฐานข้อมูลด้วยวิธีนี้มักเรียกว่าการแบ่งข้อมูลและยังช่วยให้คุณสามารถกระจายข้อมูลและโหลด I / O ผ่านหลายไดรฟ์ ฐานข้อมูลระดับสูงรองรับการแบ่งพาร์ติชันอัตโนมัติแม้ว่าใน mysql คุณอาจต้องทำด้วยตนเองและเปลี่ยนเลเยอร์การเข้าถึงข้อมูลของคุณเป็นบัญชี

หลงทางไปที่ไซต์นี้ (ดังนั้นคุณควรจะไปที่ ServerFault หรือ SuperUser เพื่อถามว่าคุณต้องการรายละเอียดเพิ่มเติมหรือไม่): หากดูเหมือนว่าคุณขาดการเชื่อมต่อเนื่องจากไม่มีการใช้งานให้ตรวจสอบตัวเลือกในเซิร์ฟเวอร์ SSH และไคลเอนต์ SSH แน่ใจว่าแพ็กเก็ตแบบ keep-alive เปิดใช้งานและถูกส่งบ่อยครั้งพอ หากเห็นการดร็อปแม้ว่าการเชื่อมต่อจะเปิดใช้งานอยู่คุณสามารถลองใช้ OpenVPN หรือคล้ายกับการตัดการเชื่อมต่อ - มันควรจัดการกับการปล่อยสั้น ๆ แม้จะเป็นการดรอปแบบสมบูรณ์หากการเชื่อมต่อทั้งหมดของคุณไม่ทำงาน เซิร์ฟเวอร์ไม่ได้แจ้งให้ทราบล่วงหน้า


ฉันหวังว่าฉันจะลดจำนวนการเชื่อมต่อ ssh ที่ลดลงไปยังเซิร์ฟเวอร์ของฉันได้ หากฉันคาดว่าจะไม่ใช้เครื่องนานกว่า ~ 60 วินาทีฉันtopจะเรียกใช้เพื่อให้แน่ใจว่าการเชื่อมต่อจะไม่ลดลง (และฉันค่อนข้างแน่ใจว่ามันเป็นการเชื่อมต่อ comcast เพราะเราใช้เราเตอร์ WRT มาตรฐาน & ไฟร์วอลล์ในที่ทำงานและการเชื่อมต่อ comcast ของฉันที่บ้านไม่เคยลดลง)
Patrick

ฉันได้เพิ่มบันทึกย่อสั้น ๆ สำหรับการเชื่อมต่อ SSH
David Spillett

2
ความลึกและความเข้าใจในคำตอบนี้ คุณควรได้รับ +3 สำหรับสิ่งนี้ ขออภัยฉันมอบ +1 ให้คุณเท่านั้น
RolandoMySQLDBA

116

INSIGHT เข้าสู่แบ็คแพ็คด้วย mysqldump

IMHO การสำรองข้อมูลกลายเป็นรูปแบบศิลปะมากขึ้นถ้าคุณรู้วิธีเข้าหามัน

คุณมีตัวเลือก

ตัวเลือกที่ 1: mysqldump อินสแตนซ์ mysql ทั้งหมด

นี่คือสิ่งที่ง่ายที่สุดไม่มีเกมง่ายๆ !!!

mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz

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

ตัวเลือกที่ 2: mysqldump แยกฐานข้อมูลออกเป็นไฟล์ข้อมูลแยกต่างหาก

เริ่มต้นด้วยการสร้างรายการฐานข้อมูล (2 เทคนิคในการทำสิ่งนี้)

เทคนิค 1

mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt

เทคนิค 2

mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt

เทคนิค 1 เป็นวิธีที่เร็วที่สุด เทคนิคที่ 2 นั้นแน่นอนที่สุดและปลอดภัยที่สุด เทคนิค 2 ดีกว่าเพราะบางครั้งผู้ใช้สร้างโฟลเดอร์เพื่อวัตถุประสงค์ทั่วไปใน / var / lib / mysql (datadir) ซึ่งไม่เกี่ยวข้องกับฐานข้อมูล information_schema จะลงทะเบียนโฟลเดอร์เป็นฐานข้อมูลในตาราง information_schema.schemata เทคนิค 2 จะข้ามโฟลเดอร์ที่ไม่มีข้อมูล mysql

เมื่อคุณรวบรวมรายชื่อของฐานข้อมูลคุณสามารถดำเนินการวนรอบรายการและ mysqldump ได้แม้ในแบบคู่ขนานหากต้องการ

for DB in `cat ListOfDatabases.txt`
do
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait

หากมีฐานข้อมูลมากเกินไปที่จะเรียกใช้ในครั้งเดียวให้ทิ้งดัมพ์ไปทีละ 10 ในเวลาเดียวกัน:

COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
    mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

ตัวเลือก 3: mysqldump แยกตารางออกเป็นไฟล์ข้อมูลแยกต่างหาก

เริ่มต้นด้วยการสร้างรายการของตาราง

mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt

จากนั้นดัมพ์ตารางทั้งหมดในกลุ่ม 10

COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
    DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
    TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
    mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

ตัวเลือก 4: ใช้จินตนาการของคุณ

ลองชุดรูปแบบของตัวเลือกข้างต้นรวมทั้งเทคนิคต่าง ๆ เพื่อทำความสะอาดสแนปชอต

ตัวอย่าง

  1. เรียงลำดับรายการตามขนาดของแต่ละตารางจากน้อยไปมากหรือมากไปน้อย
  2. โดยใช้กระบวนการแยกต่างหากให้เรียกใช้ "ตารางการล้างด้วย READ LOCK; SELECT SLEEP (86400)" ก่อนที่จะเรียกใช้ mysqldumps ฆ่ากระบวนการนี้หลังจาก mysqldumps เสร็จสมบูรณ์ สิ่งนี้มีประโยชน์หากฐานข้อมูลมีทั้ง InnoDB และ MyISAM
  3. บันทึก mysqldumps ในโฟลเดอร์เก่าและหมุนโฟลเดอร์สำรองเก่าออกไป
  4. โหลด mysqldumps ตัวอย่างทั้งหมดลงในเซิร์ฟเวอร์แบบสแตนด์อโลน

ข้อแม้

ทางเลือกที่ 1 นำทุกสิ่งมาให้ ข้อเสียคือ mysqldumps สร้างขึ้นด้วยวิธีนี้สามารถโหลดซ้ำในรุ่น majot รุ่นเดียวกันกับ mysql ที่สร้าง mysqldump ขึ้นมา กล่าวอีกนัยหนึ่ง mysqldump จากฐานข้อมูล MySQL 5.0 ไม่สามารถโหลดได้ใน 5.1 หรือ 5.5 เหตุผล ? schema ของ mysql นั้นแตกต่างกันโดยสิ้นเชิงระหว่างรุ่นใหญ่ ๆ

ตัวเลือกที่ 2 และ 3 ไม่รวมการบันทึกชื่อผู้ใช้และรหัสผ่าน

นี่คือวิธีทั่วไปในการถ่ายโอน SQL Grants สำหรับผู้ใช้ที่อ่านได้และพกพาได้มากกว่า

mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql

ตัวเลือก 3 ไม่บันทึกขั้นตอนการจัดเก็บดังนั้นคุณสามารถทำดังต่อไปนี้

mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &

ประเด็นที่ควรสังเกตอีกประการคือ InnoDB หากคุณมีพูลบัฟเฟอร์ InnoDB ขนาดใหญ่คุณควรล้างข้อมูลให้ดีที่สุดเท่าที่จะทำได้ก่อนทำการสำรองข้อมูลใด ๆ มิเช่นนั้น MySQL จะใช้ตารางการล้างข้อมูลในเวลาที่หน้าสกปรกที่เหลืออยู่ออกจากพูลบัฟเฟอร์ นี่คือสิ่งที่ฉันแนะนำ:

ประมาณ 1 ชั่วโมงก่อนดำเนินการสำรองข้อมูลให้รันคำสั่ง SQL นี้

SET GLOBAL innodb_max_dirty_pages_pct = 0;

ใน MySQL 5.5 ค่าเริ่มต้น innodb_max_dirty_pages_pct คือ 75. ใน MySQL 5.1 และด้านหลังค่าเริ่มต้น innodb_max_dirty_pages_pct คือ 90 โดยการตั้งค่า innodb_max_dirty_pages_pct เป็น 0 สิ่งนี้จะเร่งการล้างหน้าสกปรกไปยังดิสก์ วิธีนี้จะช่วยป้องกันหรือลดผลกระทบจากการล้างข้อมูลสองเฟสที่ไม่สมบูรณ์ของข้อมูล InnoDB ก่อนดำเนินการ mysqldump กับตาราง InnoDB ใด ๆ

คำสุดท้ายใน mysqldump

คนส่วนใหญ่อายที่อยู่ห่างจาก mysqldump เพื่อสนับสนุนเครื่องมืออื่น ๆ และเครื่องมือเหล่านั้นก็ดี

เครื่องมือดังกล่าวรวมถึง

  1. MAATKIT ( สคริปต์การถ่ายโอนข้อมูลแบบขนาน/ กู้คืนจาก Percona [คัดค้าน แต่ดีมาก])
  2. XtraBackup (การสำรองข้อมูล TopNotch Snapshot จาก Percona)
  3. CDP R1Soft ( ตัวเลือกโมดูล MySQLที่ถ่ายภาพในเวลา)
  4. การสำรองข้อมูล MySQL Enterprise (ชื่อเดิม InnoDB การสำรองข้อมูลยอดนิยม [เชิงพาณิชย์])

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


2
+1 สำหรับการใช้ mysqldump และสำหรับ: หากคุณมีจิตวิญญาณของ MySQL DBA ที่แท้จริงคุณสามารถใช้ mysqldump และมีความเชี่ยวชาญในเรื่องนี้อย่างเต็มที่ ขอให้การสำรองข้อมูลทั้งหมดของคุณเป็นภาพสะท้อนของความสามารถของคุณในฐานะ MySQL DBA .... เส้นที่ยอดเยี่ยม !!!
Abdul Manaf

4
ใน InnoDB การดัมพ์ตารางทีละรายการจะให้การสำรองข้อมูลที่ไม่สอดคล้องกัน
Alain Collins

5
@ AlainCollins นี่คือสาเหตุที่ฉันรัน mysqldumps บน Slave slave ที่เป็นแบบอ่านอย่างเดียว เมื่อ Seconds_Behind_Master เป็น 0 คุณจะเรียกใช้ STOP SLAVE ตอนนี้คุณมีเวลาที่สอดคล้องกันในการทำ mysqldumps ในรูปแบบดังกล่าวข้างต้น ฉันได้ทำสิ่งนี้กับ บริษัท การค้าออนไลน์ในช่วง 5 ปีที่ผ่านมาโดยไม่มีการร้องเรียนใด ๆ กับฉันหรือเจ้าของ บริษัท ของฉัน ณ ขณะนี้ฉันทำ mysqldumps แบบขนานทุกๆ 10 นาทีสำหรับลูกค้ารายนี้ ฉันยังทำเช่นนี้กับลูกค้ารายอื่นเพื่อให้สำรองข้อมูลได้เร็วขึ้น
RolandoMySQLDBA

ฉันมี 32GB db ดังนั้นตัวเลือก 3 เป็นสิ่งที่ฉันมีอยู่ในใจ! ขอบคุณ!
Raymond

ฉันต้องสำรองและนำเข้าข้อมูล 1TB อีกครั้งเพื่อลดขนาดใหญ่ibdata1มาก ในช่วงเวลาที่ SSD ได้รับการสนับสนุนโดย RAID ฮาร์ดแวร์ตัวเลือกที่ 3 เป็นทางออกเดียวสำหรับฉัน
rabudde

18

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

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

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

การจำลองแบบ MySQL บนเครื่องเดียวกัน


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

4
+1 สำหรับการสำรองแบบจำลองเพื่อลบโหลด IO ของการสำรองข้อมูลจากฐานข้อมูลหลักและลดปัญหาการล็อคที่อาจเกิดขึ้นกับข้อแม้ที่สำคัญอย่างหนึ่ง: ระวังด้วยตัวเลือก "แบบจำลองบนเครื่องเดียวกัน" ในการทำงานของคุณบนทาส อาจแข่งขันกับต้นแบบสำหรับแบนด์วิดท์ IO - ตรวจสอบให้แน่ใจว่าไฟล์ข้อมูลของ slave นั้นเป็นไดรฟ์ / อาร์เรย์ที่แตกต่างจากต้นแบบเพื่อลดปัญหานี้
David Spillett

1
Ditto กับความคิดเห็นของ David Splllet ฉันตั้งค่าและบำรุงรักษา Master / Slaves หลายสิบเครื่องด้วยการสำรองข้อมูล mysqldump บนทาสสำหรับ My Web Hosting Employer +1 จากฉันเช่นกัน
RolandoMySQLDBA

16

แผนก: ดู Xtrabackup จาก Percona การทำเช่นนี้ช่วยให้สามารถสำรองข้อมูลออนไลน์ของ InnoDB โดยไม่มีการล็อคที่สำคัญ

Plan B: Slave สามารถหยุดได้และคุณสามารถทำการสำรองข้อมูลที่สอดคล้องโดยใช้วิธีการต่าง ๆ (คัดลอกไฟล์, mysqldump, xtrabackup, ฯลฯ )

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

แผน D: ภาพรวมของ Slave - ไม่มีเวลาหยุดทำงาน


2
Hoorah ถึงทั้งสี่แผน ฉันให้ได้แค่ +0.25 ต่อคำตอบ !!! +1 (4 x 0.25)
RolandoMySQLDBA

15

ผู้ดูแลระบบบางจุดเป็นอันดับแรก: คุณกำลังเชื่อมต่อเพื่อทำ ftp หรือคุณกำลังเข้าร่วมและกำลังจะตายใช่ไหม ถ้า ssh, ให้แน่ใจว่าใช้หน้าจอเพื่อให้คุณสามารถดำเนินการต่อหลังจากที่เกิดข้อผิดพลาด comcast หาก ftp ตรวจสอบให้แน่ใจว่าคุณบีบอัด / tar ก่อนส่ง

ลองใช้พารามิเตอร์ --opt หรือ --quick

--opt ตัวเลือกนี้จะเปิดชุดของตัวเลือกเพิ่มเติมเพื่อให้การถ่ายโอนข้อมูลและการดำเนินการโหลดมีประสิทธิภาพมากขึ้น โดยเฉพาะมันเทียบเท่ากับการใช้ตัวเลือก --add-drop-table, --add-locks, --all, --quick, --extended-insert --lock-tables และ - -isable-keys โปรดทราบว่าตัวเลือกนี้จะทำให้เอาต์พุตแบบพกพาน้อยลงและมีโอกาสน้อยที่ระบบฐานข้อมูลอื่น ๆ จะเข้าใจได้ง่ายขึ้น

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


1
- จะไม่เพิ่มขนาดของไฟล์ที่จะได้รับผลลัพธ์ในที่สุดหรือไม่
Toby

มันจะเพิ่มบางอย่าง - ฉันหมายถึงการเพิ่ม - ด่วนซึ่งเป็นคำตอบเพิ่มเติมสำหรับปัญหาของเขา .... การแก้ไขในขณะนี้ ขอบคุณ!
David Hall

+1 สำหรับหน้าจอซึ่งหลีกเลี่ยงปัญหานี้โดยสิ้นเชิง
Gaius

+1 สำหรับคำตอบที่ดีและกระชับสำหรับคำอธิบาย --opt และ --quick ของ mysqldump
RolandoMySQLDBA

1
--opt เป็นค่าเริ่มต้น
จอร์แดน

5

ฉันเคยมีปัญหากับการหมดเวลาในระหว่างการทิ้งฐานข้อมูลขนาดใหญ่เช่นกัน ในที่สุดฉันก็แก้ไขได้โดยการส่งคำสั่งแต่ละคำสั่งสำหรับทุกตารางใน db และต่อท้ายทุกสิ่งไปยังไฟล์เดียวเช่นนี้

TABLES=`mysql -u $USER -p$PWD -Bse 'show tables' $DB`
for TABLE in $TABLES
do
    mysqldump -u $USER -p$PWD $DB $TABLE >> dump.sql
done

4
นี่ถือเป็นการสำรองข้อมูล "ที่ไม่สอดคล้อง" ในการคืนค่าคุณอาจมีข้อมูลในตารางหนึ่งที่แมปไปยังอีกตารางหนึ่ง แต่ไม่มีอยู่
Morgan Tocker

3

ฉันคิดว่าคำถามเกี่ยวกับวิธีการคืนค่าเร็วขึ้นจากไฟล์ดัมพ์ที่สร้างขึ้นของ mysqldump ไม่ใช่วิธีการสำรองข้อมูลที่แตกต่างกัน

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

นี่เป็นเทคนิคที่รวดเร็วและเกือบจะได้รับการพิสูจน์แล้ว แต่ไม่แน่ใจ 100% ว่าจะต้องใช้เวลานานเท่าใดในการกู้คืนจากการทิ้งขนาดใหญ่เช่น 500G หรือมากกว่านั้น แต่ในความเห็นที่ต่ำต้อยของฉันคุณต้องมีอะไรที่ขนานกัน ชำระเงินลิงค์ด้านล่างสำหรับตัวอย่าง

[การกู้คืนแบบขนานอย่างรวดเร็วจากการทิ้ง SQL (mysqldump) สำหรับ MySQL] [1]

http://geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/fast_parallel_restore_from_sql_dumps_mysqldump_for_mysql.php

"การกู้คืนแบบขนานอย่างรวดเร็วจากการทิ้ง SQL (mysqldump) สำหรับ MySQL"


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

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