传统使用Java ScrptRunner类执行sql脚本时会有很多语法限制,程序只能最简单的sql语句,该功能并不适用于实际应用场景;因此可以改变思路,使用Java直接执行Dos命令的方式去批量执行脚本;
1.Java执行Dos命令的方式
结合使用 java.lang库下的Process与Runtime类的方法;
Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。
Process process = Runtime.getRuntime().exec( "cd ./a/b/c");
process.waitfor();
Runtime.getRuntime().exec共有六个重载方法:可以根据自己实际应用场景进行拼装
// 在单独的进程中执行指定的外部可执行程序的启动路径或字符串命令
public Process exec(String command)
// 在单独的进程中执行指定命令和变量
public Process exec(String[] cmdArray)
// 在指定环境的独立进程中执行指定命令和变量
public Process exec(String command, String[] envp)
// 在指定环境的独立进程中执行指定的命令和变量
public Process exec(String[] cmdArray, String[] envp)
// 在指定环境和工作目录的独立进程中执行指定的字符串命令
public Process exec(String command, String[] envp, File dir)
// 在指定环境和工作目录的独立进程中执行指定的命令和变量
public Process exec(String[] cmdarray, String[] envp, File dir)
// 参数说明:
cmdarray // 包含所调用命令及其参数的数组。数组第一个元素是命令,其余是参数
envp // 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,则该参数为null
dir // 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为null
// 参数cmdArray 示例:shutdown -s -t 3600
String arr[] = {"shutdown","-s","-t","3600"};
Process process = Runtime.getRuntime().exec(arr[]);
/*
注意:
在调用这个方法时,不能将命令和参数放在一起,eg:String arr[] = {"shutdown -s -t 3600"};
这样会导致程序把“shutdown -s -t 3600”当成是一条命令的名称,然后去查找“shutdown -s -t 3600”这条命令,它当然会找不到,所以就会报错
*/
实例:
StringBuilder result = new StringBuilder("");
BufferedReader br = null;
Process process = null;
try {
// Linux版本
process = Runtime.getRuntime().exec(new String[]{"/bin/sh",command});
// Windows版本
// process = Runtime.getRuntime().exec(new String[]{"cmd /c",command});
process.waitFor();
br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = br.readLine()) != null){
result.append(line).append("\n");
}
}
catch (Exception e){
log.error("执行脚本失败",e);
}
finally {
CloseStream.closed(br);
process.destroy();
}
2.Oracle版本命令
SQL plus登录方式:
-
以操作系统权限认证的oracle sys管理员登陆
sqlplus / as sysdba
-
不在cmd或者terminal当中暴露密码的登陆方式
sqlplus /nolog
SQL> conn /as sysdba & SQL> conn sys/password as sysdba
-
非管理员用户登陆
sqlplus scott/tiger
-
非管理员用户使用tns别名登陆
sqlplus scott/tiger@orcl
-
管理员用户使用tns别名登陆
sqlplus sys/password@orcl as sysdba
执行脚本命令 @
完整命令:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK && cd /home/oracle/filePath && echo exit | sqlplus oracle/******@127.0.0.1:1521/orcl @install.sql >/home/oracle/logFile.log 2>&1
命令关键点:
-
&&
用来连接多个命令
-
echo exit |
在 “ | ” 管道符后的命令执行完之后将 “ exit ”输出到shell,以此退出SQL plus的命令模式
-
@install.sql
表示执行当前目录下的install.sql脚本
-
>/home/oracle/logFile.log 2>&1
将SQL plus命令的执行结果,存储到.log文件中;2>&1 表示 将标准错误重定向到标准输出。这里标准输出已经重定向到了 .log,那么标准错误也会输出到.log。
-
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
从数据库查询出字符集,防止脚本内容乱码、插入数据乱码;
3.MySQL版本命令
mysql常用参数介绍:
mysql
-h:数据库IP
-P(大写): 数据库端口
-u:用户名
-p:用户密码
-D:数据库名称
-e:需要执行的命令
执行脚本命令 source
完整命令:
cd /home/oracle/filePath/oracle/Install && mysql -hIP -P3306 -username -ppassWd -D database -e "source install.sql" --default-character-set=utf8mb4 --skip-column-names >/home/oracle/logFile.log 2>&1
命令关键点:
-e 后的参数值为执行的source命令,需要使用双引号圈起来
--default-character-set=utf8mb4
设置脚本执行时的编码格式,一般使用数据库服务端字符集,防止脚本内容乱码、插入数据乱码;
--skip-column-names
编写脚本时往往会使用 select 输出一些提示语句,防止出现列名;