--single-transaction是mysqldump针对innodb表实现无锁一致性备份的核心参数,通过mvcc创建事务快照,全程不阻塞写入;但遇myisam表、长事务或冲突参数(如--lock-tables)会退化为锁表,必须配合--skip-lock-tables、--routines、--events及--set-gtid-purged=off等使用,并通过~/.my.cnf安全存密、gzip压缩、时间戳命名和自动清理保障生产可用性。

MySQL备份脚本必须用mysqldump加--single-transaction
直接执行mysqldump不加参数,对InnoDB表可能产生不一致快照——尤其在有长事务或写入密集时。用--single-transaction能保证导出期间数据逻辑一致,且不锁表(MyISAM表除外,它会自动退化为--lock-tables)。别信“加个-e就行”这种说法,mysqldump默认没开事务一致性。
实操建议:
- 务必指定
--skip-lock-tables配合--single-transaction,避免误触发表级锁 - 加上
--routines和--events,否则存储过程、事件不会被导出 - 用
--set-gtid-purged=OFF防止GTID环境导出失败(常见于MySQL 5.7+主从场景) - 示例命令:
mysqldump --single-transaction --skip-lock-tables --routines --events --set-gtid-purged=OFF -u root -p'password' mydb > /backup/mydb_$(date +\%F).sql
crontab里不能直接写密码,要用~/.my.cnf配认证
把密码明文写进crontab或脚本里,等于把数据库凭据挂在系统日志和进程列表上——ps aux一眼就能看到。Linux下唯一安全的做法是用~/.my.cnf文件存认证信息,并严格限制权限。
实操建议:
-
~/.my.cnf必须chmod 600 ~/.my.cnf,否则mysqldump会拒绝读取 - 内容只保留
[client]段,不要加[mysql]或[mysqld]等无关节区 - 字段名必须是
user和password,不能写成username或pwd - 示例配置:
[client] user = backup_user password = your_strong_password
备份文件要压缩、带时间戳、自动清理旧文件
每天全量导出SQL文本,不压缩的话,一个月就占几个GB;不加时间戳,恢复时根本分不清哪份是昨天的;不清理,磁盘迟早爆满——这三件事必须在脚本里一并解决,不能靠人工补救。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
实操建议:
- 用
gzip压缩,不是bzip2或xz:压缩比够用,CPU开销小,解压兼容性好 - 文件名用
$(date +\%Y\%m\%d_\%H\%M),避免空格和特殊字符影响后续脚本处理 - 用
find /backup -name "mydb_*.sql.gz" -mtime +7 -delete删7天前的,别用rm -f /backup/*.gz这种暴力清空 - 完整脚本片段:
#!/bin/bash DB_NAME="mydb" BACKUP_DIR="/backup" DATE=$(date +\%Y\%m\%d_\%H\%M) mysqldump --single-transaction --skip-lock-tables --routines --events --set-gtid-purged=OFF $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete
crontab执行失败最常见原因是环境变量缺失
你在终端能跑通的脚本,放进crontab就报command not found或mysqldump: command not found,基本就是PATH问题。crontab默认PATH极短(通常是/usr/bin:/bin),而mysqldump常装在/usr/local/mysql/bin/或/opt/mysql/bin/。
实操建议:
- 在crontab里显式声明PATH:
PATH=/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/bin - 或者直接在脚本开头写
export PATH="/usr/local/mysql/bin:$PATH" - 加日志重定向:
0 2 * * * /path/to/backup.sh >> /var/log/mysql-backup.log 2>&1,否则失败无声无息 - 测试是否生效:先手动运行
env -i PATH="$PATH" /path/to/backup.sh,模拟cron环境
备份脚本真正难的不是语法,而是让mysqldump在无人值守时每次都能拿到一致快照、不泄露密码、不撑爆磁盘、不出PATH错误——这些点漏掉任意一个,都可能让“自动备份”变成“自动失效”。










