前言
项目需要将数据库文件异地备份,数据库是每天增量备份的。利用 crontab、scp、sshpass 定时传输备份文件。crontab配置定时任务。scp用于文件传输,默认端口为22。sshpass用于自动输入密码。
一、scp
scp 的基本使用为:
scp -r “源文件或文件夹” “目标服务器账号@目标服务器ip:目标文件夹”
-r 文件夹中所有子目录都会复制
需要注意:目标文件夹要提前创建好
# scp -r "源文件或文件夹" "目标服务器账号@目标服务器ip:目标文件夹"
[root@ecs-202377154157 test]# cd /root/test/
[root@ecs-202377154157 test]# ls
test_2024_03_25_02_00_45 test_2024_03_26_02_00_45 test_2024_03_27_02_00_45
[root@ecs-202377154157 test]# scp -r "/root/test" "root@192.168.1.21:/root"
root@192.168.1.21's password: #需要输入目标服务器的用户密码
test_2024_03_25_02_00_45 100% 134 3.3KB/s 00:00
test_2024_03_26_02_00_45 100% 134 3.9KB/s 00:00
test_2024_03_27_02_00_45 100% 134 3.9KB/s 00:00
二、sshpass
scp 命令需要输入密码,sshpass可以自动输入,省事。
sshpass -p “目标服务器密码” scp -r “源文件或文件夹” “目标服务器账号@目标服务器ip:目标文件夹”
[root@ecs-202377154157 test]# sshpass -p "123456" scp -r "/root/test" "root@192.168.1.21:/root"
三、sh文件
文件按天创建,每天只需要传输最新的文件即可
[root@ecs-202377154157 test]# ll -h
total 0
drwxr-xr-x 2 root root 162 Mar 25 02:01 test_2024_03_25_02_00_45
drwxr-xr-x 2 root root 162 Mar 26 02:01 test_2024_03_26_02_00_45
drwxr-xr-x 2 root root 162 Mar 27 02:01 test_2024_03_27_02_00_45
写shell命令,获取每天新生成的文件,并传输。newermt 筛选的是文件夹更新时间,当前目录也会筛选出来,所以要加个判断,判断是不是当前目录:/root/test,是的话跳过,只传输子目录
[root@ecs-202377154157 datadisk]# vi remote_backup.sh
#!/bin/bash
# 当天的时间
pecified_time=$(date +'%Y-%m-%d')
# 要搜索的文件目录
search_directory="/root/test"
# 远程服务器的用户名和IP
remote_user="root"
remote_ip="192.168.1.21"
# 远程服务器的目标目录
remote_directory="/root/test"
# 查找指定时间之后修改的文件
files_to_copy=$(find "$search_directory" -type d -newermt "$specified_time")
# 循环复制文件到远程服务器
for file in $files_to_copy; do
if [ "$file" != "$search_directory" ] #判断是不是当前目录:/root/test,是的话跳过,只传输子目录
then
echo $file
sshpass -p 'Dhhah455@$' scp -r "$file" "$remote_user@$remote_ip:$remote_directory/"
fi
done
四、crontab
添加crontab定时任务,定时执行传输命令。
编辑crontab任务:crontab -e
查看crontab任务:crontab -l
[root@ecs-202377154157 ~]# crontab -e
0 5 * * * /root/test/remote_backup.sh #每天5点执行remote_backup.sh
[root@ecs-202377154157 ~]# crontab -l
0 5 * * * /root/test/remote_backup.sh