一、问题
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
网友评论