1. 首页 > 技术教程 > 正文

数据库生命线:MySQL 定时自动备份与数据恢复实操

数据库生命线:MySQL 定时自动备份与数据恢复实操

备份是数据库的生命线,没备份等于裸奔。主机选这篇 Linux 教程直接教你用 cron + mysqldump 搞定 MySQL 定时自动备份,以及如何用备份文件恢复数据,适合服务器运维和 VPS 运维实战场景。

数据库生命线:MySQL 定时自动备份与数据恢复实操的图片

一、MySQL 定时自动备份:用 cron 设置周期任务

1.1 编写备份脚本,避免手动操作

先写一个 shell 脚本,里面封装 mysqldump 命令。别问为什么,照着做就行,这是 Linux 教程里最稳的做法。

#!/bin/bash

定义备份目录和文件名,按日期生成

BACKUP_DIR=”/data/backup/mysql”
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME=”your_db_name”
DB_USER=”root”
DB_PASS=”your_password”

创建备份目录(如果不存在)

mkdir -p $BACKUP_DIR

执行备份,压缩保存

mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/$DB_NAME_$DATE.sql.gz

删除30天前的旧备份,防止磁盘撑爆

find $BACKUP_DIR -type f -name “*.sql.gz” -mtime +30 -exec rm -f {} \;

脚本写完后,记得赋予执行权限:

chmod +x /usr/local/bin/mysql_backup.sh # 赋予可执行权限

1.2 配置 cron 定时任务,自动执行

用 crontab 设置每天凌晨 2 点执行一次。万一报错了别慌,先检查 cron 服务是否运行。

crontab -e # 编辑当前用户的定时任务

添加以下行,每天凌晨2点执行备份

0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

检查 cron 状态:

systemctl status cron # 看cron是否在运行,没运行就systemctl start cron

二、数据恢复实操:从备份文件还原 MySQL

2.1 恢复单库,注意字符集和权限

恢复时先解压备份文件,再用 mysql 命令导入。老手才知道的坑:恢复前一定要确认目标库存在,否则会报错。

解压备份文件

gunzip /data/backup/mysql/your_db_name_20250315_020000.sql.gz

创建目标数据库(如果不存在)

mysql -u root -p -e “CREATE DATABASE IF NOT EXISTS your_db_name DEFAULT CHARACTER SET utf8mb4;”

恢复数据

mysql -u root -p your_db_name < /data/backup/mysql/your_db_name_20250315_020000.sql

2.2 恢复时常见的报错和处理

**报错1:ERROR 1044 (42000) – Access denied for user**
原因:备份时用了 root,恢复时用了低权限用户。
解决办法:恢复时统一用 root 账号,或者给用户授予对应库的 ALL PRIVILEGES。

**报错2:ERROR 1146 (42S02) – Table doesn’t exist**
原因:备份文件损坏,或数据库结构被修改。
解决办法:检查备份文件完整性,用 `head -n 50 backup.sql` 看看开头是否有 `CREATE TABLE` 语句。

三、老鸟叮嘱:别忽视备份文件的存储和验证

备份脚本跑通了,不代表备份文件能用。我见过太多运维把备份文件存到同一台服务器上,结果硬盘挂了,备份一起玩完。建议:

• 备份文件至少存到两块不同硬盘,或者通过 rsync 同步到另一台机器。

• 每月手动跑一次恢复测试,验证备份文件是否完整。别等到出事了才发现备份是空的。

四、FAQ:MySQL 备份恢复常见问题

**Q1:Linux 小白可以直接用 root 账号操作 MySQL 吗?**
A:可以,但生产环境建议创建专用备份账号,只给 SELECT, LOCK TABLES, SHOW VIEW 权限,避免误操作。

**Q2:备份脚本执行后没生成文件,怎么办?**
A:检查 cron 日志:`grep mysql_backup /var/log/syslog`,看脚本是否按计划执行。另外检查脚本中的路径和密码是否正确。

**Q3:VPS 防火墙端口放行后还是访问不了 MySQL?**
A:MySQL 默认端口 3306 需要放行,但还要检查 MySQL 的 bind-address 是否设置为 127.0.0.1。编辑 `/etc/mysql/mysql.conf.d/mysqld.cnf`,把 bind-address 改为 0.0.0.0 或 VPS 公网 IP,然后重启 MySQL。

**Q4:备份文件太大,磁盘空间不够怎么办?**
A:两种方案:一是压缩级别调高,用 gzip –best;二是只备份核心表,用 `mysqldump –tables table1 table2`。

**Q5:定时备份和手动恢复时,字符集乱码怎么解决?**
A:备份时加上 `–default-character-set=utf8mb4`,恢复时保持一致。如果备份文件里没指定字符集,恢复前先 set names utf8mb4。

**Q6:数据库生命线指的是什么?**
A:指备份策略是数据库的最后一道防线。没有定期备份,数据丢失后几乎无法恢复。本文的实操就是围绕这个核心展开的。

转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9450.html 商家投稿邮箱:zhujixuanblog@qq.com