我正在Linux机箱上配置启动顺序,其中一个启动应用程序依赖于在不同的机箱上可用的Oracle实例。我想要一个bash脚本工具来检查Oracle实例的可用性。可能,两个盒子上的电源按钮会在几秒钟之内被击中,我需要更长的Oracle进程才能在我的应用程序尝试连接之前完成。
编辑:我没有安装除瘦JDBC jar之外的Oracle,并且不希望在客户端盒子上安装。
答案 0 :(得分:2)
首先要尝试的是tnsping
,它会告诉你监听器是否正在运行。如果侦听器正在运行,您只需尝试连接到该实例,然后运行select 1 from dual
。您可以使用sqlplus
在命令行上执行此操作。根据Oracle数据库的配置方式(以及您购买的选项),SNMP也可以选择。
您还可以让您的应用程序更好地处理数据库尚未启动(例如,睡眠10秒并再次尝试)。
此外,您可能需要考虑使用交换PDU(例如来自APC的PDU)来控制电源恢复后启动的订单。如果你想要其他系统管理员答案(因为他们都解决了这个问题),我建议在Serverfault上询问。
如果您不想安装Oracle客户端,那么您将不会拥有sqlplus或tnsping。相反,只需编写一个简单的Java程序,尝试使用JDBC瘦驱动程序连接到数据库。如果您可以连接,请尝试select 1 from dual
。如果可行的话,Oracle就会出现。如果你反而得到失败或异常,那就不要了。
答案 1 :(得分:2)
您可以编写一个使用for
循环的简单脚本,以使用nc
检查oracle端口。像这样:
#!/bin/bash
for i in `seq 1 10`
do
nc oracle_server oracle_port -w 2
res=$?
if [ $res -eq 0 ] ; then
echo "OK"
exit 0
else
echo "Sleeping for 5 second and retry"
sleep 5
fi
done
您可以自定义循环迭代次数和等待时间(-w 2
和sleep 5
)。
答案 2 :(得分:1)
确保远程数据库已启动并且侦听器已启动并且数据库已正确注册到侦听器的唯一方法是实际建立连接。您可以使用SQL * Plus实用程序(假设Oracle客户端安装在运行应用程序的Linux机器上)以尝试建立连接。像
这样的东西创建文件check_db_up.sql
whenever sqlerror exit 1;
connect username/password@<<TNS alias>>
select 1 from dual;
exit 0;
然后在bash shell脚本中调用此脚本并查看返回码
sqlplus /nolog @check_db_up.sql
如果返回1,则表示出错,数据库未启动。如果它返回0,则数据库已启动并接受连接。