MySQL 数据备份流程化

背景

在 Linux 机器上用 Docker 部署了 MySQL 数据库,现在需要定期备份数据。备份策略是先在本地备份一份,然后传输到远程服务器。

环境信息:

  • MySQL 容器:mysql-db
  • 数据卷路径:/home/docker/work_root/volumes/dev-db_server_mysql_data/_data
  • 数据库:dev-db
  • Linux:centos

备份方案选择

常见的备份方式有两种:

逻辑备份(mysqldump):导出 SQL 语句,可跨版本恢复,适合中小型数据库,灵活性高。

物理备份:直接复制数据文件,速度快,适合大型数据库,但 MySQL 版本需一致。

这里选择 mysqldump 方式,因为更灵活,后续恢复也方便。

备份脚本编写

本地备份

首先实现本地备份功能:

# 创建备份目录mkdir-p ~/mysql_backups# 使用 mysqldump 导出数据库dockerexecmysql-db mysqldump -uroot -p'password'\--single-transaction\--routines\--triggers\--events\--all-databases>~/mysql_backups/backup_$(date+%Y%m%d_%H%M%S).sql# 压缩备份文件节省空间gzip~/mysql_backups/backup_*.sql

参数说明:

  • --single-transaction:保证数据一致性
  • --routines:包含存储过程和函数
  • --triggers:包含触发器
  • --events:包含事件
  • --all-databases:备份所有数据库

远程传输

备份完成后需要传输到远程服务器。使用 scp 命令,但遇到一个问题:scp 本身不支持密码参数。

解决方案是使用sshpass工具:

# 安装 sshpasssudoyuminstallsshpass -y# 传输文件sshpass -p'password'scp-oStrictHostKeyChecking=no\backup.sql.gz root@远程IP地址:/home/autotest/

这里踩了个坑:第一次传输时遇到 “Host key verification failed” 错误,返回值是 6。原因是 SSH 主机密钥验证失败,需要添加-o StrictHostKeyChecking=no参数跳过验证。

完整备份脚本

将上述功能整合成一个完整的脚本/opt/scripts/mysql_backup.sh

#!/bin/bash# 配置参数CONTAINER_NAME="mysql-db"MYSQL_ROOT_PASSWORD="password"DATABASE_NAME="all_databases"BACKUP_DIR="$HOME/mysql_backups"REMOTE_USER="root"REMOTE_HOST="IP地址"REMOTE_PASSWORD="password"REMOTE_PATH="/home/autotest/"RETENTION_DAYS=7mkdir-p$BACKUP_DIRTIMESTAMP=$(date+%Y%m%d_%H%M%S)BACKUP_FILE="$BACKUP_DIR/${DATABASE_NAME}_${TIMESTAMP}.sql"echo"=========================================="echo"MySQL 数据库备份脚本"echo"时间:$(date'+%Y-%m-%d %H:%M:%S')"echo"=========================================="# 1. 执行数据库备份echo""echo"[1/5] 开始备份数据库$DATABASE_NAME..."dockerexec$CONTAINER_NAMEmysqldump -uroot -p"$MYSQL_ROOT_PASSWORD"\--single-transaction\--routines\--triggers\--events\--set-gtid-purged=OFF\--all-databases>$BACKUP_FILEif[$?-eq0]&&[-s$BACKUP_FILE];thenecho"✓ 数据库备份成功"ls-lh$BACKUP_FILEelseecho"✗ 数据库备份失败"exit1fi# 2. 压缩备份文件echo""echo"[2/5] 压缩备份文件..."gzip$BACKUP_FILEBACKUP_FILE="${BACKUP_FILE}.gz"if[-f"$BACKUP_FILE"];thenecho"✓ 压缩完成"ls-lh$BACKUP_FILEelseecho"✗ 压缩失败"exit1fi# 3. 测试远程连接echo""echo"[3/5] 测试远程服务器连接..."sshpass -p"$REMOTE_PASSWORD"ssh\-oStrictHostKeyChecking=no\-oUserKnownHostsFile=/dev/null\-oConnectTimeout=10\${REMOTE_USER}@${REMOTE_HOST}"echo '连接成功'"2>/dev/nullif[$?-eq0];thenecho"✓ 远程服务器连接正常"elseecho"✗ 无法连接到远程服务器"exit1fi# 4. 传输到远程服务器echo""echo"[4/5] 传输文件到远程服务器..."sshpass -p"$REMOTE_PASSWORD"scp\-oStrictHostKeyChecking=no\-oUserKnownHostsFile=/dev/null\$BACKUP_FILE${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}2>/dev/nullif[$?-eq0];thenecho"✓ 文件传输成功"FILENAME=$(basename$BACKUP_FILE)REMOTE_CHECK=$(sshpass -p"$REMOTE_PASSWORD"ssh\-oStrictHostKeyChecking=no\-oUserKnownHostsFile=/dev/null\${REMOTE_USER}@${REMOTE_HOST}\"ls -lh${REMOTE_PATH}${FILENAME}2>/dev/null")if[$?-eq0];thenecho"远程文件信息:"echo"$REMOTE_CHECK"fielseecho"✗ 文件传输失败"exit1fi# 5. 清理旧备份echo""echo"[5/5] 清理旧备份文件..."DELETED=$(find$BACKUP_DIR -name"${DATABASE_NAME}_*.sql.gz"-mtime +$RETENTION_DAYS -delete -print|wc-l)echo"✓ 已删除$DELETED个超过$RETENTION_DAYS天的旧备份"echo""echo"=========================================="echo"✓ 备份任务完成!"echo"本地备份:$BACKUP_FILE"echo"远程备份:${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}$(basename$BACKUP_FILE)"echo"=========================================="

