CentOS下定时自动备份远程ORACLE数据库的实现
- 准备工作
- 执行安装
- 备份
- 问题总结
准备工作
首先你要知道你的机器有没有安装oracle相关的支持软件。例如oracle客户端什么的,这样你才可以执行相关的备份命令。如果是一台全新的机器那就跟我一起把软件安装一下,首先要去到oracle的官网
下载oracle客户端工具 我的机器是64位的,所以我要下载64位的支持软件,当前最新版本是21.3,那就下载这个好了。
直接最新版就可以了,不行就拉到页面最下方看看各版本客户端的兼容情况,反正我的服务端版本是12.3,下载21.3的客户端没什么问题。理论是是可以向下兼容的。
上面三个包分别是核心客户端、sqlplus、和相关的工具包,前俩都是比较基础的包,必不可少,第三个是我们执行备份命令必须要用到的工具包。这样一次性下载的好处是不用去oracle服务端软件上copy相关的执行程序了,一站式安装就可以了。之前看了一堆博客搞了一下午也没搞明白,去官网一看,原来人家都已经讲很明白了,该提供的都在官网了,很方便。
执行安装
把上面几个包拖到服务器执行rpm的安装命令就可以了
rpm -ivh 具体包名
顺序也有要求,不然安装会报依赖错误。先安装核心client,然后是sqlplus,最后安装数据泵相关tools
安装完配置一下环境变量就ok啦,如果跟我安装同样版本的话,可以直接复制我下面的就可以了,版本不一样的话就改个版本号。
配置环境变量命令
vi ~/.bash_profile
版本号就是这个ORACLE_VERSION
export PATH
export ORACLE_VERSION=21
export ORACLE_HOME=/usr/lib/oracle/$ORACLE_VERSION/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#export NLS_LANG="Simplified Chinese_china".ZHS16GBK
export PATH=$PATH:$ORACLE_HOME/bin
环境变量生效
source ~/.bash_profile
然后就可以执行相关oracle命令了。
备份
备份的话我们这里使用刚刚安装exp命令。由于需要实现定时自动的备份,这里搭配shell脚本来进行使用。
脚本内容
#!/bin/sh
#db_backups_conf.txt文件路径
db_backups_conf="/opt/dumpshell/config.txt"
#判断文件是否存在
if [ -f "${db_backups_conf}" ]; then
echo $(date +'%Y-%m-%d %H:%M:%S')" 数据库配置信息文件存在,开始进行数据备份"
#获取等号前内容,作为map中的Key值
dbArrOne=($(awk -F'[=]' '{print $1}' ${db_backups_conf}))
#获取等号后内容,作为map中的value值
dbArrTwo=($(awk -F'[=]' '{print $2}' ${db_backups_conf}))
#创建一个空map
declare -A map=()
#通过循环,将db_backups_conf配置文件中的信息存储在map中
for ((i = 0; i < ${#dbArrOne[@]}; i++)); do
map[${dbArrOne[i]}]=${dbArrTwo[i]}
done
saveDbStr=${map["saveDb"]}
#获取默认的字符串分隔符
old_ifs="$IFS"
#设置字符串分隔符为逗号
IFS=","
#将用户名的value值的字符串进行分隔,获取一个数组
saveDbArr=($saveDbStr)
#将字符串的分隔符重新设置为默认的分隔符
IFS="$old_ifs"
#获取当前年月日
saveday=$(date +%Y%m%d)
#获取超出备份天数的年月日
delday=$(date -d ${map["backupsFileDay"]}' days ago' +%Y%m%d)
#遍历要备份的用户名,删除两天前备份的数据文件
for delDb in ${saveDbArr[@]}; do
echo $(date +'%Y-%m-%d %H:%M:%S')" 删除文件:"${map["backupsFileStr"]}/${delDb}_database_${delday}.dmp
rm -f ${map["backupsFileStr"]}/${delDb}_database_${delday}.dmp
done
#遍历要备份的数据库,备份数据文件
for saveDb in ${saveDbArr[@]}; do
echo $(date +'%Y-%m-%d %H:%M:%S')" 备份数据库:"${saveDb}
${map["expdpStr"]} ${map["username"]}/${map["password"]}@${map["ipStr"]}:${map["portNumber"]}/${map["serviceName"]} file=${map["directoryName"]}/expdp_${saveDb}_database_${saveday}.dmp owner=${map["saveDb"]}
done
echo $(date +'%Y-%m-%d %H:%M:%S')" 数据备份完毕,脚本执行完毕"
else
echo "文件不存在"
fi
脚本配置文件
username=用户名
password=密码
ipStr=ip地址
portNumber=端口
serviceName=服务名
directoryName=/data/dumpdata
backupsFileDay=30
expdpStr=exp
saveDb=备份的库
每次备份的话删除30天以上的备份的内容。
搭配下面的定时任务命令即可实现每周备份一次
#每周五凌晨1:10执行备份数据库脚本
10 1 * * 5 /home/root/dump_oracle.sh
问题总结
- 备份过程中报错,ORACLE error 1455 encountered converting column overflows integer datatype,oracle服务端版本bug,升级版本即可。
- 执行脚本提示exp命令找不到,这个需要更改配置文件的编码格式为unix,具体操作为 进入vi编辑器模式 输入:set ff=unix即可解决。
- 除了exp命令外也可以使用expdp命令,大同小异,此处不赘述。
- 出现这个警告:EXP-00091: Exporting questionable statistics.,也可以使用下面的方法解决
- 定时任务crontab执行报找不到exp命令,这是因为环境变量的问题,可以在配置文件的执行脚本那里填写全路径,比如:/usr/oracle/bin/exp
也可以在备份脚本上面加下面这个就可以了。
. /etc/profile
. ~/.bash_profile