TNSPING只验证Listener进程的网络连接,不需要传递用户名和密码。
正如@ KonstantinV.Salikhov说,你可能会类似于下面的代码的工具,它会验证:
.-网络连接监听器进程(如果听者是涨还是不喜欢TNSPING会做)
。 - 数据库服务是否启动(因为TNSPING将识别数据库服务名称)。
该工具不会使用用户名/密码,因为我们只需要登录失败事件来验证数据库已启动并正在运行。
Java代码:
import java.sql.*;
import oracle.jdbc.pool.*;
public class ThinTnsnames {
static String sql = null;
public static void main(String[] args) {
String entry_name = args [0];
test (entry_name);
}
public static void test (String entry_name) {
Connection pconnection = null;
try {
String l_url = "jdbc:oracle:thin:@" + entry_name;
System.out.println("Connection string = " + l_url);
OracleDataSource ods = new OracleDataSource();
ods.setURL(l_url);
pconnection = ods.getConnection();
}
catch(SQLException e) {
int errorCode = e.getErrorCode() ;
System.err.println("Error Code: " + errorCode) ;
if (errorCode == 12514) {
System.err.println("Listener is UP but database is DOWN");
}
if (errorCode == 17002) {
System.err.println("Listener is DOWN");
}
if (errorCode == 1017) {
System.err.println("Listener is UP and database is UP");
}
// e.printStackTrace();
}
finally {
try {
if (pconnection != null)pconnection .close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
您可以使用自己的tnsnames.ora文件在另一个目录来进行测试,例如在 “/家/ ORACLE/2” 目录:
[[email protected] 2]$ cat /home/oracle/2/tnsnames.ora
orcldb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora12c.node.com)(PORT = 15300))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = db02.node.com)
(INSTANCE_NAME = db02)
)
)
然后你调用它是这样的:
export JAVA_HOME=/opt/java/jdk1.7.0_71
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=/home/oracle/2/ojdbc7.jar:.
java -Doracle.net.tns_admin=/home/oracle/2 ThinTnsnames orcldb
可能的输出是:
Connection string = jdbc:oracle:thin:@orcldb
Error Code: 1017
Listener is UP and database is UP
Connection string = jdbc:oracle:thin:@orcldb
Error Code: 12514
Listener is UP but database is DOWN
Connection string = jdbc:oracle:thin:@orcldb
Error Code: 17002
Listener is DOWN
您可以验证通过查询DBA_AUDIT_TRAIL视图连接过程中没有使用用户名如下:
select username,action_name,returncode from dba_audit_trail
where action_name like 'LOG%' ;
USERNAME ACTION_NAME RETURNCODE
-------------------- ---------------------------- ----------
LOGON 1017
您可以用随机的用户名和密码连接到数据库,并检查是否ORA-01017(无效的用户名/密码)被返回 - 如果是这样,那么你的数据库启动并运行,否则DB或网络连接有问题 –
'tnsping'是一个OS命令。这样做的标准方式可能是在'tnsnames.ora'文件上运行'grep'并在循环中ping服务的shell脚本。 – APC
@ KonstantinV.Salikhov我得到ORA-01017随机用户名和密码,但有没有其他方式呢?有时DB会因错误的凭据尝试而锁定(也许我错了)。 – Mohan