手把手带你在CentOS下定时自动备份远程ORACLE数据库

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

问题总结

  1. 备份过程中报错,ORACLE error 1455 encountered converting column overflows integer datatype,oracle服务端版本bug,升级版本即可。
  2. 执行脚本提示exp命令找不到,这个需要更改配置文件的编码格式为unix,具体操作为 进入vi编辑器模式 输入:set ff=unix即可解决。
  3. 除了exp命令外也可以使用expdp命令,大同小异,此处不赘述。
  4. 出现这个警告:EXP-00091: Exporting questionable statistics.,也可以使用下面的方法解决
  5. 定时任务crontab执行报找不到exp命令,这是因为环境变量的问题,可以在配置文件的执行脚本那里填写全路径,比如:/usr/oracle/bin/exp
    也可以在备份脚本上面加下面这个就可以了。
. /etc/profile
. ~/.bash_profile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值