shell

【Shell】20天学会shell脚本命令(4)用shell脚本

2019-12-25  本文已影响0人  ahtzc2017

一、问题

1.1、环境
电脑环境:Windows 10;
数据库环境:Oracle 11g;
JDK环境: Jdk1.8;
Docker版本:Server Version: 19.03.3
1.2、问题
如何利用shell脚本编写Oracle数据库备份脚本呢?
本文原文地址:51CTO博客

二、解答

2.1、第1版;
初始版本的shell

#!/bin/bash
#auto backup oracle
#define PATH 定义路径变量
echo "----------数据库备份开始----------"
echo "----------开始准备环境变量----------"
export ORACLE_BASE=C:/softWareInstalled/oracle
export ORACLE_HOME=$ORACLE_BASE/oracleInstalled/product/11.2.0TZC/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin:.
export ORACLE_SID=PETS
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CURDATE=$(date '+%Y%m%d%H%M%S')
echo "----------当前系统系统日期为=[$CURDATE]----------"
backup_directory=/opt/backup/
echo "----------备份目录为=[$backup_directory]----------"
data_file_prefix=pets
BACKUP_FILE=$backup_directory/pets$CURDATE.dmp

delete_prev_month_data_file(){
    echo "----------开始删除5天前的数据----------"
    premonth=$(date -d"5 days ago"  '+%Y%m%d')
    rm -rf $backup_directory/$data_file_prefix$premonth* || true
    echo "----------删除5天前的记录完毕----------"
}

echo "----------开始备份当日=[$CURDATE]数据----------"
exp pets/pets@PETS FILE=$BACKUP_FILE owner='pets'
echo "----------备份完毕!----------"
delte_prev_month_data_file
echo ‘"----------删除5天前的历史数据完毕----------"
exit 0

#Use oracle dump backup 使用备份数据库
/usr/bin/my

运行后的结果截图:

在这里插入图片描述
在搜索了【Message 206 not found;】报错之后,【仅次于狼的博客】表示:这是由于系统没有找到ORACLE_HOME导致;但是看上面的代码,我们命名已经设置了ORACLE_HOME啊,后来想明白了,我用的是Docker,Docker的C盘不是这么写的,于是在命令行输入:
pwd

查看当前路径为:
/c/softWareInstalled/Docker Toolbox/test/shell ;所以,我们要把【C:/】改成【/c/】;运行截图如下:


在这里插入图片描述

还是老问题,还是没有找到ORACLE_HOME;接下来,我做两个方面的操作:
1、将关键的路径都打印出来;
2、查找oracle目录下的路径,发现:


在这里插入图片描述
我自己目录下的BIN是大写的。。。。。。
修改完执行:
在这里插入图片描述

然后再命令行跳到日志中打印的ORACLE_HOME目录:

cd /c/softWareInstalled/oracle/oracleInstalled/product/11.2.0TZC/dbhome_1 
在这里插入图片描述
原来问题出在这里;再对比了一下,果然是路径写错了;修改后运行:
在这里插入图片描述
这里说,无法打开C盘下的Program.DMP来写入:可能是写入权限不够;因为我电脑只有C盘,好多目录不然写;正当我准备修改文件时,发现上图中大于号后面是让我输入东西的,后来输入了一个y,可以导出了:
在这里插入图片描述
结果,在我当前目录下就出现了一个这个文件:
在这里插入图片描述
很明显,这就是我要备份的数据库DMP文件;所以接下来如果要完善它,就需要让他备份到可以写入的目录,而不是每次都要我手动授权才备份;于是,我修改了备份的路径;再次执行,bingo,成功!!!
在这里插入图片描述
桌面上就出现了我需要备份的目录:
在这里插入图片描述
2.2、定时任务
crontab -e
0 5 * * * /opt/app/oracle/bin/backup.sh
0 1 * * * /opt/backup/bin/backup_rfile.sh

这里的cron表达式只支持,分时日月周;跟完整的表达式相比,缺少了秒和年;

第一个*表示分钟 每小时的第几分钟执行 0-59

第二个*表示小时 每天的第几个小时执行 0-23

第三个*表示日期 每月的第几天执行 1-31

第四个*表示月历 每年的第几个月执行 1-12

第五个*表示星期 每周的第几天执行 0-6

本篇说明内容完毕;
附录:最终版本的shell脚本:

#!/bin/bash
#auto backup oracle
#define PATH 定义路径变量
echo "----------数据库备份开始----------"
echo "----------开始准备环境变量----------"
export ORACLE_BASE=/c/softWareInstalled/oracle/oracle
export ORACLE_HOME=$ORACLE_BASE/oracleInstalled/product/11.2.0TZC/dbhome_1
echo "----------ORACLE_HOME=[$ORACLE_HOME]----------"

export PATH=$PATH:$ORACLE_HOME/BIN:.
#echo "----------PATH=[$PATH]----------"

export ORACLE_SID=PETS
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
CURDATE=$(date '+%Y%m%d%H%M%S')
echo "----------当前系统系统日期为=[$CURDATE]----------"
backup_directory=/c/Users/Auther/Desktop/bak
echo "----------备份目录为=[$backup_directory]----------"
data_file_prefix=pets
BACKUP_FILE=$backup_directory/pets$CURDATE.dmp

delete_prev_month_data_file(){
    echo "----------开始删除5天前的数据----------"
    premonth=$(date -d"5 days ago"  '+%Y%m%d')
    rm -rf $backup_directory/$data_file_prefix$premonth* || true
    echo "----------删除5天前的记录完毕----------"
}

echo "----------开始备份当日=[$CURDATE]数据----------"
exp pets/pets@ORCL FILE=$BACKUP_FILE owner='pets'
echo "----------备份完毕!----------"
delte_prev_month_data_file
echo ‘"----------删除5天前的历史数据完毕----------"
exit 0

#Use oracle dump backup 使用备份数据库
/usr/bin/my

三、总结

欢迎关注我的
CSDN博客https://blog.csdn.net/River_Continent
微信公众号:幕桥社区

在这里插入图片描述
知乎:张牧野, https://www.zhihu.com/people/zhang-mu-ye-37-76/activities
简书https://www.jianshu.com/u/02c0096cbfd3
上一篇 下一篇

猜你喜欢

热点阅读