本文简单介绍了如何在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脚本