0

0

mysql数据库的备份与恢复的自动化脚本

P粉602998670

P粉602998670

发布时间:2026-01-14 00:15:33

|

158人浏览过

|

来源于php中文网

原创

生产环境全库备份需用mysqldump加--single-transaction、--routines、--triggers、--events、--default-character-set=utf8mb4、--hex-blob、--set-gtid-purged=OFF,并强制TCP连接、按时间戳命名+gzip压缩,且脚本中所有命令须写绝对路径。

mysql数据库的备份与恢复的自动化脚本

mysqldump 做全库备份,关键在参数组合

直接执行 mysqldump -u root -p database_name 很容易失败,不是权限问题就是锁表中断。生产环境必须加 --single-transaction(InnoDB 专用)和 --routines --triggers --events,否则存储过程、触发器会丢失。--skip-lock-tables 要慎用——它不适用于 MyISAM 表,且可能造成备份不一致。

实际脚本中建议固定使用:

  • --default-character-set=utf8mb4:避免中文乱码
  • --hex-blob:安全导出 BLOB 类型(如图片、加密字段)
  • --set-gtid-purged=OFF:关闭 GTID 记录,否则恢复时可能报错 ERROR 1840 (HY000)
  • 加上 -h 127.0.0.1 强制走 TCP 连接,绕过 Unix socket 权限限制

按日期自动命名 + 压缩归档,防止磁盘写满

不带时间戳的备份文件会互相覆盖,而裸 SQL 文件体积大、传输慢。脚本里必须用 $(date +\%Y\%m\%d_\%H\%M) 生成唯一文件名,并立刻用 gzip 压缩。别用 bzip2xz——它们压缩快但 CPU 占用高,夜间备份可能拖慢数据库响应。

示例片段(Shell):

DB_NAME="myapp"
DUMP_FILE="/backup/${DB_NAME}_$(date +\%Y\%m\%d_\%H\%M).sql.gz"
mysqldump -h 127.0.0.1 -u backup_user -p'xxx' --single-transaction --routines --triggers --events --set-gtid-purged=OFF --default-character-set=utf8mb4 "$DB_NAME" | gzip > "$DUMP_FILE"

注意:backup_user 需提前授权:GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON \`myapp\`.* TO 'backup_user'@'localhost';

用 mysql 命令恢复时,忽略错误比中断更实用

直接 mysql -u root -p database_name 遇到已存在表、重复主键就会停住。线上恢复不能人工干预,得加 --force 参数让命令跳过错误继续执行。但要注意:--force 不会跳过语法错误,所以备份前务必验证 SQL 可执行性(可用 mysql -e "source /path/to/backup.sql;" 测试)。

互连在线双语商务版
互连在线双语商务版

全自动化、全智能的在线方式管理、维护、更新的网站管理系统主要功能如下:一、系统管理:管理员管理,可以新增管理员及修改管理员密码;数据库备份,为保证您的数据安全本系统采用了数据库备份功能;上传文件管理,管理你增加产品时上传的图片及其他文件。二、企业信息:可设置修改企业的各类信息及介绍。 三、产品管理:产品类别新增修改管理,产品添加修改以及产品的审核。四、订单管理:查看订单的详细信息及订单处理。 五、

下载

恢复脚本关键点:

  • 先创建空库:mysql -e "CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  • 再导入:zcat "$DUMP_FILE" | mysql -u root -p'xxx' --force "$DB_NAME"
  • 最后检查行数是否明显异常(比如比上次少 90%),可加一句 mysql -Nse "SELECT COUNT(*) FROM $DB_NAME.table1" 做简单校验

crontab 定时任务要避开高峰,且必须重定向日志

每天凌晨 2 点跑备份看似合理,但如果数据库凌晨有批量导入或报表任务,IO 就会打满。建议设为 0 3 * * * (3 点)并配合 ionice -c2 -n7 降低 IO 优先级。

crontab 行必须带完整路径和日志重定向,否则失败了根本看不到报错:

0 3 * * * /usr/bin/ionice -c2 -n7 /bin/bash /opt/scripts/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1

最容易被忽略的是:脚本里所有命令(mysqldumpmysqldate)都要写绝对路径,cron 默认 PATH 很窄,which mysqldump 结果才是真实路径。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 789人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号