封装数据库备份的通用Shell函数需支持MySQL、PostgreSQL、SQLite,接收类型、名称、用户、密码/配置、目录5个参数,用getopts解析,校验必填项,统一绝对路径,导出后压缩命名、清理旧文件并校验完整性。

封装数据库备份的通用 Shell 函数,核心是把重复逻辑抽离成可复用、易配置、带错误处理的模块,而不是每次写一个完整脚本。重点不在“能跑”,而在“好改、好查、好嵌入、不裸奔密码、能验结果”。
定义函数骨架与必需参数
函数至少接收数据库类型、名称、用户名、密码(或配置文件路径)、备份目录这 5 个关键输入。用位置参数或命名参数均可,推荐用命名参数提升可读性:
- 用getopts支持-t mysql -d myapp -u backup -c ~/.my.cnf -o /backup这类调用
- 必填项缺失时直接echo 错误 + exit 1,不静默失败
- 所有路径统一用realpath转为绝对路径,避免相对路径在 cron 中失效
适配不同数据库的导出命令
函数内部用case $db_type in分发逻辑,覆盖主流场景:
- MySQL / MariaDB:优先走~/.my.cnf(需提前chmod 600), fallback 到-u -p;加--single-transaction(InnoDB)或--lock-all-tables(MyISAM)保证一致性
- PostgreSQL:用pg_dump -U $user -h localhost -F c -v生成自包含格式,便于后续pg_restore
- SQLite:直接sqlite3 $db_path ".backup $backup_file",轻量且原子
- 每种分支都检查$?,失败立即return 1
统一打包、命名与清理策略
导出成功后,执行标准化后处理:
- 文件名含$(date +%Y%m%d_%H%M%S)和数据库名,例如mysql_myapp_20261009_120522.sql.gz
- 用gzip -9压缩(小体积优先),或pigz加速(多核)
- 清理旧文件用find $backup_dir -name "*.sql.gz" -mtime +7 -delete,不依赖ls | tail这种易出错排序
- 最后校验:gzip -t $file && zcat $file | head -n 10 | grep -q "CREATE TABLE",确认不是空包或损坏
调用示例与集成建议
函数写完后,可单独测试,也能嵌入定时任务:
- 测试调用:backup_db -t mysql -d wordpress -c ~/.my.cnf -o /backup
- 写进 crontab:0 2 * * * /bin/bash -c 'source /opt/lib/backup.sh && backup_db -t mysql -d app -c /etc/mysql/backup.cnf -o /backup'
- 务必在函数开头显式设置PATH=/usr/local/bin:/usr/bin:/bin,避开 cron 环境变量缺失问题


















