问题描述
Oracle数据库安装在windows 2008 远程服务器上,今天发现无法远程登录到windows,需要远程重启操作系统;
通过远程重启命令:shutdown /r /m \\192.168.1.2 /t 10
仍然无法重启系统;
想到sqlserver
可以通过xp_cmdshell
执行操作系统命令,实现重启;
需要分析oracle是否有类似功能可以实现执行操作系统命令;
解决办法
/*
oracle 执行操作系统命令
如下命令需要在sqlplus下执行;
*/
-- 创建java source
create or replace and compile
java source named "util"
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
-- 创建调用函数
create or replace
function run_cmd(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
-- 创建存储过程
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := run_cmd(p_cmd);
end;
/
-- 用户赋权
exec dbms_java.grant_permission( 'user_name', 'SYS:java.io.FilePermission','<<ALL FILES>>', 'execute');
grant javasyspriv to user_name;
/
-- 收回权限
-- EXEC dbms_java.revoke_permission( 'user_name', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' );
-- revoke javasyspriv from user_name;
/
-- 调用测试
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
-- 查看IP配置
exec :x:=run_cmd('ipconfig');
-- 重启数据库
exec :x:=run_cmd('shutdown -r -t 3');
上述命令中,虽然设置3秒后重启操作系统,但实际执行时,需要等待操作系统关闭相关进程后,才能够重启,所以需要多等待一些时间,我这里大概10分钟左右,系统才完成重启。