功能简介
- 备份指定数据库到指定文件
-
第一版代码
结构
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" ]; then
echo "请传入数据库文件";
return 1;
fi
# 默认保留两个
local remain_number=2;
if [[ -n "$2" && $(( ($2+0) > 0)) ]]; then
remain_number=$1;
fi
local i=0;
local dir=~/database_backup/data/$1;
for sql in $(ls -t "$dir")
do
((i++))
if [ "$i" -le "$remain_number" ]; then
continue;
fi
rm -rf "$dir/$sql";
done
}
备份数据库函数
backup_db()
{
log_dir=~/database_backup;
# 必要参数验证
if [ -z "$1" ]; then
echo "请输入数据库名称";
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)" ]; then
log "$log_dir/error.txt" <"$tmp";
fi
if [ "$?" -eq 0 ]; then
echo "数据库$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.sh
backup_db "$database_name"
del_sql "$database_name";
zhengshi.sh 代码
# 请直接用bash命令执行
# 微笑优品 小程序数据库 备份脚本
# 配置备份数据库
database_name="zhengshi"
script_dir=$(dirname $0);
. $script_dir/backup.sh
backup_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常用的调试除错方式 - 条件判断,字符串,数组。用得少,不熟悉,用起来不是很灵活。
-
改进空间
配置项改进,脚本中有多处重复代码
- 临时文件的删除
- 删除多余备份文件函数中,删除多余备份文件优化改进