测试脚本:

chmod+x /opt/scripts/mysql_backup.sh /opt/scripts/mysql_backup.sh

配置定时任务

使用 systemd 实现定时备份,需要创建两个文件:service 文件和 timer 文件。

创建 service 文件

编辑/etc/systemd/system/mysql-backup.service

[Unit] Description=MySQL Database Backup Service After=network.target docker.service Requires=docker.service [Service] Type=oneshot User=root Group=root WorkingDirectory=/opt/scripts ExecStart=/opt/scripts/mysql_backup.sh StandardOutput=journal StandardError=journal SyslogIdentifier=mysql-backup TimeoutStartSec=1800 Restart=no [Install] WantedBy=multi-user.target

创建 timer 文件

编辑/etc/systemd/system/mysql-backup.timer

[Unit] Description=MySQL Database Backup Timer Requires=mysql-backup.service [Timer] OnCalendar=*-*-* 02:00:00 Persistent=true RandomizedDelaySec=300 OnBootSec=1min [Install] WantedBy=timers.target

配置说明:

  • OnCalendar=*-*-* 02:00:00:每天凌晨 2 点执行
  • Persistent=true:如果错过执行时间,立即执行
  • RandomizedDelaySec=300:随机延迟 0-5 分钟
  • OnBootSec=1min:启动后 1 分钟执行一次

启用定时任务

systemctl daemon-reload systemctlenablemysql-backup.timer systemctl start mysql-backup.timer# 查看定时器状态systemctl status mysql-backup.timer systemctl list-timers --all|grepmysql

查看日志

# 查看定时器日志journalctl -u mysql-backup.timer -n20# 查看备份任务日志journalctl -u mysql-backup.service -n50# 实时查看日志journalctl -u mysql-backup.service -f# 查看今天的日志journalctl -u mysql-backup.service --since today

手动触发测试

# 立即执行一次备份systemctl start mysql-backup.service# 查看执行状态systemctl status mysql-backup.service

非 Docker 环境适配

如果 MySQL 不是用 Docker 安装的,需要做以下调整:

调整 service 文件

将:

After=network.target docker.service Requires=docker.service

改为:

After=network.target mysql.service Requires=mysql.service

调整备份脚本

删除:

CONTAINER_NAME="mysql-db"

将:

dockerexec$CONTAINER_NAMEmysqldump

改为:

/opt/mysql/bin/mysqldump

同时建议删除2>/dev/null,这样能看到完整的错误信息。

踩坑记录

systemd 执行失败

手动执行脚本正常,但 systemd 执行失败,报错:

