mysql的备份与恢复(使用mysqldump)
目录
1.使用mysqldump进行完全备份
2.使用二进制日志进行增量备份
3.恢复备份
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" ]; thenlocal 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 ]; thenlocal 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[@]}"; dolog "正在备份数据库: $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" ]; thenlog "数据库 $dbname 备份成功,文件大小: $(du -h "$backup_file" | awk '{print $1}')"success_count=$((success_count + 1))# 检查错误日志if [ -s "$error_log" ]; thenlog "警告: 备份 $dbname 时出现非致命错误,请查看: $error_log"elserm -f "$error_log"fielselog "错误: 数据库 $dbname 备份失败!"if [ -f "$error_log" ]; thenlog "错误详情: $(cat "$error_log")"fi# 删除可能生成的空文件[ -f "$backup_file" ] && rm -f "$backup_file"fi
done# 清理过期备份
if [ "$expire_backup_delete" = "ON" ]; thenlog "开始清理 ${expire_days} 天前的备份文件..."find "$backup_location" -type d -mtime +"$expire_days" -exec rm -rf {} \; 2>/dev/nulllog "过期备份清理完成"
fi# 备份总结
if [ "$success_count" -eq "$total_count" ]; thenlocal status="成功"local email_status="成功"
elselocal status="部分失败"local email_status="部分失败 (成功: ${success_count}/${total_count})"
filog "=========================================="
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