目录
1.使用mysqldump进行完全备份
# 备份所有数据库并刷新二进制日志
mysqldump -u username -p -A -F > all_databases.sql
# 备份多个数据库(包含结构和数据)
mysqldump -u username -p -B db1 db2 db3 > multiple_databases.sql
本地定时备份脚本
#!/bin/bash
# 功能:分库备份、错误处理、日志记录、过期文件清理
# 配置信息
mysql_user="root"
mysql_password="Haojing@123456"
# 备份的数据库列表
backup_db_arr=("mysql" "data_cube" "zsmartcity_auth" "datax_web" "dolphinscheduler")
# 备份目录和日志文件
backup_location="/home/mysqlback"
log_file="${backup_location}/backup_$(date +%Y%m%d).log"
# 过期备份清理设置
expire_backup_delete="ON"
expire_days=15
# 邮件通知设置(可选)
enable_email_notification="OFF"
email_recipient="admin@example.com"
# 日志函数
log() {
local message="[$(date +'%Y-%m-%d %H:%M:%S')] $1"
echo "$message"
echo "$message" >> "$log_file"
}
# 邮件通知函数
send_email() {
if [ "$enable_email_notification" = "ON" ]; then
local subject="[MySQL备份] $1"
local content="$2"
echo "$content" | mail -s "$subject" "$email_recipient"
fi
}
# 初始化
mkdir -p "$backup_location"
mkdir -p "${backup_location}/error_logs"
log "=========================================="
log "开始执行 MySQL 数据库备份任务"
log "=========================================="
# 检查是否有数据库需要备份
if [ ${#backup_db_arr[@]} -eq 0 ]; then
local error_msg="错误: 没有指定需要备份的数据库!"
log "$error_msg"
send_email "备份失败" "$error_msg"
exit 1
fi
# 创建今日备份目录
backup_date=$(date +%Y-%m-%d)
backup_dir="${backup_location}/${backup_date}"
mkdir -p "$backup_dir"
# 备份每个数据库
success_count=0
total_count=${#backup_db_arr[@]}
log "开始备份数据库,总共 ${total_count} 个数据库"
for dbname in "${backup_db_arr[@]}"; do
log "正在备份数据库: $dbname"
backup_file="${backup_dir}/${dbname}_$(date +%Y%m%d%H%M).sql.gz"
error_log="${backup_location}/error_logs/${dbname}_$(date +%Y%m%d%H%M).err"
# 执行备份
mysqldump -u"$mysql_user" -p"$mysql_password" -F \
--single-transaction \
--quick \
--lock-tables=false \
"$dbname" 2> "$error_log" | gzip > "$backup_file"
# 检查备份结果
if [ $? -eq 0 ] && [ -s "$backup_file" ]; then
log "数据库 $dbname 备份成功,文件大小: $(du -h "$backup_file" | awk '{print $1}')"
success_count=$((success_count + 1))
# 检查错误日志
if [ -s "$error_log" ]; then
log "警告: 备份 $dbname 时出现非致命错误,请查看: $error_log"
else
rm -f "$error_log"
fi
else
log "错误: 数据库 $dbname 备份失败!"
if [ -f "$error_log" ]; then
log "错误详情: $(cat "$error_log")"
fi
# 删除可能生成的空文件
[ -f "$backup_file" ] && rm -f "$backup_file"
fi
done
# 清理过期备份
if [ "$expire_backup_delete" = "ON" ]; then
log "开始清理 ${expire_days} 天前的备份文件..."
find "$backup_location" -type d -mtime +"$expire_days" -exec rm -rf {} \; 2>/dev/null
log "过期备份清理完成"
fi
# 备份总结
if [ "$success_count" -eq "$total_count" ]; then
local status="成功"
local email_status="成功"
else
local status="部分失败"
local email_status="部分失败 (成功: ${success_count}/${total_count})"
fi
log "=========================================="
log "备份任务执行完毕,状态: $status"
log "成功备份: ${success_count}/${total_count} 个数据库"
log "备份目录: $backup_dir"
log "=========================================="
# 发送邮件通知
send_email "备份${email_status}" "备份日期: $backup_date\n状态: $status\n成功: ${success_count}/${total_count} 个数据库\n备份目录: $backup_dir"
2.使用二进制日志进行增量备份
二进制日志(binlog)记录了所有对数据库造成更改的 SQL 语句,启用后可以实现增量备份。
# 修改 MySQL 配置文件 my.cnf 或 my.ini
[mysqld]
log-bin = /var/log/mysql/mysql-bin.log # 启用二进制日志
server-id=1 # 服务器唯一标识(主从复制时必须)
expire-logs-days = 10 # 日志保留天数(自动清理旧日志)
# 重启 MySQL 服务使配置生效
systemctl restart mysqld
# 验证配置是否生效
SHOW VARIABLES LIKE 'log_bin'; -- 应显示 ON
SHOW VARIABLES LIKE 'binlog_format';
SHOW MASTER STATUS; -- 查看当前二进制日志信息
3.恢复备份
方案一:使用 mysqldump 备份恢复
# 恢复单个数据库
mysql -u username -p database_name < backup.sql
# 恢复时指定新数据库名
mysql -u username -p new_database_name < backup.sql
方案二:结合二进制日志进行时间点恢复
# 1. 首先恢复完整备份
mysql -u username -p database_name < backup.sql
# 2. 使用 mysqlbinlog 工具恢复增量数据
mysqlbinlog /var/log/mysql/mysql-bin.000001 | mysql -u username -p database_name
# 3. 恢复到指定时间点
mysqlbinlog --stop-datetime="2025-07-01 12:00:00" /var/log/mysql/mysql-bin.000001 | mysql -u username -p database_name