Oracle 19c读取多行列文本赋值变量及PDB服务校验方案咨询
Oracle 19c 多PDB服务关联校验脚本开发指南(无硬编码)
核心问题解决:多行文本的变量赋值
处理多行多列的库存文本文件,用Shell脚本结合while read循环+字段分隔符是最适合服务器部署的方案,无需依赖Oracle存储过程的复杂权限配置。步骤如下:
1. 规范库存文件输出格式
先确保spool导出的文件是结构化的(比如CSV格式),避免空格歧义:
-- 执行前先设置输出格式 SET LINESIZE 200 SET TRIMSPOOL ON SET COLSEP ',' SET HEADING OFF SET FEEDBACK OFF SPOOL /path/to/inventory.csv -- 你的库存查询语句 SELECT database_name, hostname, pluggable_db_name, service_name FROM your_inventory_tables; SPOOL OFF
导出的inventory.csv每行格式为:database_name,hostname,pluggable_db_name,service_name
2. Shell循环读取并赋值变量
用while read配合IFS(字段分隔符)拆分每行字段到变量:
#!/bin/bash # 读取配置文件(无硬编码核心:所有可变参数放这里) CONFIG_FILE="/opt/oracle/scripts/check_config.conf" source $CONFIG_FILE # 循环读取库存CSV文件 while IFS=',' read -r db_name host pdb inv_service do # 跳过标题行(如果SPOOL时保留了HEADING) if [[ "$db_name" == "DATABASE_NAME" ]]; then continue; fi # 变量赋值完成:$host(主机名)、$pdb(PDB名称)、$inv_service(库存服务名) echo "正在校验:主机$host 上的PDB $pdb" # --- 后续处理逻辑 --- # 1. 远程连接目标PDB查询运行中服务 sqlplus -s /nolog << EOF CONNECT $DB_USER/$DB_PASSWORD@//$host:$DB_PORT/$pdb SET HEADING OFF SET FEEDBACK OFF SET TRIMSPOOL ON SELECT name FROM gv\$services WHERE con_id = (SELECT con_id FROM v\$pdbs WHERE name = '$pdb'); EXIT; EOF > /tmp/current_services_$pdb.txt # 2. 对比库存服务与实际运行服务 if ! grep -q "$inv_service" /tmp/current_services_$pdb.txt; then # 服务不匹配时发送告警邮件 echo "告警:主机$host 的PDB $pdb 未找到库存服务 $inv_service" | mailx -s "PDB服务关联异常" $MAIL_RECIPIENTS fi # 清理临时文件 rm -f /tmp/current_services_$pdb.txt done < $INVENTORY_FILE
无硬编码实现:配置文件分离
创建check_config.conf配置文件,所有可变参数统一管理,脚本仅做逻辑处理:
# 数据库连接参数 DB_USER="pdb_checker" DB_PASSWORD="your_secure_password" # 建议用Oracle Wallet或环境变量替代明文 DB_PORT="1521" # 库存文件路径 INVENTORY_FILE="/path/to/inventory.csv" # 邮件告警配置 MAIL_RECIPIENTS="db_admin@yourcompany.com,ops_team@yourcompany.com"
部署与优化注意事项
- 权限配置:运行脚本的OS用户需具备:
- 读取库存文件的权限
- 执行
sqlplus的权限 - 发送邮件的权限(需配置
mailx或sendmail)
- 密码安全:禁止明文存储密码,推荐用Oracle Wallet:
# 创建Wallet并存储凭据 mkstore -wrl /opt/oracle/wallet -createCredential //host:port/pdb pdb_checker your_password # 脚本中连接改为:CONNECT /@pdb_alias - 错误处理:可在循环中添加连接失败捕获,比如:
if ! sqlplus -s /nolog << EOF >> /tmp/current_services_$pdb.txt ... EOF; then echo "告警:主机$host 的PDB $pdb 连接失败" | mailx -s "PDB连接异常" $MAIL_RECIPIENTS continue fi - 定时执行:通过
crontab设置定时任务,比如每天凌晨执行:0 2 * * * /opt/oracle/scripts/check_pdb_services.sh >> /opt/oracle/scripts/logs/check_log_$(date +%Y%m%d).log 2>&1
内容的提问来源于stack exchange,提问作者cman348powah
相关产品推荐
相关产品推荐

