หากฐานข้อมูลทั้งหมดของคุณใช้ InnoDB เท่านั้นฉันมีข่าวดี
คุณควรทำการดัมพ์ฐานข้อมูลทั้งหมดพร้อมกันจากสเลฟ
ในความเป็นจริงคุณสามารถบังคับให้ฐานข้อมูลทั้งหมดเป็นจุดในเวลาเดียวกัน
สิ่งแรกที่ต้องจดจำเกี่ยวกับ Slave คือไม่จำเป็นต้องเปิดใช้งานการบันทึกแบบไบนารีหากไม่ใช่ Master สำหรับ Slaves อื่น
คุณไม่สามารถใช้--master-data
ตัวเลือกสำหรับการถ่ายโอนข้อมูลแบบขนานเนื่องจากแต่ละการถ่ายโอนข้อมูลจะมีตำแหน่งที่แตกต่างกันเขียนที่บรรทัดที่ 22 ของแต่ละไฟล์การถ่ายโอนข้อมูล SHOW SLAVE STATUS\G
มันจะดีกว่าที่จะบันทึกแฟ้มบันทึกโทสุดท้ายและตำแหน่งทาสดำเนินการโดยใช้ ด้วยวิธีนี้ฐานข้อมูลทั้งหมดมีตำแหน่งจุดในเวลาเดียวกัน
คุณสามารถรวบรวมฐานข้อมูลทั้งหมดและสคริปต์การถ่ายโอนข้อมูลแบบขนานของฐานข้อมูลทั้งหมด
DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}
for DB in `cat ${DBLIST}`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
mysql -h... -u... -p... -e"START SLAVE;"
หากมีฐานข้อมูลมากเกินไปให้ดัมพ์ 10 หรือ 20 ครั้งต่อไปนี้:
DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}
COMMIT_LIMIT=20
COMMIT_COUNT=0
for DB in `cat ${DBLIST}`
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
wait
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
mysql -h... -u... -p... -e"START SLAVE;"
หากคุณต้องการกู้คืนตารางเดียวคุณสามารถขนานตารางการถ่ายโอนข้อมูล20 ครั้งในลำดับขนาด
ลองสิ่งนี้:
TBLIST=/tmp/ListOfTablesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY data_length" > ${DBLIST}
COMMIT_LIMIT=20
COMMIT_COUNT=0
for DBTB in `cat ${TBLIST}`
do
DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
DUMPFILE=$DB-{DB}-TBL-${TB}.sql.gz
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} ${TB} | gzip > ${DUMPFILE} &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
wait
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
mysql -h... -u... -p... -e"START SLAVE;"
ตอนนี้คุณมีสคริปต์เพื่อถ่ายโอนฐานข้อมูลหรือแต่ละตารางคุณสามารถโหลดข้อมูลตามดุลยพินิจของคุณ หากคุณต้องการรับ SQL ที่ดำเนินการจากบันทึกไบนารีบนต้นแบบคุณสามารถใช้mysqlbinlog
และกำหนดตำแหน่ง datetime และส่งออก SQL ไปยังไฟล์ข้อความอื่น ๆ คุณเพียงแค่ต้องทำการตรวจสอบสถานะอย่างละเอียดเพื่อหาปริมาณข้อมูลที่คุณต้องการจากบันทึกเวลาใดก็ตามที่มีในบันทึกของ bnary เพียงจำไว้ว่าการบันทึกเวลาไบนารีทุกรายการในระบบปฏิบัติการแสดงให้เห็นว่าครั้งล่าสุดที่มันถูกเขียน