mysqldump 和 mysql 是 php 自动化备份恢复最直接可控的底层工具;需显式指定全路径、用配置文件安全传密、innodb 用 --single-transaction、恢复前须创建库并指定库名。

mysqldump 和 mysql 是 PHP 项目自动化备份恢复最直接、最可控的底层工具,不依赖框架、不引入额外抽象层,适合生产环境稳定运行。用 PHP 调用它们本身没问题,但关键在**怎么调、在哪调、谁来执行、错在哪**。
PHP 调用 exec() 执行 mysqldump 时找不到命令
常见现象:mysqldump: command not found,$return 返回 127。
根本原因不是没装 mysqldump,而是 PHP 进程(如 www-data 或 nginx 用户)的 PATH 环境变量里不包含其所在路径(通常是 /usr/bin 或 /usr/local/mysql/bin)。
- 不要改系统全局
PATH,风险高且不必要 - 必须显式写全路径:
/usr/bin/mysqldump(先用which mysqldump确认) - 密码绝不能拼在命令行里(
-p'xxx'会被ps aux窥见),改用配置文件方式 - 配置文件权限必须是
600:chmod 600 /tmp/backup.cnf - 示例安全调用:
exec("/usr/bin/mysqldump --defaults-file=/tmp/backup.cnf mydb > /backup/mydb_$(date +\%Y%m%d).sql 2>&1", $output, $return)
备份时加 --single-transaction 还是 --lock-tables
取决于你的表引擎构成:
- 纯
InnoDB:无条件用--single-transaction—— 它启动一致性快照,业务写入几乎不受影响 - 含
MyISAM表:--single-transaction对它无效,此时要么停写,要么接受部分表可能不一致,或直接切物理备份(如Percona XtraBackup) -
--lock-tables会锁住所有表(哪怕只导一个库),高并发下极易引发连接堆积和超时 - 建议组合:
--single-transaction --routines --triggers --events(覆盖存储过程、触发器、事件)
恢复 SQL 文件时报 ERROR 1044 (42000): Access denied for user
这个错八成不是权限问题,而是 MySQL 客户端没指定目标数据库上下文。
SQL 文件里如果没有 USE mydb;,或者开头的 CREATE DATABASE 被注释/跳过/被权限禁止,mysql 命令就会在空库中执行建表语句,报错。
- 恢复前必须手动创建空库:
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" - 导入时必须指定库名:
mysql -u user -p mydb (注意 <code>mydb在命令末尾) - 不要指望 SQL 文件自带
CREATE DATABASE—— 生产环境通常禁用该权限,且多实例下容易误创建到错误实例 - 如果 SQL 文件较大,可加
--force忽略非致命错误,但需配合日志检查
自动备份脚本里最容易被忽略的三个点
自动化 ≠ 写完 cron 就完事。以下三点出问题时,往往要等到真出事才暴露:
-
$return非 0 才值得看$output;返回值 2=连接失败,12=权限拒绝,14=表不存在——不同码对应不同排查方向 - 备份文件名含空格或特殊字符(如
date('Y-m-d H:i:s'))会导致 shell 解析失败;应统一用下划线或连字符:date('Y-m-d_H-i-s') - 没做磁盘空间预警:
df -h /backup应作为脚本前置检查项,空间不足时发告警并退出,而不是静默覆盖或写失败
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











