Java实现Mysql数据库自动备份
最近项目中有一个这样的需求,要求定时备份数据库。看了一些网上的资料,了解到主要思路是是使用java中的Runtime类的exec()方法,可以直接调用windows的cmd命令,参数就是Mysql的备份命令。
一、Runtime类
首先说说这个神奇的Runtime类,主要封装了Java程序的运行环境,每一个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与运行时环境相连,应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获得与之关联的Runtime对象。
Runtime代表Java程序的运行时环境,可以访问JVM的相关信息,如处理器数量,内存信息。
1.1、常用API
addShutdownHook(Thread hook)
注册新的虚拟机来关闭挂钩。
availableProcessors()
向 Java 虚拟机返回可用处理器的数目。
exec(String command)
在单独的进程中执行指定的字符串命令。
exec(String[] cmdarray)
在单独的进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp)
在指定环境的独立进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp, File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量。
exec(String command, String[] envp)
在指定环境的单独进程中执行指定的字符串命令。
exec(String command, String[] envp, File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令。
exit(int status)
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。
freeMemory()
返回 Java 虚拟机中的空闲内存量。
gc()
运行垃圾回收器。
InputStream getLocalizedInputStream(InputStream in)
已过时。 从 JDK 1.1 开始,将本地编码字节流转换为 Unicode 字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。
OutputStream getLocalizedOutputStream(OutputStream out)
已过时。 从 JDK 1.1 开始,将 Unicode 字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、BufferedWriter 和 PrintWriter 类。
getRuntime()
返回与当前 Java 应用程序相关的运行时对象。
halt(int status)
强行终止目前正在运行的 Java 虚拟机。
load(String filename)
加载作为动态库的指定文件名。
loadLibrary(String libname)
加载具有指定库名的动态库。
maxMemory()
返回 Java 虚拟机试图使用的最大内存量。
removeShutdownHook(Thread hook)
取消注册某个先前已注册的虚拟机关闭挂钩。
runFinalization()
运行挂起 finalization 的所有对象的终止方法。
runFinalizersOnExit(value)
已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。
totalMemory()
返回 Java 虚拟机中的内存总量。
traceInstructions(on)
启用/禁用指令跟踪。
traceMethodCalls(on)
启用/禁用方法调用跟踪。
1.2、使用exec(String cmd)方法备份数据库
DatabaseTool类
package com.china_amss.base.tools; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter; import com.china_amss.base.thread.ErrorStreamThread; public class DatabaseTool { /**
* 备份数据库 ,控制台执行命令格式 "mysql的bin目录/mysqldump --databases -h主机ip -P端口 -u用户名 -p密码 --default-character-set=字符集 数据库名
* @param mysqlPath mysql路径
* @param mysqlIp mysql主机ip
* @param mysqlPort 端口
* @param userName 用户名
* @param password 密码
* @param charset 字符集
* @param database 数据库名
* @param resultFile 备份文件全路径
*/
public static void backup(String mysqlPath, String mysqlIp, String mysqlPort, String userName, String password, String database, String resultFile) {
InputStream in = null;
InputStreamReader isr = null;
BufferedReader br = null;
FileOutputStream fout = null;
OutputStreamWriter writer = null;
try {
Runtime rt = Runtime.getRuntime();
// 调用mysql的安装目录的命令
Process process = rt.exec("\"" + mysqlPath + File.separator + "mysqldump\" --databases -h" + mysqlIp
+ " -P" + mysqlPort + " -u" + userName + " -p" + password
+ " --add-drop-database --default-character-set=utf8 "+ database + " --result-file="+resultFile);
// 设置导出编码为utf-8。这里必须是utf-8
in = process.getInputStream();// 控制台的输出信息作为输入流
ErrorStreamThread errStream = new ErrorStreamThread(process.getErrorStream()); //错误流另开线程,不然会阻塞
errStream.start(); } catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(writer != null){
writer.close();
}
if(fout != null){
fout.close();
}
if(br != null){
br.close();
}
if(isr != null){
isr.close();
}
if(in != null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ErrorStreamThread类:
package com.china_amss.base.thread; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import com.china_amss.ktms.exception.KTMSException; public class ErrorStreamThread extends Thread { private InputStream input; // 控制台errorStream public ErrorStreamThread(InputStream input) {
this.input = input;
} @Override
public void run() {
InputStreamReader isr = null;
BufferedReader buff = null; try {
isr = new InputStreamReader(input);
buff = new BufferedReader(isr);
String line;
while ((line = buff.readLine()) != null) {
if (line.indexOf("Warning") != 0) {
throw new Exception(line);
}
}
} catch (Exception e) {
throw new Exception("错误流线程方法异常", e);
} finally {
try {
if (buff != null) {
buff.close();
}
if (isr != null) {
isr.close();
}
} catch (IOException e) {
throw new Exception("错误流线程方法异常", e);
}
}
}
}
注意:此处因为要输出错误提示,所以要使用另外一条线程输出,不然会阻塞
注意:上面用到的命令参数可以去查看我的另一篇专门整理了Mysql备份命令参数的文章,链接在这Mysql备份命令参数详解
Java实现Mysql数据库自动备份的更多相关文章
- mysql 数据库自动备份
@echo offset "Ymd=%date:~,4%%date:~5,2%%date:~8,2%""E:/MySQL/MySQL Server 5.7/bin/mys ...
- mysql数据库自动备份脚本
#!/bin/bash #功能说明:本功能用于备份mysql数据库 #编写日期:2018/05/17 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin ...
- Linux下实现MySQL数据库自动备份
1.给mysql创建用户备份的角色,并且授予角色SELECT, RELOAD, SHOW DATABASES, LOCK TABLES等权限. mysql> create user 'backu ...
- MySQL数据库自动备份
1.vi /home/wangcn/auto_log.sh#!/bin/bash #Shell Command For Backup MySQL Database Everyday Automatic ...
- java实现mysql数据库的备份及还原
备份: public static void backup() { try { Runtime rt = Runtime.getRuntime(); // 调用 调用mysql的安装目录的命令 Pro ...
- Centos7.6 Mysql数据库自动备份配置
1.查看磁盘空间情况 执行 df -h 选择剩余空间最大的目录 (以/目录为例) 2.创建备份目录: cd / mkdir backup cd backup 3.创建备份Shell脚本: vim mo ...
- MYSQL数据库自动本地/异地双备份/MYSQL增量备份
构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...
- Java实现MySQL数据库备份(二)
权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MyS ...
- Java实现mysql数据库备份
Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...
随机推荐
- 电脑桌面 IE 图标删除不了的解决方法
电脑换了系统之后想把桌面的IE浏览器给删掉,可是直接删除又删不掉,杀毒软件查杀也没有问题.找了很多方法,终于才把它给解决了.下面,就把我的方法分享给桌面ie图标删除不了的解决方法,希望能对大家有所帮助 ...
- Redux
redux是Flux的一种实现方式,但还是和Flux有些不同. React控制视图层,要想做一个完整的数据流,必须要用react-redux. 官方demo,自己收集了一下: demo1http:// ...
- 获取URL最后一个 ‘/’ 之后的字符
在开发项目的过程中,经常遇到需要解析论坛,博客等的URL的问题,比如:'abc/def/jkl' 或 'abc/def/jkl/',获取最后一个‘/’之后的所有字符‘jkl’,由于特殊字符'/'的个数 ...
- SQL Server中的事务与锁
了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...
- 《JavaScript语言精粹》小记
一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...
- ECMAScript5之Object
在ECMAScript5中对Object新增的些方法,以前没注意的同志们,嘻嘻,下面我们再一起来边看边学. 1.Object之create Create单词意为创造嘛,作为Object的静态方法,不言 ...
- How to make a not-so-boring speech?
For almost 26 years, even a trivial boy like me, have made over 100 and listened uncountable speeche ...
- 【记录】JS 生成 URL 二维码
示例代码: <html> <head> <title>example</title> </head> <body> <sc ...
- Android ViewPager切换之PageTransformer接口中transformPage方法解析
今天让我们了解一下,Android3.0之后ViewPager切换时候的一个动画.Google给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransfor ...
- 使用yield进行异步流程控制
现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...