编写备份脚本
新建目录
用于存放当前用户下的自定义定时任务脚本
# 新建定时任务脚本存放目录
mkdir -p /home/myCron;
新建文件
touch /home/myCron/backup_pg.sh;
授予可执行权限
chmod +x /home/myCron/backup_pg.sh;
编写删除脚本
vim /home/myCron/backup_pg.sh
键入键盘的 i 键 ,粘贴 脚本,然后键入以下内容,键入的 esc 键,shift+: ,输入 wq 后 回车保存。
# 定时备份 pg 库数据,每次备份前先删除指定大于指定间隔的备份
# 获取本机ip
host_ip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
# pg 备份文件的存放位置,不存咋则会新建
pg_backup_data_path=/data/backup_db/pg;
# pg dump执行命令所在目录
pg_dump_sh_path=/usr/pgsql-11/bin/pg_dump;
# pg 数据库 主机名称或ip(若在本地请使用127.0.0.1)
pg_database_host=$host_ip;
echo 'pg_database_host is '$pg_database_host;
# pg 数据库端口
pg_database_port=5432;
# pg 用户权限
pg_database_role=postgres;
# pg 用户名
pg_database_user=postgres;
# pg 密码,根据实际清空填写
pg_database_password=password@dba;
# pg 备份的数据库名称,根据实际情况填写
backup_database_name=db_name
# 备份文件的后缀名
backup_file_suffix=.backup;
# 删除备份数据与当前时间的间隔天数,根据实际情况填写
delete_backup_data_interval=15;
# 当天的时间
now_date=`date +%Y-%m-%d`;
declare -a not_delete_file_arr;
# 获得间隔时间内的备份文件名称
for ((i=0; i<$delete_backup_data_interval; i++))
do
not_delete_file_arr[$i]=$pg_backup_data_path'/'`date -d "-$i day " +%Y-%m-%d`'_'$backup_database_name'_'$host_ip''$backup_file_suffix;
done
# 当前目录下的所有文件
exist_backup_file_str=`find $pg_backup_data_path -name *$backup_database_name*$backup_file_suffix`;
#要将$a分割开,可以这样:
OLD_IFS="$IFS"
IFS=","
exist_backup_file_str_arr=($exist_backup_file_str)
IFS="$OLD_IFS"
# 查找备份文件信息
for exist_name in ${exist_backup_file_str_arr[@]}
do
isNeedDelete=1;
for not_delete_name in ${not_delete_file_arr[@]}
do
# 删除备份
if [ $exist_name = $not_delete_name ]; then
isNeedDelete=0;
break;
fi;
done;
if [ $isNeedDelete = 1 ]; then
echo ''$exist_name' 备份需要删除';
rm -rf $exist_name;
fi;
done;
# 新建备份目录(若不存在)
if [ ! -d $pg_backup_data_path ]; then
mkdir -p $pg_backup_data_path;
echo $pg_backup_data_path' 备份文件存放目录不存在,已经自动创建';
fi;
# 最新的备份文件名称:日期_数据库名称(数据库ip)+备份文件后缀,示例:2022-06-15_test_127.0.0.1.backup
now_backup_file_path=$pg_backup_data_path/$now_date'_'$backup_database_name'_'$host_ip''$backup_file_suffix;
# 备份文件至当前服务器
echo '开始备份【'$backup_database_name'】数据至本地服务器'
$pg_dump_sh_path "host=$pg_database_host port=$pg_database_port user=$pg_database_user password=$pg_database_password dbname=$backup_database_name" --role "$pg_database_role" --format custom --blobs --encoding UTF8 --verbose --file "$now_backup_file_path"
echo '结束备份【'$backup_database_name'】数据至本地服务器,备份位置'$now_backup_file_path;
# 若文件需要同时备份至其他服务器,可以只有scp命令。
# 备份文件至 192.168.1.13 centOs 服务器
echo '开始备份【'$backup_database_name'】数据至【192.168.1.13 centOs 】服务器'
# 示例,当前备份文件同步复制至 192.168.1.13 服务器的 /data/backup_database/postgresql 目录
file_server_backup_path=/data/backup_database/postgresql;
# 注意,服务器之间需要配置免密登录,scp 复制目录时需要添加 -r 参数
scp $now_backup_file_path root@192.168.1.13:$file_server_backup_path
echo '结束备份【'$backup_database_name'】数据至【192.168.1.13 centOs 】服务器'
vim 用法参考:https://www.runoob.com/linux/linux-vim.html
脚本添加至定时任务
crontab -e
# 添加以下脚本并保存(时间可自行调整),并删除记录日志
0 12 * * * /home/myCron/backup_pg.sh >> /home/myCron/backup_pg.log 2>&1;
# 若定时任务没有生效,重载定时任务
systemctl restart crond;
# 查看编写的定时任务
crontab -l;
0 12 * * * /home/myCron/backup_pg.sh >> /home/myCron/backup_pg.log 2>&1;
注意:Linux crontab 命令参考:https://www.runoob.com/linux/linux-comm-crontab.html
Linux Crontab 定时任务参考: https://www.runoob.com/w3cnote/linux-crontab-tasks.html
免密登录配置
服务器
当前服务器 | 目标服务器 | 备注 |
---|---|---|
192.168.1.12 | 192.168.1.13 |
生成授权密匙
# 生成密匙,一致点击回车直至结束,密匙默认存放位置/root/.ssh/
ssh-keygen;
复制密匙至目标服务器
方式一
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.13;
# 输入目标服务器密码回车即可
方式二
cat /root/.ssh/id_rsa.pub | ssh root@192.168.1.13 'cat >> /root/.ssh/authorized_keys';
# 输入目标服务器密码回车即可