功能简介

  1. 备份指定数据库到指定文件
  2. 能够设置保留的备份文件的个数,自动清除多余的数据库备份文件

    第一版代码

    结构

    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

    1. log_dir=$1;

    fi

    if [ -n “$log” ]; then

    1. echo -e "[$(date +%Y%m%d%H%M%S)] $log" >> "$log_dir";

    fi

}

删除多余备份文件

del_sql() {

  1. # 传入数据库名称
  2. if [ -z "$1" ]; then
  3. echo "请传入数据库文件";
  4. return 1;
  5. fi
  6. # 默认保留两个
  7. local remain_number=2;
  8. if [[ -n "$2" && $(( ($2+0) > 0)) ]]; then
  9. remain_number=$1;
  10. fi
  11. local i=0;
  12. local dir=~/database_backup/data/$1;
  13. for sql in $(ls -t "$dir")
  14. do
  15. ((i++))
  16. if [ "$i" -le "$remain_number" ]; then
  17. continue;
  18. fi
  19. rm -rf "$dir/$sql";
  20. done

}

备份数据库函数

backup_db() {
log_dir=~/database_backup;

  1. # 必要参数验证
  2. if [ -z "$1" ]; then
  3. echo "请输入数据库名称";
  4. exit;
  5. fi
  6. # 备份目录
  7. dir=~/database_backup/data/$1;
  8. if [ ! -d "$dir" ]; then
  9. # 不存在的情况
  10. mkdir -p "$dir" || exit 2;
  11. fi
  12. # 备份文件名称
  13. name="$(date +%Y%m%d%H%M).sql";
  14. # 备份数据库
  15. tmp=$(mktemp);
  16. '/usr/local/mysql/bin/mysqldump' -uroot -p=weixiaotx741 -B "$1" >"$dir/$name" 2>"$tmp";
  17. # 记录日志
  18. if [ -n "$(cat $tmp)" ]; then
  19. log "$log_dir/error.txt" <"$tmp";
  20. fi
  21. if [ "$?" -eq 0 ]; then
  22. echo "数据库$1备份成功" | log "$log_dir/success.txt";
  23. fi
  24. # 删除临时文件
  25. rm -rf "$tmp";

}

  1. <a name="m23Vz"></a>
  2. #### weixiao.sh 代码
  3. ```bash
  4. # 请直接用bash命令执行
  5. # 微笑优品 小程序数据库 备份脚本
  6. # 配置备份数据库
  7. database_name="weixiao"
  8. script_dir=$(dirname $0);
  9. . $script_dir/backup.sh
  10. backup_db "$database_name"
  11. del_sql "$database_name";

zhengshi.sh 代码

  1. # 请直接用bash命令执行
  2. # 微笑优品 小程序数据库 备份脚本
  3. # 配置备份数据库
  4. database_name="zhengshi"
  5. script_dir=$(dirname $0);
  6. . $script_dir/backup.sh
  7. backup_db "$database_name"
  8. del_sql "$database_name";

总结

基础不牢

  1. 输出输入重定向及管道。命令从什么地方获取数据?命令输出结果显示在哪里?在编写的时候,真是一塌糊涂。linux输入输出重定向
  2. bash常用的调试方式。echo -e "[$(date +%Y%m%d%H%M%S)] $log" >> "$log_dir"; 因为 $log_dir这个变量写错,查了很久的资料,才发现是写错变量了。也有对重定向不熟悉的原因。 bash-shell常用的调试除错方式
  3. 条件判断,字符串,数组。用得少,不熟悉,用起来不是很灵活。
  4. 如何后台执行?

    改进空间

  5. 配置项改进,脚本中有多处重复代码

  6. 临时文件的删除
  7. 删除多余备份文件函数中,删除多余备份文件优化改进