最近项目中有一个这样的需求,要求定时备份数据库。看了一些网上的资料,了解到主要思路是是使用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数据库自动备份的更多相关文章

  1. mysql 数据库自动备份

    @echo offset "Ymd=%date:~,4%%date:~5,2%%date:~8,2%""E:/MySQL/MySQL Server 5.7/bin/mys ...

  2. mysql数据库自动备份脚本

    #!/bin/bash #功能说明:本功能用于备份mysql数据库 #编写日期:2018/05/17 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin ...

  3. Linux下实现MySQL数据库自动备份

    1.给mysql创建用户备份的角色,并且授予角色SELECT, RELOAD, SHOW DATABASES, LOCK TABLES等权限. mysql> create user 'backu ...

  4. MySQL数据库自动备份

    1.vi /home/wangcn/auto_log.sh#!/bin/bash #Shell Command For Backup MySQL Database Everyday Automatic ...

  5. java实现mysql数据库的备份及还原

    备份: public static void backup() { try { Runtime rt = Runtime.getRuntime(); // 调用 调用mysql的安装目录的命令 Pro ...

  6. Centos7.6 Mysql数据库自动备份配置

    1.查看磁盘空间情况 执行 df -h 选择剩余空间最大的目录 (以/目录为例) 2.创建备份目录: cd / mkdir backup cd backup 3.创建备份Shell脚本: vim mo ...

  7. MYSQL数据库自动本地/异地双备份/MYSQL增量备份

    构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...

  8. Java实现MySQL数据库备份(二)

    权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MyS ...

  9. Java实现mysql数据库备份

    Runtime是一个与JVM运行时环境有关的类,这个类是Singleton的. Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法. ...

随机推荐

  1. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob

    <Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...

  2. 加谁的QQ,并聊天‘

    tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=150540451&fuin=904776475

  3. Chrome开发者工具不完全指南(五、移动篇)

    前面介绍了Chrome开发者工具的大部分内容工具,现在介绍最后两块功能Audits和Console面板.一.Audits Audits面板会针对目前网页提出若干条优化的建议,这些建议分为两大类,一类是 ...

  4. Atitit webservice的发现机制 discover机制

    Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...

  5. jQuery第二篇 (帅哥)

    1.1 jQuery操作DOM jQuery课程的目标:学会使用jQuery设计常见效果 选择器 基本选择器:#id ..class .element.* . 层级选择器: 空格.>.+.~ 基 ...

  6. php安装的一点点事 ---wampserver

    安装wampserver后,需要配置一些文件 1. 首先修改httpd.conf <Directory /> Options FollowSymLinks AllowOverride No ...

  7. SQL Server 2014新特性探秘(2)-SSD Buffer Pool Extension

    简介     SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随 ...

  8. 深入理解DOM节点类型第一篇——12种DOM节点类型概述

    × 目录 [1]元素 [2]特性 [3]文本[4]CDATA[5]实体引用[6]实体名称[7]处理指令[8]注释[9]文档[10]文档类型[11]文档片段[12]DTD 前面的话 DOM是javasc ...

  9. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

  10. 制作动画或小游戏——CreateJS基础类(一)

    前面曾经记录过Canvas的基础知识<让自己也能使用Canvas>,在实际使用中,用封装好的库效率会高点. 使用成熟的库还能对基础知识有更深入的理解,CreateJS是基于HTML5开发的 ...