oracle创建Javasource实现数据库备份
因客户需求,需要在业务系统中,菜单中的网页中的按钮中加入一个按钮,用于点击备份数据库
(环境:只配置了数据源连接oralce ,应用服务器和数据服务器不在一台机器,且数据库机器oracle操作系统账号密码不知道无法远程登陆机器进行备份,)
思索许久实现思路如下:
第一步:编写一个java小程序,用于执行传入的备份命令,如expdp ls 等,
第二步:创建javasource 用于执行备份命令。
第三步:创建过程用于调用Java source。
创建java测试类如下:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.UnknownHostException;
public class Test
{
public static String list_cmd(String str){
Runtime runtime=Runtime.getRuntime();
StringBuffer enco = new StringBuffer();
enco.append("GBK");
try{
Process proc =runtime.exec(str);
InputStream inp_suc=proc.getInputStream();
InputStream inp_err=proc.getErrorStream();
BufferedReader bfr_err = new BufferedReader(new InputStreamReader(inp_err,enco.toString()));
BufferedReader bfr_suc = new BufferedReader(new InputStreamReader(inp_suc,enco.toString()));
String strLine;
while( (strLine=(bfr_suc.readLine())) != null){
System.out.println(strLine);
}
while( (strLine=(bfr_err.readLine())) != null){
System.out.println(strLine);
}
proc.destroy();
inp_suc.close();
inp_err.close();
}catch (Exception e) {
System.out.println("EXECUTE IS ERROR!");
System.out.println(e.getMessage());
}
return "";
}
public static void main(String[] args){
list_cmd(args[0]);
}
}
测试java类运行输出
创建用户测试
SQL> conn / as sysdba
已连接。
SQL> create user wx identified by 123;
用户已创建。 SQL> grant dba to wx; 授权成功。 SQL>
将java 类改装成创建javasource语法,如下:(将测试的main方法注释掉)
create or replace and compile java source named exe_linux as import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.UnknownHostException; public class Test { public static String list_cmd(String str){ Runtime runtime=Runtime.getRuntime(); StringBuffer enco = new StringBuffer(); enco.append("GBK"); try{ Process proc =runtime.exec(str); InputStream inp_suc=proc.getInputStream(); InputStream inp_err=proc.getErrorStream(); BufferedReader bfr_err = new BufferedReader(new InputStreamReader(inp_err,enco.toString())); BufferedReader bfr_suc = new BufferedReader(new InputStreamReader(inp_suc,enco.toString())); String strLine; while( (strLine=(bfr_suc.readLine())) != null){ System.out.println(strLine); } while( (strLine=(bfr_err.readLine())) != null){ System.out.println(strLine); } proc.destroy(); inp_suc.close(); inp_err.close(); }catch (Exception e) { System.out.println("EXECUTE IS ERROR!"); System.out.println(e.getMessage()); } return ""; } /* public static void main(String[] args){ list_cmd(args[0]); } **/ } /
使用sqlplus 连接oracle 数据库
创建Javasource
SQL> create or replace and compile java source named exe_linux as 2 import java.io.BufferedReader; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.net.UnknownHostException; 6 public class Test 7 { 8 public static String list_cmd(String str){ 9 Runtime runtime=Runtime.getRuntime(); 10 StringBuffer enco = new StringBuffer(); 11 enco.append("GBK"); 12 try{ 13 Process proc =runtime.exec(str); 14 InputStream inp_suc=proc.getInputStream(); 15 InputStream inp_err=proc.getErrorStream(); 16 BufferedReader bfr_err = new BufferedReader(new InputStreamReader(inp_err,enco.toString())); 17 BufferedReader bfr_suc = new BufferedReader(new InputStreamReader(inp_suc,enco.toString())); 18 String strLine; 19 while( (strLine=(bfr_suc.readLine())) != null){ 20 21 System.out.println(strLine); 22 } 23 while( (strLine=(bfr_err.readLine())) != null){ 24 25 System.out.println(strLine); 26 } 27 proc.destroy(); 28 inp_suc.close(); 29 inp_err.close(); 30 }catch (Exception e) { 31 System.out.println("EXECUTE IS ERROR!"); 32 System.out.println(e.getMessage()); 33 } 34 return ""; 35 } 36 37 /* public static void main(String[] args){ 38 39 list_cmd(args[0]); 40 } 41 **/ 42 } 43 44 / Java 已创建。
创建存储过程,(执行过程,传参数给Javasource)
create or replace procedure p_exe_linux(str varchar2) as language java name 'Test.list_cmd(java.lang.String)'; /
SQL中创建如下
SQL> create or replace procedure p_exe_linux(str varchar2) as language java 2 name 'Test.list_cmd(java.lang.String)'; 3 / 过程已创建。
执行测试,
SQL> SET SERVEROUTPUT ON --打开服务器输出 SQL> EXEC P_EXE_LINUX('ls -l') PL/SQL 过程已成功完成。 --此时没有任何输出,即使java 执行错误。 SQL> exec dbms_java.set_output(1111111111111); --打开java 输出 PL/SQL 过程已成功完成。 SQL> EXEC P_EXE_LINUX('ls -l') EXECUTE IS ERROR! the Permission ("java.io.FilePermission" "<<ALL FILES>>" "execute") has not been granted to WX. The PL/SQL to grant this is dbms_java.grant_permission( 'WX', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' ) PL/SQL 过程已成功完成。 SQL>
出现以上错误解决办法:
SQL> conn / as sysdba --切换sys用户 已连接。 SQL> exec dbms_java.grant_permission( 'WX', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' ) PL/SQL 过程已成功完成。 SQL> conn wx/123 --切换普通用户 已连接。 SQL> EXEC P_EXE_LINUX('ls -l') PL/SQL 过程已成功完成。 --执行没有输出,切换用户后,需要重新执行dbms_java.set_output和 set serveroutput on SQL> exec dbms_java.set_output(1111111111111); PL/SQL 过程已成功完成。 SQL> EXEC P_EXE_LINUX('ls -l') PL/SQL 过程已成功完成。 SQL> SET SERVEROUTPUT ON SQL> EXEC P_EXE_LINUX('ls -l') 成功执行 total 48 -rwxrwx---+ 1 Administrators None 3584 Oct 22 17:59 PWDwx.ora -rwxrwx---+ 1 Unknown+User Unknown+Group 3584 Nov 1 16:39 SPFILEWX.ORA drwxrwx---+ 1 Administrators None 0 Oct 19 09:58 archive -rwxrwx---+ 1 Unknown+User Unknown+Group 2048 Oct 19 12:23 hc_wx.dat -rwxrwx---+ 1 Administrators None 31744 Dec 21 2005 oradba.exe -rwxrwx---+ 1 Unknown+User Unknown+Group 2647 Nov 1 16:27 oradim.log total 48 -rwxrwx---+ 1 Administrators None 3584 Oct 22 17:59 PWDwx.ora -rwxrwx---+ 1 Unknown+User Unknown+Group 3584 Nov 1 16:39 SPFILEWX.ORA drwxrwx---+ 1 Administrators None 0 Oct 19 09:58 archive -rwxrwx---+ 1 Unknown+User Unknown+Group 2048 Oct 19 12:23 hc_wx.dat -rwxrwx---+ 1 Administrators None 31744 Dec 21 2005 oradba.exe -rwxrwx---+ 1 Unknown+User Unknown+Group 2647 Nov 1 16:27 oradim.log PL/SQL 过程已成功完成。 SQL>
使用变量编辑测试系统命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 5.8G 45G 12% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 858M 1.1G 46% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 1014M 145M 870M 15% /boot /dev/sdb1 100G 29G 72G 29% /u01 /dev/mapper/centos-home 46G 33M 46G 1% /home tmpfs 379M 0 379M 0% /run/user/0 PL /SQL procedure successfully completed. SQL> l 1 create or replace procedure p_exe_linux(str varchar2) as language java 2* name 'Test.list_cmd(java.lang.String)' ; SQL> ho clear SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: ls -l total 9652 -rw-rw---- 1 oracle oinstall 1544 Apr 23 10:44 hc_racdb.dat -rw-rw---- 1 oracle oinstall 1544 Jun 29 23:23 hc_racdg.dat -rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora -rw-r----- 1 oracle oinstall 1248 Apr 23 11:11 initracdb1.ora -rw-r--r-- 1 oracle oinstall 913 Apr 23 11:08 initracdg.ora.bak -rw-r----- 1 oracle oinstall 24 Apr 23 10:42 lkRACDG -rw-r----- 1 oracle oinstall 1536 Apr 23 10:42 orapwracdg -rw-r----- 1 oracle oinstall 1248 Apr 23 11:16 oraracdg.ora -rw-r----- 1 oracle oinstall 9846784 Jun 27 23:11 snapcf_racdg.f -rw-r----- 1 oracle oinstall 2560 Jun 29 23:43 spfileracdg.ora PL /SQL procedure successfully completed. SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 50G 5.8G 45G 12% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 858M 1.1G 46% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 1014M 145M 870M 15% /boot /dev/sdb1 100G 29G 72G 29% /u01 /dev/mapper/centos-home 46G 33M 46G 1% /home tmpfs 379M 0 379M 0% /run/user/0 PL /SQL procedure successfully completed. SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: ifconfig -a EXECUTE IS ERROR! Cannot run program "ifconfig" : ifconfig not found (Note that lookup with PATH isn't done due to the oracle executable being setuid.) PL /SQL procedure successfully completed. SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: /usr/bin/ifconfig EXECUTE IS ERROR! Cannot run program "/usr/bin/ifconfig" : /usr/bin/ifconfig not found PL /SQL procedure successfully completed. SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: env XDG_SESSION_ID=9 HOSTNAME=oraback SHELL= /bin/bash TERM=xterm HISTSIZE=1000 TMPDIR= /tmp USER=oracle LD_LIBRARY_PATH= /u01/app/oracle/product/11 .2.0 /db_1/lib : /lib : /usr/lib LS_COLORS=rs=0:di=01;34: ln =01;36:mh=00:pi=40;33:so=01;35: do =01;35:bd=40;33;01: cd =40;33;01:or=40;31;01:mi=01;05;37;41: su =37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;4 2:st=37;44:ex=01;32:*. tar =01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31: *.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=0 1;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01; 31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=0 1;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sa r=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31: *.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01 ;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.ti ff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;3 5:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp 4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35: *.asf=01;35:*. rm =01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01 ;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf= 01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.f lac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01; 36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: ORACLE_SID=racdg ORACLE_BASE= /u01/app/oracle TNS_ADMIN= /u01/app/oracle/product/11 .2.0 /db_1/network/admin MAIL= /var/spool/mail/oracle PATH= PWD= /home/oracle LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME= /home/oracle TMP= /tmp LOGNAME=oracle CLASSPATH= /u01/app/oracle/product/11 .2.0 /db_1/JRE : /u01/app/oracle/product/11 .2.0 /db_1/jlib : /u01/app/oracle/product/11 .2.0 /db_1/rdbms/jlib LESSOPEN=|| /usr/bin/lesspipe .sh %s ORACLE_HOME= /u01/app/oracle/product/11 .2.0 /db_1 _= /u01/app/oracle/product/11 .2.0 /db_1/bin/sqlplus ORA_NET2_DESC=9,12 ORACLE_SPAWNED_PROCESS=1 PL /SQL procedure successfully completed. SQL> SQL> SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: whereis ifconfig ifconfig : /usr/sbin/ifconfig /usr/share/man/man8/ifconfig .8.gz PL /SQL procedure successfully completed. SQL> EXEC P_EXE_LINUX( '&string' ); Enter value for string: /usr/sbin/ifconfig -a enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.111 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 fe80::8119:ca2b:700f:4580 prefixlen 64 scopeid 0x20<link> ether 08:00:27:a4:8d:81 txqueuelen 1000 (Ethernet) RX packets 2910 bytes 326990 (319.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1782 bytes 297450 (290.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 08:00:27:06:d2:07 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 1507 bytes 106529 (104.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1507 bytes 106529 (104.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 PL /SQL procedure successfully completed. SQL> |
执行导出,要确保用户具有导出数据库的权限,这里我的用户授予了dba角色,演示如下:
C:\Users\nantian>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期五 11月 2 08:37:46 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> grant dba to wx;
授权成功。
SQL>
C:\Users\nantian>sqlplus wx/123 SQL*Plus: Release 12.2.0.1.0 Production on 星期四 11月 1 16:51:00 2018 Copyright (c) 1982, 2016, Oracle. All rights reserved. 上次成功登录时间: 星期四 11月 01 2018 16:50:47 +08:00 连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> set serveroutput on SQL> exec dbms_java.set_output(1111111111111); PL/SQL 过程已成功完成。 SQL> exec p_exe_linux('expdp zhjf/123 dumpfile=111111111.dmp logfile=1111111.log tables=SYS_PARAM') Export: Release 12.2.0.1.0 - Production on 星期四 11月 1 16:51:37 2018 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. 连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 启动 "ZHJF"."SYS_EXPORT_TABLE_01": zhjf/******** dumpfile=111111111.dmp logfile=1111111.log tables=SYS_PARAM 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA 处理对象类型 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/MARKER 处理对象类型 TABLE_EXPORT/TABLE/TABLE 处理对象类型 TABLE_EXPORT/TABLE/INDEX/INDEX 处理对象类型 TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT . . 导出了 "ZHJF"."SYS_PARAM" 0 KB 0 行 已成功加载/卸载了主表 "ZHJF"."SYS_EXPORT_TABLE_01" ****************************************************************************** ZHJF.SYS_EXPORT_TABLE_01 的转储文件集为: E:\APP\NANTIAN\VIRTUAL\ADMIN\WX\DPDUMP\111111111.DMP 作业 "ZHJF"."SYS_EXPORT_TABLE_01" 已于 星期四 11月 1 16:52:22 2018 elapsed 0 00:00:40 成功完成 PL/SQL 过程已成功完成。 SQL>
此处只演示了实现例子,如备份文件名重复会导致备份失败,,可在java中将dmp文件名拼接为日期精确到时分秒,可解决备份文件存在错误。
自动生成文件名备份,传入参数总无需写入文件名
创建javasource 名称为Auto_Exp如下:
SQL> create or replace and compile java source named Auto_Exp as 2 import java.io.BufferedReader; 3 import java.io.InputStream; 4 import java.io.InputStreamReader; 5 import java.net.UnknownHostException; 6 import java.text.DateFormat; 7 import java.text.SimpleDateFormat; 8 import java.util.Date; 9 public class Auto_Exp 10 { 11 12 public static String exe_cmd(String str,String schema){ 13 String exe_str=""; 14 Runtime runtime=Runtime.getRuntime(); 15 StringBuffer enco = new StringBuffer(); 16 enco.append("GBK"); 17 Date date = new Date(); 18 SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 19 //UUID uuid=UUID.randomUUID(); 20 String dmpName=df2.format(date).replaceAll("\\s", "").replaceAll(":", "").replaceAll("-", ""); 21 System.out.println("FileName:"+schema+"_"+dmpName+".dmp"); 22 exe_str=str+" "+"dumpfile="+schema+"_"+dmpName+".dmp"+" "+"logfile="+schema+"_"+dmpName+".log"; 23 System.out.println("Exe_Message:"+exe_str); 24 try{ 25 26 Process proc =runtime.exec(exe_str); 27 InputStream inp_suc=proc.getInputStream(); 28 InputStream inp_err=proc.getErrorStream(); 29 BufferedReader bfr_err = new BufferedReader(new InputStreamReader(inp_err,enco.toString())); 30 BufferedReader bfr_suc = new BufferedReader(new InputStreamReader(inp_suc,enco.toString())); 31 String strLine; 32 while( (strLine=(bfr_suc.readLine())) != null){ 33 34 System.out.println(strLine); 35 } 36 while( (strLine=(bfr_err.readLine())) != null){ 37 38 System.out.println(strLine); 39 } 40 proc.destroy(); 41 inp_suc.close(); 42 inp_err.close(); 43 }catch (Exception e) { 44 System.out.println("EXECUTE IS ERROR!"); 45 System.out.println(e.getMessage()); 46 } 47 System.out.println("FINISHED !"); 48 49 50 return ""; 51 } 52 53 } 54 / Java 已创建。
创建过程
SQL> create or replace procedure auto_exp(str varchar2,str2 varchar2) as language java 2 name 'Auto_Exp.exe_cmd(java.lang.String,java.lang.String)'; 3 / 过程已创建。 SQL>
开始执行测试
exec Auto_Exp('expdp zhjf/1 ','zhjf')
传入参数解释:第一个参数导出完整命令,详细命令格式参见expdp help=y 查看,第二个我参数为导出的用户,文件名和日志名自动生成,规则可以在java代码中修改,
linux和unix 中执行 exec Auto_Exp('expdp zhjf/1 ','zhjf') 可能报错误,请参见上述部署中键入 EXEC P_EXE_LINUX('env')
这里我连接了一台Linux oralce 服务器,
查看环境变量信息,如下:
C:\Users\nantian>sqlplus ecmapp/ecmapp@10.10.54.253:1521/ecmdb
SQL*Plus: Release 12.2.0.1.0 Production on 星期四 11月 1 17:32:33 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
上次成功登录时间: 星期五 11月 02 2018 00:30:23 +08:00
连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> set serveroutput on SQL> exec dbms_java.set_output(111111111); PL/SQL 过程已成功完成。 SQL> EXEC P_EXE_LINUX('env') LESSKEY=/etc/lesskey.bin XDG_VTNR=1 NNTPSERVER=news MANPATH=/usr/local/man:/usr/share/man XDG_SESSION_ID=1 HOSTNAME=ecmos XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB HOST=ecmos SHELL=/bin/bash TERM=linux PROFILEREAD=true HISTSIZE=1000 MORE=-sl USER=oracle LD_LIBRARY_PATH=/oracle/product/12.1.0/lib: LS_COLORS=no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:c d=40;33;01:or=41;33;01:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32: *.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00 ;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.lzma=00;31:*.zip=00;31:*.zoo=00;31:*.z =00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.x z=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35 :*.mng=01;35:*.mov=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=0 1;35:*.ppm=01;35:*.tga=01;35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl =01;35:*.wmv=01;35:*.aiff=00;32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:* .voc=00;32:*.wav=00;32: ORACLE_SID=ecmdb XNLSPATH=/usr/share/X11/nls ORACLE_BASE=/oracle QEMU_AUDIO_DRV=pa HOSTTYPE=x86_64 FROM_HEADER= PAGER=less CSHEDIT=emacs XDG_CONFIG_DIRS=/etc/xdg MINICOM=-c on MAIL=/var/spool/mail/oracle PATH= CPU=x86_64 INPUTRC=/etc/inputrc PWD=/oracle LANG=en_US.UTF-8 PYTHONSTARTUP=/etc/pythonstart GPG_TTY=/dev/tty1 AUDIODRIVER=pulseaudio QT_SYSTEM_DIR=/usr/share/desktop-data SHLVL=1 XDG_SEAT=seat0 HOME=/oracle ALSA_CONFIG_PATH=/etc/alsa-pulse.conf SDL_AUDIODRIVER=pulse LESS_ADVANCED_PREPROCESSOR=no OSTYPE=linux LS_OPTIONS=-N --color=tty -T 0 XCURSOR_THEME=DMZ WINDOWMANAGER=env GNOME_SHELL_SESSION_MODE=sle-classic gnome-session --session sle-classic G_FILENAME_ENCODING=@locale,UTF-8,ISO-8859-15,CP1252 LESS=-M -I -R MACHTYPE=x86_64-suse-linux LOGNAME=oracle CVS_RSH=ssh XDG_DATA_DIRS=/usr/share LESSOPEN=lessopen.sh %s XDG_RUNTIME_DIR=/run/user/1001 ORACLE_HOME=/oracle/product/12.1.0 LESSCLOSE=lessclose.sh %s %s G_BROKEN_FILENAMES=1 COLORTERM=1 _=/oracle/product/12.1.0/bin/sqlplus ORA_NET2_DESC=17,20 ORACLE_SPAWNED_PROCESS=1 PL/SQL 过程已成功完成。 SQL>
请尝试键入绝对路径查看ORACLE_HOME变量,使用绝对路径执行解决错误,如下:
exec Auto_Exp('/oracle/product/12.1.0/bin/expdp zhjf/1 ','zhjf')
windown 导出文件名日志名自动成示例:
C:\Users\nantian>sqlplus wx/123 SQL*Plus: Release 12.2.0.1.0 Production on 星期四 11月 1 17:39:34 2018 Copyright (c) 1982, 2016, Oracle. All rights reserved. 上次成功登录时间: 星期四 11月 01 2018 17:36:23 +08:00 连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production SQL> set serveroutput on SQL> exec dbms_java.set_output(11111111111); PL/SQL 过程已成功完成。 SQL> exec Auto_Exp('expdp zhjf/123 tables=SYS_LOGGER','zhjf') FileName:zhjf_20181101174028.dmp Exe_Message:expdp zhjf/123 tables=SYS_LOGGER dumpfile=zhjf_20181101174028.dmp logfile=zhjf_20181101174028.log Export: Release 12.2.0.1.0 - Production on 星期四 11月 1 17:40:29 2018 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. 连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 启动 "ZHJF"."SYS_EXPORT_TABLE_01": zhjf/******** tables=SYS_LOGGER dumpfile=zhjf_20181101174028.dmp logfile=zhjf_20181101174028.log 处理对象类型 TABLE_EXPORT/TABLE/TABLE_DATA 处理对象类型 TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 处理对象类型 TABLE_EXPORT/TABLE/STATISTICS/MARKER 处理对象类型 TABLE_EXPORT/TABLE/TABLE . . 导出了 "ZHJF"."SYS_LOGGER" 735.9 MB 5455743 行 已成功加载/卸载了主表 "ZHJF"."SYS_EXPORT_TABLE_01" ****************************************************************************** ZHJF.SYS_EXPORT_TABLE_01 的转储文件集为: E:\APP\NANTIAN\VIRTUAL\ADMIN\WX\DPDUMP\ZHJF_20181101174028.DMP 作业 "ZHJF"."SYS_EXPORT_TABLE_01" 已于 星期四 11月 1 17:41:28 2018 elapsed 0 00:00:57 成功完成 FINISHED ! PL/SQL 过程已成功完成。 SQL>
如上文件名为自动生成,且不易重复。
linux 示例命令有所不同需要将命令修改为绝对路径的expdp 执行 exec Auto_Exp('/u01/app/oracle/product/11.2.0/db_1/bin/expdp zhjf/1 ','zhjf')
ORACLE_HOME为/u01/app/oracle/product/11.2.0/db_1
问题1:需要自动备份,可在Oracle中建一个定时任务,每天执行即可,也可将其做成函数,使用select 查询及进行备份,
问题2:web页面无法获取日志问题,可将生成的日志文件作为oracle外部表,使用select 查询及进行日志读取。
附件下载地址:https://files.cnblogs.com/files/wenxiao1-2-3-4/plsql%E6%B5%8B%E8%AF%95.zip
参考链接:
数据库包api :DBMS_DATAPUMP https://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_api.htm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?