Failed at step EXEC spawning /opt/scripts/mysql_backup.sh: Exec format error

原因是脚本第一行缺少 shebang#!/bin/bash,systemd 不知道用什么解释器执行。

解决方法:确保脚本第一行是#!/bin/bash

mysqldump 命令找不到

日志显示:

/opt/scripts/mysql_backup.sh: line 27: mysqldump: command not found

但在命令行手动执行是正常的。原因是 systemd service 的 PATH 环境变量不包含 mysqldump 路径。

解决方法有三种:

  1. 使用绝对路径(推荐):将mysqldump改为/opt/mysql/bin/mysqldump(通过which mysqldumpwhereis mysqldump查看路径)
  2. 在 service 文件中设置 PATH 环境变量
  3. 在脚本开头添加export PATH=/opt/mysql/bin:$PATH

我选择了第一种方式,最简单直接。

数据恢复

如果需要恢复数据:

# 解压备份文件gunzip backup_20260113_225511.sql.gz# Docker 环境恢复dockerexec-i mysql-db mysql -uroot -p'password'<backup_20260113_225511.sql# 非 Docker 环境恢复mysql -uroot -p'password'<backup_20260113_225511.sql

总结

整个备份方案包含本地备份、远程传输、定时执行三个核心功能。使用 systemd 管理定时任务比 cron 更现代化,日志查看也更方便。

关键点:

  • mysqldump 备份灵活可靠
  • sshpass 解决密码传输问题
  • systemd 实现自动化调度
  • 定期清理旧备份节省空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给“拉票”加点WebGL:我做了个能拖拽旋转的3D星图,每一面墙都是我的代码故事(附完整源码) | 博客之星求投票

文章目录 前言一、网页效果预览二、功能和交互式体验三、 技术实现详解1. 技术栈2. 分级渲染策略3. Three.js 3D场景搭建3.1 粒子系统&#xff08;星空背景&#xff09;3.2信息墙面&#xff08;数据展示&#xff09;3.3 光线效果 4. 数据管理与模态窗口 四、完整代码五、我的拉…

AI | AI4UI(2025.12)| 论文:Beyond Prototyping: Autonomous, Enterprise-Grade Frontend Development

Beyond Prototyping: Autonomous, Enterprise-Grade Frontend Development from Pixel to Production via a Specialized Multi-Agent Framework 超越原型设计&#xff1a;通过专用多智能体框架&#xff0c;实现从像素到生产环境的自主企业级前端开发 论文链接 主要贡献: 结…

金仓数据库KingbaseES IO性能优化指南

在数据库运维的日常工作中,IO性能绝对是影响系统“跑得快不快、稳不稳”的关键因素。按木桶原理来说,IO子系统要是拖后腿,哪怕CPU、内存再强悍也没用。尤其是金仓数据库KingbaseES扛着高并发事务、海量数据查询这类…

ssm695新型药物临床药品治疗方案信息管理系系统vue

目录项目背景技术架构核心功能模块创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;项目背景 SSM695新型药物临床药品治疗方案信息管理系统基于Vue.js前端框架与SpringSpringMVCMyBatis&#xff08;SSM&#xff0…

VMware vSphere 网络+存储

