MySQLPump:利用并行參數(shù)高效備份數(shù)據(jù)庫
前言
在MySQL數(shù)據(jù)庫管理中,備份是保障數(shù)據(jù)安全與業(yè)務(wù)連續(xù)性的關(guān)鍵環(huán)節(jié)。隨著數(shù)據(jù)量的不斷增長(zhǎng),傳統(tǒng)備份方式逐漸暴露出效率瓶頸。MySQL 5.7引入的mysqlpump工具,以其強(qiáng)大的多線程備份能力、豐富特性和靈活配置,為數(shù)據(jù)庫備份工作帶來了新的解決方案。
圖片
核心特性
并行處理加速備份
mysqlpump支持并行備份多個(gè)數(shù)據(jù)庫或表,顯著提升備份速度。通過調(diào)整并行度參數(shù),如--default-parallelism和--parallel-schemas,可以根據(jù)服務(wù)器資源靈活分配任務(wù),充分利用多核CPU的優(yōu)勢(shì),將備份時(shí)間大幅縮短。
實(shí)時(shí)進(jìn)度一目了然
備份過程中,進(jìn)度顯示功能讓管理員隨時(shí)掌握備份狀態(tài),不再為漫長(zhǎng)的備份過程感到焦慮。這一特性有助于及時(shí)發(fā)現(xiàn)潛在問題,比如備份停滯或速度過慢,從而及時(shí)調(diào)整策略。
壓縮功能節(jié)省空間
它內(nèi)置對(duì)LZ4和ZLIB算法的支持,在備份時(shí)直接壓縮輸出,有效減少備份文件體積,節(jié)省存儲(chǔ)空間。這不僅降低了存儲(chǔ)成本,還加快了備份文件的傳輸速度,方便異地存儲(chǔ)和災(zāi)備。
權(quán)限與用戶備份
能夠選擇性地備份用戶賬戶和權(quán)限,確保在恢復(fù)數(shù)據(jù)時(shí),用戶的訪問權(quán)限也能一并恢復(fù),避免因權(quán)限丟失導(dǎo)致的訪問問題,保障系統(tǒng)安全。
靈活過濾精準(zhǔn)備份
提供了豐富的過濾選項(xiàng),如--exclude-databases、--exclude-tables、--include-databases和--include-tables,可以精準(zhǔn)選擇需要備份的對(duì)象,排除不必要的數(shù)據(jù),提高備份效率。
使用指南
連接選項(xiàng)配置
連接MySQL數(shù)據(jù)庫時(shí),常用選項(xiàng)包括--user(用戶名)、--password(密碼)、--host(主機(jī)名)、--port(端口號(hào))和--socket(socket文件路徑),確保與數(shù)據(jù)庫建立正確連接。
備份選項(xiàng)設(shè)置
- 并行度設(shè)置:--default-parallelism=N用于設(shè)置默認(rèn)并行度,--parallel-schemas=[N:]db_list可針對(duì)特定數(shù)據(jù)庫指定并行度。
- 事務(wù)與索引處理:--single-transaction確保事務(wù)一致性,--defer-table-indexes則延遲索引創(chuàng)建,加快數(shù)據(jù)加載速度。
- 數(shù)據(jù)篩選:利用--exclude-databases和--exclude-tables排除特定數(shù)據(jù)庫和表,--include-databases和--include-tables選擇備份特定對(duì)象。
- 其他選項(xiàng):--users備份用戶賬戶,--skip-definer省略DEFINER子句,--skip-dump-rows只備份結(jié)構(gòu)不備份數(shù)據(jù)。
輸出選項(xiàng)調(diào)整
--result-file=file_name指定備份輸出文件,--set-gtid-purged=value控制是否添加SET @@GLOBAL.GTID_PURGED語句,影響數(shù)據(jù)恢復(fù)時(shí)的GTID處理。
使用示例
部分庫表結(jié)構(gòu)備份
假設(shè)業(yè)務(wù)中存在一些測(cè)試庫,僅需備份其表結(jié)構(gòu)用于后續(xù)開發(fā)環(huán)境搭建,可利用--include-databases和--skip-dump-rows選項(xiàng)。例如有test_dev1和test_dev2兩個(gè)測(cè)試庫:
mysqlpump -u root -p --include-databases=test_dev1,test_dev2 --skip-dump-rows > test_dev_structure.sql
其中old_data_table數(shù)據(jù)穩(wěn)定無需備份
mysqlpump -u root -p test_dev1 --exclude-tables=old_data_table > test_dev_structure.sql
提高并行度可以顯著加快備份速度
mysqlpump -u root -p --default-parallelism=8 --parallel-schemas=4:test_dev1,test_dev2 > large_backup.sql
壓縮備份
mysqlpump -u root -p test_dev1 --compress-output=LZ4 > backup.lz4
恢復(fù)備份
mysql -u root -p < test_dev_structure.sql
對(duì)于壓縮備份,先解壓再恢復(fù)
lz4_decompress backup.lz4 backup.sql
mysql -u root -p < backup.sql
mysqlpump和mysqldump參數(shù)區(qū)別總匯:
功能 | mysqldump | mysqlpump | 說明 |
不導(dǎo)出表中的數(shù)據(jù),只導(dǎo)出結(jié)構(gòu) | -d, --no-data | -d, --skip-dump-rows | |
輸出導(dǎo)入時(shí)的錯(cuò)誤日志 | --log-error=name | -log-error-file=name | |
導(dǎo)出用戶和權(quán)限 | 無相關(guān)參數(shù) | --users | |
排除對(duì)象 | 無相關(guān)參數(shù) | --exclude-databases=name --exclude-events=name --exclude-routines=name --exclude-tables=name --exclude-triggers=name --exclude-users=name | |
指定包含的對(duì)象 | 無相關(guān)參數(shù) | --include-databases=name --include-events=name --include-routines=name --include-tables=name --include-triggers=name --include-users=name | |
導(dǎo)出指定表 | --tables | --include-databases=name --include-tables=name | mysqldump:使用--tables參數(shù)跟庫名表名,表名之間空格隔開。mysqlpump:導(dǎo)出表需要同時(shí)使用--include-tables和--include-databases參數(shù),如果只指定--include-tables=bm那么就會(huì)導(dǎo)出所有庫中bm表,表名之間逗號(hào)隔開。 |
insert插入包含多個(gè)值 | --extended-insert | --extended-insert=# | mysqlpump:定義一個(gè)insert語句包含多少個(gè)值,默認(rèn)一個(gè)insert包含250個(gè)值。 |
導(dǎo)出時(shí)在CREATE TABLE前DROP TABLE IF EXISTS | --add-drop-table | --add-drop-table |
備份腳本示例
#!/bin/bash
# MySQLpump備份腳本
# 基礎(chǔ)配置
DB_HOST="192.168.0.1"
DB_PORT=3306
DB_USER="backup_user"
DB_PASS="xxxxxxxxxxx"
DATABASES="testdb"
BACKUP_DIR="/data/backup"
TS=$(date +%Y_%m_%d)
BACKUP_FILE="${BACKUP_DIR}/mysqlbak_${DATABASES}_${TS}.sql"
LOG_FILE="${BACKUP_DIR}/backup_${TS}.log"
PARALLEL_THREADS=4 # 設(shè)置并行線程數(shù)(根據(jù)CPU數(shù),一般設(shè)置為CPU一半)
# 記錄開始時(shí)間
echo"[$(date +'%F %T')] 備份開始,使用 ${PARALLEL_THREADS} 個(gè)線程" | tee -a ${LOG_FILE}
# 執(zhí)行備份命令
mysqlpump -h${DB_HOST} -u${DB_USER} -p"${DB_PASS}" -P${DB_PORT} \
--default-parallelism=${PARALLEL_THREADS} \
--parallel-schemas=${PARALLEL_THREADS}:${DATABASES} \
--single-transaction \
--set-gtid-purged=off \
--default-character-set=utf8mb4 \
--compress-output=LZ4 \
--defer-table-indexes \
--skip-definer \
--exclude-databases=mysql,sys,information_schema,performance_schema \
--log-error=${LOG_FILE} \
--result-file=${BACKUP_FILE} \
2>> ${LOG_FILE}
# 檢查結(jié)果
if [ $? -eq 0 ] && [ -f ${BACKUP_FILE} ]; then
# 獲取壓縮后的文件大小
BACKUP_SIZE=$(du -sh ${BACKUP_FILE} | awk '{print $1}')
echo"[$(date +'%F %T')] 備份成功,文件:${BACKUP_FILE} (大小: ${BACKUP_SIZE})" | tee -a ${LOG_FILE}
# 可選:解壓備份文件驗(yàn)證完整性
# lz4_decompress ${BACKUP_FILE} ${BACKUP_FILE%.lz4}
# echo "[$(date +'%F %T')] 備份已解壓驗(yàn)證" | tee -a ${LOG_FILE}
else
echo"[$(date +'%F %T')] 備份失敗!請(qǐng)檢查日志:${LOG_FILE}" >&2
exit 1
fi