当前位置: 首页 > news >正文

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
http://www.lryc.cn/news/580320.html

相关文章:

  • pyinstaller打包教程
  • TCP数据的发送和接收
  • 闲庭信步使用SV搭建图像测试平台:第三十一课——基于神经网络的手写数字识别
  • Ubuntu基础(监控重启和查找程序)
  • 模块三:现代C++工程实践(4篇)第一篇《C++模块化开发:从Header-only到CMake模块化》
  • Redis的编译安装
  • LabVIEW电阻率测试
  • LinkedList剖析
  • Kafka消息积压全面解决方案:从应急处理到系统优化
  • idea的使用小技巧,个人向
  • 类图+案例+代码详解:软件设计模式----适配器模式
  • 【电赛培训】运算放大器、滤波器
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 堆的简单介绍
  • 智链万物:人工智能驱动的产业智能化革命
  • 使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
  • Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘
  • 解决el-select数据类型相同但是显示数字的问题
  • 【Project】基于kafka的高可用分布式日志监控与告警系统
  • C#扩展方法全解析:给现有类型插上翅膀的魔法
  • CMake基础:条件判断详解
  • 探索 Ubuntu 上 MongoDB 的安装过程
  • [Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
  • 若 VSCode 添加到文件夹内右键菜单中显示
  • 03_性能优化:让软件呼吸更顺畅
  • ABB焊接机器人智能节气仪
  • App爬虫工具篇-appium配置
  • AWS WebRTC:通过shell分析viewer端日志文件
  • 查看linux中steam游戏的兼容性