Linux怎么编写脚本定期打包备份MySQL数据库并上传异地

老婷大大_6096

老婷大大_6096

2026-10-08

765人浏览

原创

最稳妥的mysql备份方案是用mysqldump配合gzip压缩、crontab定时执行、rsync异地同步及条件清理。需规避root硬编码、时区与权限陷阱,使用~/.my.cnf存凭据(600权限),加--single-transaction等参数确保一致性,文件名含日期,crontab显式声明path并转义%号,rsync优先于scp,上传成功后再清理旧备份,并校验gzip完整性和sql头部。

linux怎么编写脚本定期打包备份mysql数据库并上传异地

用 mysqldump 生成可压缩的 SQL 备份文件

直接调用 mysqldump 是最稳妥的逻辑起点,但必须避开权限和时区陷阱。不要用 root 用户硬编码在脚本里,改用配置文件方式加载凭据:~/.my.cnf(权限必须设为 600),内容如下:

[client]
user = backup_user
password = your_secure_password
host = localhost

备份命令建议带 --single-transaction --routines --triggers --events,尤其对 InnoDB 表能避免锁表;加上 --set-gtid-purged=OFF 可防止 GTID 导致恢复失败。文件名务必含日期,例如:

mysqldump --all-databases | gzip > "/backup/mysql_$(date +\%Y\%m\%d_\%H\%M).sql.gz"

用 crontab 实现定时执行,但要注意环境变量缺失

crontab 默认不加载你的 shell profile,PATH 很可能不含 /usr/bin 或 /usr/local/bin,导致 mysqldump 找不到。要么在 crontab 条目开头显式声明 PATH:

PATH=/usr/local/bin:/usr/bin:/bin
0 2 * * * /bin/bash /home/backup/mysql_backup.sh

要么在脚本第一行用绝对路径调用命令,比如 /usr/bin/mysqldump。另外,crontab 中的 % 是特殊字符,必须转义,否则任务会静默失败。

上传到异地用 rsync 比 scp 更可靠

scp 传大文件容易断、无法续传;rsync 支持增量同步、断点续传、带宽限制,更适合备份场景。关键参数组合是:

DrugBank 数据库
DrugBank 数据库

访问并分析来自 DrugBank 数据库的全面药物信息,包括药物属性、相互作用、靶点、通路、化学结构和药理学数据。用于药物数据、药物发现研究、药理学研究、药物-

下载
  • -avz:归档+详细+压缩
  • --delete-after:删远端多余文件前先完成传输
  • --bwlimit=2000:限速 2MB/s,避免占满带宽
  • -e "ssh -p 2222":指定非标 SSH 端口(如有)

上传前建议先用 rsync --dry-run 测试路径和权限是否通。如果目标是对象存储(如 AWS S3、腾讯云 COS),就别硬刚 rsync,直接用官方 CLI 工具,比如 aws s3 cp 或 coscli upload,它们原生支持分块上传和失败重试。

清理本地旧备份要防误删,且得配合上传结果判断

不能无脑 find /backup -name "*.sql.gz" -mtime +7 -delete。必须等上传成功后再删,否则网络抖动导致上传失败,本地又清空,就彻底没备份了。推荐写成条件链式操作:

if rsync -avz --bwlimit=2000 /backup/mysql_*.sql.gz user@remote:/data/backup/; then
  find /backup -name "mysql_*.sql.gz" -mtime +7 -delete
else
  echo "Upload failed, keep local files" | logger -t mysql-backup
fi

日志用 logger 而不是写文件,避免磁盘写满影响 MySQL。另外,mtime 是按修改时间算的,而备份文件是刚生成的,所以它实际生效依赖你是否在 gzip 后再做一次 touch —— 更稳妥的做法是用 -name "mysql_$(date -d '7 days ago' +\%Y\%m\%d)*.sql.gz" 按文件名日期删。

异地备份真正难的不是命令拼写,而是上传失败后有没有通知、旧备份删没删错、以及恢复时发现 SQL 文件头部有乱码或截断——这些都得靠每次生成后加一句 gzip -t 和 head -n 1 校验。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2113

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1299

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

755

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2852

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4768

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1099

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5031

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4462

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5854

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.9万人学习

PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 181人学习