Nếu tất cả cơ sở dữ liệu của bạn chỉ sử dụng InnoDB, tôi có một số tin tốt.
Bạn nên kết xuất tất cả các cơ sở dữ liệu song song từ một nô lệ.
Trong thực tế, bạn có thể buộc tất cả các cơ sở dữ liệu vào cùng một thời điểm.
Điều đầu tiên cần nhớ về Slave là không bắt buộc phải đăng nhập nhị phân nếu nó không phải là Master cho các nô lệ khác.
Bạn không thể sử dụng --master-data
tùy chọn cho các bãi chứa song song vì mỗi bãi chứa sẽ có một vị trí khác nhau được ghi ở dòng 22 của mỗi tệp kết xuất. Tốt hơn là ghi lại tệp nhật ký cuối cùng của Master và định vị Slave được thực thi bằng cách sử dụng SHOW SLAVE STATUS\G
. Bằng cách đó, tất cả các cơ sở dữ liệu có cùng một vị trí tại thời điểm.
Bạn có thể thu thập tất cả các cơ sở dữ liệu và kịch bản kết xuất song song của tất cả các cơ sở dữ liệu.
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;"
Nếu đơn giản là có quá nhiều cơ sở dữ liệu, hãy kết xuất chúng 10 hoặc 20 tại một thời điểm như sau:
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;"
Nếu bạn cần khôi phục một bảng duy nhất, bạn có thể kết xuất song song các bảng 20 tại một thời điểm theo thứ tự kích thước.
Thử đi:
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;"
Bây giờ bạn có các tập lệnh để kết xuất cơ sở dữ liệu hoặc các bảng riêng lẻ, bạn có thể tải dữ liệu đó theo ý của mình. Nếu bạn cần để SQL được thực thi từ các bản ghi nhị phân trên bản gốc, bạn có thể sử dụng mysqlbinlog
và đặt cho nó vị trí ot datetime và xuất SQL sang các tệp văn bản khác. Bạn chỉ cần thực hiện thẩm định để tìm ra lượng dữ liệu bạn cần từ bất kỳ dấu thời gian nào mà nhật ký bnary có. Chỉ cần nhớ rằng dấu thời gian của nhật ký nhị phân trong HĐH thể hiện lần cuối cùng được viết.