Linux远程连接oracle数据库并执行SQL脚本

本文简单介绍了如何在Linux系统中安装和配置oracle-instantclient客户端,并提供自动化脚本,功能是将Subversion代码仓中的SQL脚本文件下载至本地,然后远程连接Oracle数据库并执行。

0x01 安装和配置客户端

首先点击此处下载oracle-instantclient,一般需要下载的软件包如下:

  • oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
  • oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
  • oracle-instantclient11.2-jdbc-11.2.0.4.0-1.x86_64.rpm
  • oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm
  • oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm

然后编辑环境变量,修改文件/etc/profile,添加以下内容:

export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export TNS_ADMIN=$ORACLE_HOME/network/lib
export NLS_LANG='SIMPLIFIEDCHINESE_CHINA.AL32UTF8'
export PATH=$ORACLE_HOME/bin:$PATH

最后配置监听$ORACLE_HOME/network/admin/tnsnames.ora,没有的话需创建,因有多个项目的数据库,连接别名的命名规范使用的是“项目编号_简称_数据库监控名”。

100800_ABC_ORCL =
 (DESCRIPTION =
   (ADDRESS = (PROTOCOL = TCP)(HOST = 6.6.6.6)(PORT = 1521))
   (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = ORCL)
   )
 )

0x02 编写自动化过程

创建数据库信息表exeOracleList.txt,其中每一行代表一条数据库记录,格式如下:

# 数据库监听别名 用户 密码 数据库地址 监听服务名
# PROJ_NAME_ALIAS USERNAME PASSWORD   HOST_IP/NAME TNS_SERVICE
100800_ABC_ORCL   ZHILIN   MEIYOUMIMA 8.8.8.8      ORCL
100808_DEF_CRMA   DIZHU    BUGAOSUNI  db_crm_a     CRMA

Shell脚本

#!/bin/bash
# 远程执行ORACLE数据库SQL脚本
# 自SVN仓库获取待执行的SQL脚本
# 脚本参数说明
# -a 待执行SQL脚本的项目名称(留空则从版本信息中截取)
# -s 待连接数据库本地监听服务名(tnsnames.ora)
# -v 数据库SQL脚本在SVN代码库中的版本目录名称
# ./execOracle.sh -a PROJ_NAME -s TNS_SERVICE -v SQL_PROJ_NAME_versionPath_20230110/db

while getopts 'a:s:v:' OPT
do
  case ${OPT} in
    a) projName="${OPTARG}";;
    s) servName="${OPTARG}";;
    v) sqlFiles="${OPTARG}";;
  esac
done

[ -z "${servName}" ] || [ -z "${sqlFiles}" ] && echo "必须输入版本信息和数据库服务名"
[ -z "${projName}" ] && projName=`echo ${sqlFiles} | awk -F_ '{print $2"_"$3}'`

# 代码仓库信息
svnPath="svn://8.8.8.8/${projName}/CODE/PATCH/${sqlFiles}"
svnUser="myUsername"
svnPass="myPassword"
# 数据库信息表
dbLists="exeOracleList.txt"
# 本地工作空间
workDir="${PWD}/DATABASE/${projName}"
# 部署日志文件
excuseLog="${PWD}/database_${projName}.log"

getTime (){
  nowTime=`date +'%Y%m%d %H%M%S'`
}

getResult (){
  getTime
  [ ${getStatus} -ne 0 ] && echo -e "${nowTime}\t上一条指令执行失败\n" >> ${excuseLog} && exit 1
}

getTime
echo ">>>>>>>>>>>>>>>>>>>> ${projName}-${nowTime:0:8} <<<<<<<<<<<<<<<<<<<<" >> ${excuseLog}

# 检查基本环境
[ ! -d "${workDir}" ] && getTime && mkdir -p ${workDir} && echo -e "${nowTime}\t创建工作空间基本目录" >> ${excuseLog}
dbInfo=`cat ${dbLists} | grep "^${projName}" | grep -w "${servName}"`
[ -z "${dbInfo}" ] && getTime && echo -e "${nowTime}\t信息表中没有该项目的数据库连接信息\n" >> ${excuseLog} && exit 1

# 从仓库中检出待执行的SQL脚本
checkoutSQL (){
  cd ${workDir}
  getTime
  [ -d "${sqlFiles}" ] && rm -rf ${sqlFiles}
  echo -e "${nowTime}\t检出数据库脚本${svnPath}" >> ${excuseLog}
  svn co ${svnPath} ${sqlFiles} --username ${svnUser} --password ${svnPass}
  getStatus=$?
  getResult
  [ -d "${sqlFiles}/.svn" ] && rm -rf ${sqlFiles}/.svn
  getTime
  sqlList=(`find ./${sqlFiles} -name *.sql | tr "\n" " "`)
  [ -z "${sqlList}" ] && echo -e "${nowTime}\t没有发现数据库脚本\n" >> ${excuseLog} && exit 1
  echo -e "${nowTime}\t待执行的脚本 ${sqlList[*]}" >> ${excuseLog}
  echo ${sqlList[*]} | tr " " "\n"
  sleep 1
}

# 连接数据库并执行脚本
excuseSQL (){
  cd ${workDir}
  while true
  do
    echo -e "监听:${dbInfo[0]}\n用户:${dbInfo[1]}\n地址:${dbInfo[3]}\n服务:${dbInfo[4]}"
    read -p "以上信息正确吗?输入'Y'开始执行,输入'E'退出..." toNEXT
    [ "${toNEXT^^}" = "Y" ] && break
    [ "${toNEXT^^}" = "E" ] && exit 2
  done
  for sqlFile in ${sqlList[@]}
  do
    getTime
    sqlFile=${workDir}${sqlFile#*.}
    echo -e "${nowTime}\t执行脚本${sqlFile}" >> ${excuseLog}
# 按普通数据库信息串进行连接
# sqlplus -s ${dbInfo[1]}/${dbInfo[2]}@${dbInfo[3]}/${dbInfo[4]} <<-EOF
# 按tnsnames.ora中的别名进行连接
sqlplus -s ${dbInfo[1]}/${dbInfo[2]}@${dbInfo[0]} <<-EOF
whenever oserror exit 1;
whenever sqlerror exit 1;
set head off;
set time off;
@${sqlFile}
exit
EOF
    getStatus=$?
  done
  getResult
}

checkoutSQL
excuseSQL

getTime
echo -e ">>>>>>>>>>>>>>>>>>>> 执行完毕-${nowTime:10:6} <<<<<<<<<<<<<<<<<<<<\n" >> ${excuseLog}

原创文章禁止转载:技术学堂 » Linux远程连接oracle数据库并执行SQL脚本

精彩评论

5+1=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