mysqldump --all-databases 會備份系統庫,且無原生「排除庫」參數。本文提供基於 grep -v 管道過濾的通用方案,解決 MySQL 5.5+ performance_schema 導致備份報錯的避坑案例,並給出生產級每日全量備份腳本。
# 獲取所有庫 -> 過濾系統庫 -> 傳給 mysqldump --databases mysql -uroot -p123456 -e 'SHOW DATABASES;' \ | grep -Ev "^Database$|information_schema|mysql|performance_schema|sys|test" \ | xargs mysqldump -uroot -p123456 --databases > backup.sql
現象:MySQL 5.5 引入 performance_schema,直接管道傳給 mysqldump 會報錯(鎖表/權限問題)。
方案一:mysqldump 端跳過鎖表
... | xargs mysqldump -uroot -p123456 --skip-lock-tables --databases > backup.sql
方案二:grep 端直接過濾掉(推薦,更乾淨)
mysql -uroot -p123456 -e 'SHOW DATABASES;' \ | grep -Ev "^Database$|information_schema|mysql|performance_schema|sys|test" \ | xargs mysqldump -uroot -p123456 --databases > backup.sql
#!/bin/bash
# 每日 02:00 執行,crontab: 0 2 * * * /scripts/mysql_backup.sh
FILE="mysql_$(date +%F)"
BACKDIR="/mysqlbackup"
CONF_FILE="/etc/my.cnf"
MAIL_TO="dba@company.com"
# 1. 邏輯備份(排除系統庫,單事務一致性,流式輸出,多值INSERT)
mysql -uroot -e 'SHOW DATABASES;' \
| egrep -v "Database|information_schema|performance_schema|mysql|sys|test" \
| xargs mysqldump -uroot --single-transaction --quick --extended-insert --databases \
> ${BACKDIR}/${FILE}.sql
# 2. 壓縮存儲
gzip ${BACKDIR}/${FILE}.sql
# 3. 備份配置文件
cp ${CONF_FILE} ${BACKDIR}/${FILE}.cnf
# 4. 校驗備份文件大小(防止空文件)
if [ ! -s ${BACKDIR}/${FILE}.sql.gz ]; then
echo "ERROR: Backup file is empty!" | mail -s "MySQL Backup FAILED" ${MAIL_TO}
exit 1
fi
# 5. 保留策略:保留 7 天
find ${BACKDIR} -mtime +7 -name "mysql_*.sql.gz" -delete
find ${BACKDIR} -mtime +7 -name "mysql_*.cnf" -delete
# 6. 發送成功通知
echo -e "Server: $(hostname)\nIP: $(hostname -I)\nDate: $(date)\nFile: ${FILE}.sql.gz\nSize: $(du -h ${BACKDIR}/${FILE}.sql.gz | cut -f1)" \
| mail -s "MySQL Backup SUCCESS" ${MAIL_TO}

${table}.sql
fi
done
# 用法:sh exclude.sh mo_log mt_log report_info
| 需求 | 方案 | 優點 | 缺點 |
|---|---|---|---|
| 排除庫 | grep -v 管道過濾 | 通用、無需修改 mysqldump | 依賴 Shell 環境 |
| 排除表 | --ignore-table | 原生參數、邏輯備份層面 | 表多時參數冗長 |
| 系統庫報錯 | 過濾 performance_schema/sys | 根治 5.5+ 備份失敗 | 需知曉版本差異 |
| 自動化 | 腳本 + crontab + 郵件通知 + 保留策略 | 生產級可運維 | 需配置郵件服務 |
將備份腳本納入版本控制、定期演練還原,才是真正的數據安全。