备份服务器数据的脚本
目录
使用方法:
- 创建文件
.bakdir
- 将需要备份的文件夹或文件路径保存到该文件,如下文件格式说明:
1 2 3 4 5 6 7 8 9 10
/etc/cron.d /root/proj /root/shfiles /root/dockers /srv /data/wwwroot/default/index.html /usr/local/nginx/conf/vhost/ nginx.conf rewrite/ wildcard/
- 绝对的文件路径,使用
/
开头,如/usr/local/nginx/conf/vhost/
- 相对的文件路径时,使用非
/
开头,与上一行同一个父级目录,如:1 2 3
/usr/local/nginx/conf/vhost/ nginx.conf rewrite
nginx.conf
=>/usr/local/nginx/conf/nginx.conf
rewrite
=>/usr/local/nginx/conf/rewrite
- 绝对的文件路径,使用
- 执行脚本
1 2 3 4 5
# 保存到临时文件夹 bash migrate.sh # 保存到指定的文件夹 bash migrate.sh target
- 脚本文件:
migrate.sh
#!/usr/bin/env bash
set -euo pipefail
main() {
sync_path=${1:-}
bak_file=".bakdir"
if [ ! -f "$bak_file" ]; then
printf "\n\033[1;31mNot found file:\033[0m %s\n" "$bak_file"
exit 1
fi
if [ -d "$sync_path" ]; then
printf "\n\033[1;031mFolder is exists:\033[0m %s\n" "$sync_path"
exit 1
fi
if [ -n "$sync_path" ]; then
mkdir "$sync_path"
else
sync_path=$(mktemp -d -t bak.data_XXXXXX)
fi
if [ ! -d "$sync_path" ]; then
printf "\n\033[1;31mNot found:\033[0m %s\n" "$sync_path"
exit 1
fi
echo "Backuping."
# 读取备份文件列表
bak_list=$(cat "$bak_file")
# 进入同步目录
pushd "${sync_path}" >/dev/null 2>&1 || exit 1
prev_dir=""
# 遍历备份文件列表
while read -r line; do
if echo "$line" | grep '^/'; then
prev_dir=$(dirname "$line")
else
line="$prev_dir/$line"
fi
if [ -f "$line" ] || [ -d "$line" ]; then
rsync -a --relative "$line" ./
else
echo "警告: $line 不存在或不是文件/目录"
fi
done <<< "$bak_list"
# 返回原目录
popd >/dev/null 2>&1 || exit 1
printf "Backup done:\n\033[1;33m%s\033[0m\n" "$sync_path"
}
main "$@" || exit 1
# 1. 若使用 oneinstack,请记住要备份整站(数据库和网站),然后再备份,即
# 先安装备份信息:
# ./oneinstack/backup_setup.sh
# 再备份数据:
# ./oneinstack/backup.sh
# 同步到目标服务器:
# rsync -av --relative "/data/backup" remote:/data
# 注意:应该直接备份到目标站点,防止空间不足
# 2. 将所有需要备份的数据迁移到目录 migrate 后,需要再将此目录同步到目标服务器
# rsync -av --relative ./migrate remote:/migrate
# 3. 若是迁移的源服务器、目标服务器均为腾讯云服务,可以使用 rclone 工具备份到 COS,以方便恢复数据。
# 详情,请查阅 rclone 官方文档:https://rclone.org/
# 其它云平台同理(按 rclone 支持的对象存储,比如阿里云等云服务商),走内网不需要流量。
#
# 使用方法:
# # 备份列表 .bakdir
# /srv/dir/mydir2
# mydir3 => /srv/dir/mydir3
#
# # 保存到临时文件夹
# bash migrate.sh
#
# # 保存到指定的文件夹
# bash migrate.sh target