功能简介
- 备份指定数据库到指定文件
-
第一版代码
结构
backup.sh:主模块,函数库文件
weixiao.sh:调用模块,根据配置项,备份对应的数据库
zhengshi.sh:调用模块,根据配置项,备份对应的数据库代码
backup.sh 文件
```bash
记录日志
log() { log=”$(cat)”; local log_dir=/tmp/custom_log.txt; if [[ -n “$1” && -d “${1%\/*}” ]]; then
log_dir=$1;
fi
if [ -n “$log” ]; then
echo -e "[$(date +%Y%m%d%H%M%S)] $log" >> "$log_dir";
fi
}
删除多余备份文件
del_sql() {
# 传入数据库名称if [ -z "$1" ]; thenecho "请传入数据库文件";return 1;fi# 默认保留两个local remain_number=2;if [[ -n "$2" && $(( ($2+0) > 0)) ]]; thenremain_number=$1;filocal i=0;local dir=~/database_backup/data/$1;for sql in $(ls -t "$dir")do((i++))if [ "$i" -le "$remain_number" ]; thencontinue;firm -rf "$dir/$sql";done
}
备份数据库函数
backup_db()
{
log_dir=~/database_backup;
# 必要参数验证if [ -z "$1" ]; thenecho "请输入数据库名称";exit;fi# 备份目录dir=~/database_backup/data/$1;if [ ! -d "$dir" ]; then# 不存在的情况mkdir -p "$dir" || exit 2;fi# 备份文件名称name="$(date +%Y%m%d%H%M).sql";# 备份数据库tmp=$(mktemp);'/usr/local/mysql/bin/mysqldump' -uroot -p=weixiaotx741 -B "$1" >"$dir/$name" 2>"$tmp";# 记录日志if [ -n "$(cat $tmp)" ]; thenlog "$log_dir/error.txt" <"$tmp";fiif [ "$?" -eq 0 ]; thenecho "数据库$1备份成功" | log "$log_dir/success.txt";fi# 删除临时文件rm -rf "$tmp";
}
<a name="m23Vz"></a>#### weixiao.sh 代码```bash# 请直接用bash命令执行# 微笑优品 小程序数据库 备份脚本# 配置备份数据库database_name="weixiao"script_dir=$(dirname $0);. $script_dir/backup.shbackup_db "$database_name"del_sql "$database_name";
zhengshi.sh 代码
# 请直接用bash命令执行# 微笑优品 小程序数据库 备份脚本# 配置备份数据库database_name="zhengshi"script_dir=$(dirname $0);. $script_dir/backup.shbackup_db "$database_name"del_sql "$database_name";
总结
基础不牢
- 输出输入重定向及管道。命令从什么地方获取数据?命令输出结果显示在哪里?在编写的时候,真是一塌糊涂。linux输入输出重定向
- bash常用的调试方式。
echo -e "[$(date +%Y%m%d%H%M%S)] $log" >> "$log_dir";因为 $log_dir这个变量写错,查了很久的资料,才发现是写错变量了。也有对重定向不熟悉的原因。 bash-shell常用的调试除错方式 - 条件判断,字符串,数组。用得少,不熟悉,用起来不是很灵活。
-
改进空间
配置项改进,脚本中有多处重复代码
- 临时文件的删除
- 删除多余备份文件函数中,删除多余备份文件优化改进