vSphere 网络整体架构: 物理交换机 │vmnic(ESXi 主机物理网卡) │vSwitch / DVS │Port Group │虚拟机 / VMkernel对象 本质vmnic 物理网卡vSwitch 软件交换机DVS(Distributed Virt…

基于SpringBoot+Vue.is的社区服务平台管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一套基于SpringBootVue.js的社区服务平台管理系统&#xff0c;以解决传统社区管理中服务流程繁琐、居民诉求响应滞后、信息传递不畅、资源调度低效等痛点&#xff0c;助力社区服务数字化、管理精细化、互动便捷化升级。系统采用前后端分离架构&…

交通仿真软件:VISSIM_(14).事故与异常情况模拟

事故与异常情况模拟 在交通仿真软件中&#xff0c;事故与异常情况的模拟是评估交通系统在极端条件下的性能和安全性的关键部分。通过模拟事故和异常情况&#xff0c;可以研究交通流的动态变化、驾驶员的行为反应以及交通管理措施的有效性。本节将详细介绍如何在VISSIM中模拟事故…

ssm687网上购物超市系统vue

目录网上购物超市系统&#xff08;Vue版&#xff09;摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;网上购物超市系统&#xff08;Vue版&#xff09;摘要 该系统基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBat…

ssm688校园安全管理系统

目录SSM688校园安全管理系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM688校园安全管理系统摘要 校园安全管理系统基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发&#xff0c;旨在通过信息化手段…

基于Springboot+Vue的爱琴海购物公园网上商城系统(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一套基于SpringBootVue的爱琴海购物公园网上商城系统&#xff0c;以解决传统商场线上线下割裂、品牌商户营销渠道单一、用户购物体验不连贯、运营数据碎片化等痛点&#xff0c;搭建集商品销售、品牌运营、O2O服务、数据管控于一体的新零售服务平台…

全球股市估值与人口结构变化的关系

全球股市估值与人口结构变化的关系 关键词:全球股市估值、人口结构变化、经济增长、消费需求、投资偏好 摘要:本文旨在深入探讨全球股市估值与人口结构变化之间的关系。通过对相关核心概念的阐述、算法原理的分析、数学模型的构建以及实际案例的研究,揭示人口结构变化如何从…

救命神器2026!9大AI论文平台测评:本科生毕业论文救星

救命神器2026&#xff01;9大AI论文平台测评&#xff1a;本科生毕业论文救星 2026年AI论文平台测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI在学术写作领域的应用越来越广泛。然而&#xff0c;面对市场上琳琅满目的AI论文平台&…

ssm689医药网上药品商城销售管理系统vue

目录SSM689医药网上药品商城销售管理系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM689医药网上药品商城销售管理系统Vue摘要 该系统基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架与Vue.js前端技…

交通仿真软件:VISSIM_(17).智能交通系统(ITS)建模

智能交通系统(ITS)建模 智能交通系统&#xff08;ITS&#xff09;是现代交通管理的重要组成部分&#xff0c;利用先进的信息技术、数据通信传输技术、电子传感技术、控制技术和计算机技术等&#xff0c;对交通系统进行全方位的管理和控制。在交通仿真软件中&#xff0c;ITS建模…

提示工程架构师揭秘:Agent交互提示链设计的内幕

提示工程架构师揭秘&#xff1a;Agent交互提示链设计的内幕 1. 引入与连接&#xff1a;为什么有些Agent像“没听懂话”&#xff1f; 一个让用户崩溃的对话场景 某天&#xff0c;你想订一家海边酒店&#xff0c;打开旅游APP的智能助手Agent&#xff0c;对话如下&#xff1a; 你&…

ssm692手机销售库存管理系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM692手机销售库存管理系统基于Vue.js前端框架与Spring、Spring MVC、MyBatis&#xff08;SSM&#xff09;后端架构开发&…

搞定模型版本管理提速

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 智能缓存与增量更新&#xff1a;模型版本管理的提速革命目录智能缓存与增量更新&#xff1a;模型版本管理的提速革命 引言 现有挑战&#xff1a;版本管理的系统性瓶颈 智能缓存机制&…

ssm694网上家教管理系统vue

目录系统概述技术架构核心功能创新点应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 SSM694网上家教管理系统是基于Vue.js前端框架与SSM&#xff08;SpringSpringMVCMyBatis&#xff09;后端架构开发的在线教…

交通仿真软件:VISSIM_(13).交通仿真数据处理与分析

交通仿真数据处理与分析 在交通仿真软件VISSIM中&#xff0c;数据处理与分析是确保仿真结果准确性和有效性的关键步骤。本节将详细探讨如何在VISSIM中进行数据处理与分析&#xff0c;包括数据的导入、预处理、仿真结果的导出以及如何使用外部工具进行进一步分析。 数据导入 1. …

ssm681网络教学系统vue

目录SSM681网络教学系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM681网络教学系统Vue摘要 SSM681网络教学系统是基于Spring、SpringMVC、MyBatis&#xff08;SSM&#xff09;框架与Vue.js前端技术构建的现代化…