使用GNU SED按SID从文件获取Oracle账号密码及批量操作实现方法
批量连接Oracle数据库执行SQL的实现方案
直接使用Bash脚本即可完成需求,完整实现代码及注意事项如下:
完整执行脚本
#!/bin/bash # 配置文件路径,可根据实际存放位置修改 PASS_FILE="./pass" DBLIST_FILE="./dblist" OUTPUT_LOG="./output.log" QUERY_SQL="./query.sql" # 初始化日志文件 > "${OUTPUT_LOG}" # 逐行读取dblist中的TNS服务名 while read -r TNS || [[ -n "${TNS}" ]] do # 跳过空行 [[ -z "${TNS}" ]] && continue # 匹配pass文件中对应TNS的凭证记录 MATCH_RECORD=$(grep ":${TNS}:" "${PASS_FILE}") if [[ -z "${MATCH_RECORD}" ]]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 警告:未找到TNS[${TNS}]的登录凭证,跳过执行" >> "${OUTPUT_LOG}" continue fi # 拆分凭证字段:pass文件格式为 密码:TNS:用户名 DB_PASS=$(echo "${MATCH_RECORD}" | awk -F':' '{print $1}') DB_USER=$(echo "${MATCH_RECORD}" | awk -F':' '{print $3}') # 执行SQL查询 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行TNS[${TNS}]的查询任务" >> "${OUTPUT_LOG}" sqlplus -s /nolog << EOF >> "${OUTPUT_LOG}" connect ${DB_USER}/${DB_PASS}@${TNS} spool append @${QUERY_SQL} spool off exit EOF echo "[$(date '+%Y-%m-%d %H:%M:%S')] TNS[${TNS}]的查询任务执行完成" >> "${OUTPUT_LOG}" echo "==================================================" >> "${OUTPUT_LOG}" done < "${DBLIST_FILE}" echo "所有任务执行完成,执行结果请查看日志文件:${OUTPUT_LOG}"
注意事项
- 已修正你提供的连接语法错误,Oracle正确的连接格式为
用户名/密码@TNS服务名 - 请为凭证文件pass设置最小权限:执行
chmod 600 pass避免账号密码泄露 - 执行脚本前请确认Oracle客户端环境变量已配置正确,确保可直接调用sqlplus命令
- 脚本默认跳过无对应凭证的TNS服务,不会中断整体执行流程,跳过记录会在日志中留下警告
- query.sql文件中不要包含
spool off或exit命令,避免执行提前中断
内容的提问来源于stack exchange,提问作者Gaurav Gupta
相关产品推荐
相关产品推荐

