需要注意的就是,执行数据库备份和还原操作,直接用Runtime.getRuntime().exec 的话会造成阻塞,因为读写数据量太大,所以用线程来实现。还有就是网上看到一堆 说什么命令前面加上 “/bin/ch”,”-c” 反正我试了的,加这个不行 。但是加上 “/bash/”,”-c” 是可以的。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@Controller
@RequestMapping(value = "/DbOperate")
public class DbOperate {
private static Process process = null;
@RequestMapping(value = "/dbBackUp", method = RequestMethod.POST)
@ResponseBody
public String dbBackUp() throws Exception {
String msg = "";
try {
String sb = "mysqldump -uAdmin -pchinawiserv --set-charset=UTF8 oc4db > /bak/mysqldata/oc4db_$(date " +
"+%Y%m%d_%H%M%S).sql";
process = Runtime.getRuntime().exec(new String[]{"bash", "-c",sb});
final InputStream is1 = process.getInputStream();
final InputStream is2 = process.getErrorStream();
new Thread(){
public void run(){
BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
String line1 = null;
while ((line1 = br1.readLine()) != null){
if(line1 != null){}
}catch (IOException e){
e.printStackTrace();
finally {
try {
is1.close();
}catch (IOException e){
e.printStackTrace();
}.start();
new Thread(){
public void run(){
BufferedReader br2 = new BufferedReader(new InputStreamReader(is2));
String line2 = null;
while ((line2 = br2.readLine()) != null){
if(line2 != null){}
}catch (IOException e){
e.printStackTrace();
finally {
try {
is2.close();
}catch (IOException e){
e.printStackTrace();
}.start();
process.waitFor();
process.destroy();
msg = "数据库备份成功";
}catch (Exception e){
msg = "数据库备份失败";
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
}catch (Exception ee){
return msg;
public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
public Process exec(String [] cmdArray)---在单独的进程中执行指定命令和变量
public Process exec(String command, String [] envp)----在指定环境的独立...
原文:https://www.cnblogs.com/tohxyblog/p/6501396.html
java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行。在java中,RunTime.getRuntime().exec()就实现了这个功能。
用法: public Process exec(String comma...
在调用Runtime.getRuntime().exec()方法时,应该使用安全的参数。例如,可以使用绝对路径来指定要执行的程序,而不是使用相对路径。:如果应用程序频繁调用该方法,可能会导致内存泄漏,因为每次调用都会创建一个新的进程。:可以使用ProcessBuilder类来创建一个进程,并将该进程与应用程序相关联。:频繁调用该方法也会带来安全问题。如果应用程序使用不安全的参数调用该方法,攻击者可能会利用这些参数来执行恶意代码或攻击系统。:在使用完进程后,应该及时关闭它,以释放资源并避免内存泄漏。
String result =
StringUtils.trim(InputStreamUtils.getContentsAsString(exec.getInputStream(),
"utf8"));//接收执行结果
上篇博文中CallMaxentThreadPoolTask类直接使用Runtime.getRuntime().exec方法调用cmd命令,结果今天在测试时发现当cmd命令执
行出现错误或警告时,主控程序的waitfor方法会被阻塞一直等待下去,查了查资料发现是Runtime.getRuntime().exec方法需要自己处理
stderr 及stdout流,而解决方法即是将它们导出用别的t...
我的语句是这样的:
mysqldump --ignore-table=test.recovery -h127.0.0.1 -uroot -p123456 --add-locks --opt test >C:\\Users\\DELL\\Desktop\\testmysqldump\\test.sql
尝试过使用绝对路径如:
D:\\mysql\\mysql-5.7.7.
需求:每晚凌晨对项目数据库进行定时备份。
方案:采用定时任务使用Runtime.getRuntime().exec(cmd)操作mysqldump命令实现
window环境下:
@Configuration
@EnableScheduling
@Slf4j
public class JobService {
@Scheduled(cron = "0 50 23 * * ?")
private void dbBackup() throws Exception {
String
1 概述使用java备份mysql数据库,主要是使用mysqldump与Runtime().getRuntime().exec().2 创建备份路径如果没有备份的存储路径首先创建路径.Path path = Paths.get(xxxx);try{Files.createDirectories(path);}catch(IOException e){//xxxx}3 执行命令如果是直接用shell...
Runtime.exec()备份MySQL数据库出现的问题关于waitFor()堵塞关于备份数据库为空的问题问题1解决方案问题2解决方案总结
前几天在用Runtime搞数据库备份,其实也就是使用Runtime.exec()调用mysqldump的指令来备份数据库,由于没怎么接触过Runtime这个类,遇到了一些问题,头发差点都给我撸秃了,先是waitFor(),然后是备份数据库,文件出来了,但是是...
public String executionCommand(String command) throws Exception {
String msg = "";
Process process
try {
process = Runtime.getRuntime().exec(["bash", "-c",command] as String[]);
InputStream is1 = process.getInputStream();
给大家提个醒:
有人说用:"mysqldump --uroot --p123456 --opt"。但是我没有成功,最后使用这种写法成功了:"mysqldump --user=root --password=123456 --opt"