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备份命令参数详解

时间: 2024-10-20 11:21:04

Java实现Mysql数据库自动备份的相关文章

Windows Server服务器端MySQL数据库自动备份

1.给root账户授权所有sql权限 grant all privileges on *.* to [email protected]"%" identified by "."; flush privileges; 2.建立bat批处理文件 @echo off set path=%path%;D:\Program Files\MySQL\MySQL Server 5.5\bin set y=%date:~0,4% set m=%date:~5,2% set d=%d

设置mysql数据库自动备份

由于项目需要,在windows下的mysql实现数据库自动备份.经资料查询和尝试,得出方法有两种: 1.使用windows自带的任务计划,然后定时执行一个数据库备份的脚本. 2.使用mysql管理工具navicat配置数据库的备份 这里,由于第二种方法比较简单实用,我就简单描述下第二种方法(因为简单). 工具: navicat for mysql mysql 5.5 步骤: 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击“计划”,再点击“新建批处理作业”. . 

mysql数据库自动备份脚本分享

前几篇博客已经相继公开了去转盘网的所有技术细节,如下: 百度网盘爬虫 中文分词算法 邀请好友注册 js分页部分代码 这篇博客我将继续公开数据库自动备份的代码.可以这么说,没有数据库,一切就是个蛋,没有数据库备份,一切还是个蛋,你可以想象数据库备份多么重要.不会linux,不会写shell的朋友麻烦先去补补.不过你说我牛逼,不补也能看懂,那没问题,哈哈,废话不说了.老规矩,上代码: #!/bin/bash time=$(date +"%d-%m-%Y") pre=/home/ubuntu

mysql数据库自动备份,并发送邮件通知

一 前提 系统环境:centos6.1 脚本作用:备份指定服务器上的指定数据库,并通过scp传送到另一台备份主机,然后发送备份是否成功邮件到指定邮箱 思路:首先在备份脚本中把备份报告导出为一个db_backup.log文件,然后邮件脚本会把这个log内容作为邮件内容发送给指定用户,也就实现了邮件通知 说明:如果需要备份到远程主机,需要首先做好ssh密钥认证,scp要使用到 二 备份脚本 备份脚本用法:如果需要备份某个数据库,在脚本后面添加一条备份命令,像下面这样 backup_db  10.90

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

1.给mysql创建用户备份的角色,并且授予角色SELECT, RELOAD, SHOW DATABASES, LOCK TABLES等权限. mysql> create user 'backuper'@'localhost' identified by '********'; Query OK, 0 rows affected (0.00 sec) mysql> grant SELECT, RELOAD, SHOW DATABASES, LOCK TABLES on *.* to backu

mysql数据库自动备份

1.vi /home/wangcn/auto_log.sh#!/bin/bash #Shell Command For Backup MySQL Database Everyday Automatically By Crontab USER=root PASSWORD="[email protected]" DATABASE="base_info" HOSTNAME="192.168.1.233" [email protected] BACKUP

centos下mysql数据库自动备份并删除N天前备份文件

1.创建bak_xx_mysql.sh文件 #!/bin/bash# Name:bak_xx_mysql.sh# XX数据库文件备份#db_user="root"db_passwd="root"db_name="db_name"#mysqldump 目录mysql_bin_dir="/alidata/server/mysql-5.6.21/bin/mysqldump"# 备份文件目录backup_dir="/alid

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

构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是重中之重的首要工作.电 子商务网站更加注重考虑数据安全,数据备份方案,包括本地备份.异地备份架构.其中Linux服务器的备份方案非常多,本文介绍一个大众化适用的解决方 案,通过编写Shell脚本来完成自动备份.本架构包括备份网站文件.数据库,自动本地备份并FTP上传备份脚本,完成相应本地备份.异地备

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

权声明:本文为博主原创文章,未经博主允许不得转载. 博客<Java实现MySQL数据库备份(一)>使用I/O流的方式实现了MySQL数据库的备份,这种方法比较繁杂,下面介绍另一种备份MySQL数据库的方法: [java] view plain copy import java.io.File; import java.io.IOException; /** * MySQL数据库备份 * * @author GaoHuanjie */ public class MySQLDatabaseBack