用 mysqldump 与 openssl 管道加密备份最稳妥,需指定 -pbkdf2、-iter、-md sha256 等参数确保兼容性;php 调用时应使用绝对路径、tcp 连接、配置文件传密,解密须参数严格一致,大库需分表导出避免超时。

用 mysqldump + openssl 一步完成加密备份
直接在 shell 层把导出和加密串起来最稳,避免中间生成明文 SQL 文件。PHP 本身不擅长处理大文件流式加密,硬用 openssl_encrypt() 容易内存溢出或乱码。
-
mysqldump输出直接通过管道交给openssl enc -aes-256-cbc,不落地明文 - 密钥必须用
-pbkdf2衍生,别用裸密码;加盐(-salt)是默认行为,不用显式写 - 务必指定
-md sha256,旧版 OpenSSL 默认用 md5,新版本已弃用,不写可能报错Unknown cipher - 示例命令:
mysqldump -u root -p database_name | openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -md sha256 -out backup.sql.enc
PHP 调用系统命令时的权限与路径陷阱
PHP 执行 exec() 或 shell_exec() 备份,常卡在找不到 mysqldump 或权限拒绝——不是代码问题,是环境配置偏差。
-
mysqldump路径未必在$PATH里,用which mysqldump查准路径,硬编码进命令(如/usr/bin/mysqldump) - Web 服务器用户(如
www-data)可能没权限读取 MySQL socket 或连本地数据库,改用-h 127.0.0.1强制走 TCP,避开 socket 权限问题 - 密码不能明写在命令行(
-p123456),会被ps aux看见;改用配置文件方式:~/.my.cnf设好[client]段,再加--defaults-extra-file=/full/path/to/.my.cnf - 输出文件路径要确保 Web 用户有写权限,且目录存在;别用相对路径,一律用绝对路径
解密时必须严格匹配加密参数
加密用了什么参数,解密就得一模一样,差一个 -iter 或 -md 就只会报 bad decrypt,不会提示哪错了。
- 解密命令不是简单把
enc换成dec,完整应为:openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -md sha256 -in backup.sql.enc -out backup.sql
- 如果加密时没加
-pbkdf2,解密也别加;但建议始终启用,否则密钥强度太弱 - PHP 中用
openssl_decrypt()解密二进制内容前,得先base64_decode()—— 因为openssl enc默认 base64 编码输出,而 PHP 的加密函数默认处理原始字节
大库导出时的超时与分片问题
单表超 500MB 或总大小过 2GB,PHP 脚本容易超时、内存耗尽,mysqldump 自身也可能被 MySQL 的 max_allowed_packet 截断。
- PHP 设置要调:
set_time_limit(0)、ini_set('memory_limit', '-1')(仅限 CLI 环境,Web 下慎用) -
mysqldump加--single-transaction --skip-lock-tables减少锁表影响;对 MyISAM 表则必须用--lock-tables,否则备份不一致 - 真正稳妥的做法是按表分片导出:
mysqldump ... table1 > t1.sql、mysqldump ... table2 > t2.sql,再分别加密,失败只重试单表 - 压缩不是必须前置步骤——AES 加密后文件熵值已接近随机,再用
gzip压缩几乎不减体积,反而增加 I/O 和 CPU 开销
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











