暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

linux下,批量进行oracle数据自动备份

天气真好今天 2020-03-20
384
  1. 新建oracle_databak.sh文件,并赋予可执行权限、oracle用户权限

2.新建user.txt(用于存放oracle数据库用户名密码)文件,并赋予读写权限

3.编写oracle_databak.sh脚本

功能说明:

1.删除bakdir目录中的原文件,

脚本内容如下:

#!/bin/sh


export ORACLE_BASE=/data/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=nccd

export PATH=$ORACLE_HOME/bin:$HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export LANG=C

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

wj=/data/backup

bakdir=/data/backup/dmpback


cd $wj

#rm -rf $bakdir/*

#echo "删除原备份文件$bakdir"

#delday,可设定定时删除N天前的备份文件

delday=31

lso=$(cat user.txt | wc -l)

echo $lso 

for((line=0;"$lso" > "$line";line++));

do

userdata=$(cat user.txt |head -n $line|tail -n 1|awk -F/ '{print $1}')

passdata=$(cat user.txt |head -n $line|tail -n 1|awk -F/ '{print $2}')

date>>ora_bak_$(date +%Y%m%d).log

echo "这是第"$line"行"  >>ora_bak_$(date +%Y%m%d).log  

echo $userdata "密码" $passdata >>ora_bak_$(date +%Y%m%d).log

if [ "$userdata" = "" ];then

echo "$userdata为空">>ora_bak_$(date +%Y%m%d).log

else

echo "exp $userdata/$passdata@nccd grants=y file=$bakdir/$userdata"_"$(date +%Y%m%d).dmp log=$bakdir/$userdata"_"$(date +%Y%m%d).log" >>ora_bak_$(date +%Y%m%d).log 

#备份数据

exp $userdata/$passdata@nccd grants=y file=$bakdir/$userdata"_"$(date +%Y%m%d).dmp log=$bakdir/$userdata"_"$(date +%Y%m%d).log  

#压缩

tar -zcPf $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz $bakdir/$userdata"_"$(date +%Y%m%d).dmp $bakdir/$userdata"_"$(date +%Y%m%d).log

if [ $? -eq 0 ] ; then

echo "$userdata压缩成功">>ora_bak_$(date +%Y%m%d).log

sleep 1

#rm -rf /data/backup/dmpback/*.log

#rm -rf /data/backup/dmpback/*.dmp

#找到指定日期之前的文件,并删除

find /data/backup/dmpback -mtime +$delday -name "*.dmp" -exec rm -rf {} \;

find /data/backup/dmpback -mtime +$delday -name "*.log" -exec rm -rf {} \;

find /data/backup -mtime +$delday -name "*.log" -exec rm -rf {} \;

echo "删除dmp、log文件成功!">>ora_bak_$(date +%Y%m%d).log

#scp将指定目录的文件传送到其他linux服务器

#scp $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz root@192.168.200.37:/data/center/backup


if [ $? -eq 0 ] ; then


#rm -rf $bakdir/$userdata"_"$(date +%Y%m%d).tar.gz

echo "$(date +%Y%m%d).tar.gz传送成功">>ora_bak_$(date +%Y%m%d).log

echo -e "\n">>ora_bak_$(date +%Y%m%d).log

else

echo "传送失败">>ora_bak_$(date +%Y%m%d).log

fi

sleep 1

else

echo "压缩失败">>ora_bak_$(date +%Y%m%d).log

fi

       fi

done

echo "结束">>ora_bak_$(date +%Y%m%d).log

echo -e  "*********************************************************************************************************\n*********************************************************************************************************">>ora_bak_$(date +%Y%m%d).log


exit


4.scp命令使用前需要进行如下配置

下面是实现scp无密码登录

1)在 A 上运行 ssh-keygen -t rsa 在/root/.ssh 下生成id_rsa 和 id_rsa.pub 两个文件
在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A

2)在 B 上也同样运行 ssh-keygen -t rsa

3)在 B 的 /root/.ssh 下创建authorized_keys文件 把A 中 id_rsa.pub.A 文件 传到 B /root/.ssh 下
    通过 cat 命令 把id_rsa.pub.A 写到 authorized_keys 文件中

  scp ./id_rsa.pub.A  B的IP:/root/.ssh
   cat id_rsa.pub.A  >>  authorized_keys

测试:最终从B服务器拷贝文件到A上,就无需输入密码了

在生成密钥的过程中,一直Enter即可,否则还是需要输入设置的密码

5.设置定时执行

1)查看是否安装和运行cron

ps -ef | grep cron

rpm -qa | grep crontab

2)服务命令

service crond start    //启动服务

service crond stop     //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置

service crond status //查看服务状态

3)添加定时任务

crontab -e

4)查看已添加的定时任务

crontab -l



5)crontab格式

*      *         *         *         *            command

minute   hour    day   month   week      command
分 时 天 月 星期 命令
15 8 * * * /home/backup.sh 每天8点15执行一次脚本


答疑:

1、第一次执行scp的时候会出现warning,这时候要输入“yes”。所以脚本编写完一定要手动执行一遍,防止定时执行失败

2、在win下编写shell时,换行符为:\n\r,而在linux下为:\n ,因此在win下编写的脚本在linux下运行会报错,尽量避免这个问题。

3.https://tool.lu/crontab可计算crontab执行时间


文章转载自天气真好今天,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论