场景

在Java代码中调用mysqldump命令实现对指定的mysql数据库和指定的表导出为sql文件。

并将sql文件进行压缩成zip存储备份。

mysqldump 简介

mysqldump 是 MySQL 自带的逻辑备份工具。

它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。

要想使用我们需要找到mysql安装目录下的bin下的mysqldump.exe

因为没有将其添加到环境变量中,所以需要找到其所在的全路径。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

首先需要声明一些执行mysqldump的变量

    private static String hostIP = "127.0.0.1";private static String userName = "root";private static String password = "123456";//sql文件存储的路径private static String savePath = "D:/bak";//sql文件存储名private static String fileName = "badaoBak"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".sql";//数据库名private static String databaseName = "test";private static final int BUFFER = 8192;//zip压缩包存储路径private static String zipPath = "D:/bak/badao.zip";

然后新建方法用语执行sql的导出

    /*** 执行数据备份* @return*/public static String dataBakExec(){String sqlFilePath = "";File saveFile = new File(savePath);// 如果目录不存在if (!saveFile.exists()) {// 创建文件夹saveFile.mkdirs();}if(!savePath.endsWith(File.separator)){savePath = savePath + File.separator;}PrintWriter printWriter = null;BufferedReader bufferedReader = null;try {printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));sqlFilePath= savePath + fileName;//导出指定数据库指定表的结构和数据Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName +" book ");//导出指定数据库指定表的结构//Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName + " book -d");//导出指定数据库指定表符合条件的结构和数据//Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName +" book "+" --where=\" price> 100" + "\" ");InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");bufferedReader = new BufferedReader(inputStreamReader);String line;while((line = bufferedReader.readLine())!= null){printWriter.println(line);}printWriter.flush();//0 表示线程正常终止。if(process.waitFor() == 0){System.out.println("备份数据成功");}}catch (Exception e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (printWriter != null) {printWriter.close();}} catch (IOException e) {e.printStackTrace();}}return  sqlFilePath;}

注意把这里的mysqldump的路径改为自己的路径。

执行的命令如果不加具体的数据库则导出所有的表,数据库后面加表明则是导出具体的表。

并且还可以选择导出表的结构和数据以及符合要求的表数据。

具体自行搜索musqldump命令。

备份sql效果

sql备份成功后将其路径返回,然后再新建一个生成zip压缩包的方法

   /*** 压缩sql文件为zip* @param filePath sql文件路径* @param zipPath  要生成的zip压缩包路径*/public static void zipFile(String filePath,String zipPath) {ZipOutputStream out = null;try {out = new ZipOutputStream(new FileOutputStream(zipPath));} catch (FileNotFoundException e) {e.printStackTrace();}//得到文件列表信息File file = new File(filePath);// 压缩zip包try {if (!file.exists()) {return;}BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));try {ZipEntry entry = new ZipEntry(file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}} catch (Exception e) {throw new RuntimeException(e);}finally {out.closeEntry();bis.close();}}catch (Exception e){e.printStackTrace();}finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("生成zip成功");}

然后完整的main方法示例代码

package com.badao.mysqlbak;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class MysqlBakMain {private static String hostIP = "127.0.0.1";private static String userName = "root";private static String password = "123456";//sql文件存储的路径private static String savePath = "D:/bak";//sql文件存储名private static String fileName = "badaoBak"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())+".sql";//数据库名private static String databaseName = "test";private static final int BUFFER = 8192;//zip压缩包存储路径private static String zipPath = "D:/bak/badao.zip";public static void main(String[] args) {String sqlFilePath = dataBakExec();System.out.println("备份的sql文件保存路径为:"+sqlFilePath);zipFile(sqlFilePath,zipPath);}/*** 执行数据备份* @return*/public static String dataBakExec(){String sqlFilePath = "";File saveFile = new File(savePath);// 如果目录不存在if (!saveFile.exists()) {// 创建文件夹saveFile.mkdirs();}if(!savePath.endsWith(File.separator)){savePath = savePath + File.separator;}PrintWriter printWriter = null;BufferedReader bufferedReader = null;try {printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + fileName), "utf8"));sqlFilePath= savePath + fileName;//导出指定数据库指定表的结构和数据Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName +" book ");//导出指定数据库指定表的结构//Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName + " book -d");//导出指定数据库指定表符合条件的结构和数据//Process process = Runtime.getRuntime().exec("C:/Program Files/MySQL/MySQL Server 5.6/bin/mysqldump -h" + hostIP + " -u" + userName + " -p" + password + " --set-charset=UTF8 " + databaseName +" book "+" --where=\" price> 100" + "\" ");InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), "utf8");bufferedReader = new BufferedReader(inputStreamReader);String line;while((line = bufferedReader.readLine())!= null){printWriter.println(line);}printWriter.flush();//0 表示线程正常终止。if(process.waitFor() == 0){System.out.println("备份数据成功");}}catch (Exception e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (printWriter != null) {printWriter.close();}} catch (IOException e) {e.printStackTrace();}}return  sqlFilePath;}/*** 压缩sql文件为zip* @param filePath sql文件路径* @param zipPath  要生成的zip压缩包路径*/public static void zipFile(String filePath,String zipPath) {ZipOutputStream out = null;try {out = new ZipOutputStream(new FileOutputStream(zipPath));} catch (FileNotFoundException e) {e.printStackTrace();}//得到文件列表信息File file = new File(filePath);// 压缩zip包try {if (!file.exists()) {return;}BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));try {ZipEntry entry = new ZipEntry(file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}} catch (Exception e) {throw new RuntimeException(e);}finally {out.closeEntry();bis.close();}}catch (Exception e){e.printStackTrace();}finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}System.out.println("生成zip成功");}}

运行效果

Java中使用mysqldump实现mysql数据库备份并将sql文件打成zip压缩包相关推荐

  1. 在java中使用JDBC连接mysql数据库时的服务器时区值无法识别或表示多个时区的问题解决方案

    项目场景: 在java中使用JDBC连接mysql数据库时,报以下的错:Exception in thread "main" java.sql.SQLException: The ...

  2. linux将mysql导出表数据导入另一台服务器_远程linux服务器mysql数据库导入和导出.sql文件...

    今天对需要将服务器上的数据库放到本地环境,之前没怎么这么操作过,ORZ,弱鸡,这篇帖子不错,收藏了!!! 远程linux服务器mysql数据库导入和导出.sql文件 大部分情况本地开发环境为windo ...

  3. 远程linux服务器mysql数据库导入和导出.sql文件

    大部分情况本地开发环境为windows,部署的服务器为Linux,本地数据库导出.sql文件后需要远程导入服务器,具体如下. 首先连接服务器,即服务器ip,协议,端口,用户名及密码,可以通过ftp客户 ...

  4. Java中通过JDBC操作MySQL数据库

    JDBC相关的操作  0.JDBC常用类和接口介绍  DriverManager类  DriverManager类用来管理数据库中的所有驱动程序:是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用 ...

  5. java中class.forname连接mysql数据库_数据库链接与 Class.forName()用法详解

    主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...

  6. mysql数据库使用命令导入sql文件

    第一步: 在数据库安装目录下打开cmd窗口 第二步: 输入命令登录数据库: mysql -u root -p 回车 输入密码 回车 第三步: 创建数据库命令: create database 数据库名 ...

  7. mysql数据库source命令导入sql文件

    在导入大的sql文件时,使用可视化工具导入往往效率极低,此时,我们常常使用在cmd中执行source命令的方式 第一步,打开cmd命令窗口,进入数据库 mysql  -u用户名  -p 输入密码 第二 ...

  8. mysql数据库source命令导入sql文件记录

    第一步:打开cmd命令窗口,进入数据库 第二步:创建数据库 mysql> create database demo; 第三步:source 导入sql文件 Bug1 mysql> sour ...

  9. java中class.forname连接mysql数据库_Java加载数据库连接驱动,为什么要用Class.forName()方法?...

    展开全部 目的是为了实例化对象. Class.forName("")返回的是类e68a84323131333532363134313032313635333133336564363 ...

最新文章

  1. 【知识积累】随机数生成的几种方法
  2. solr4.1 DataImport MYSQL批量导入
  3. dataBinding和retrofit的使用
  4. 利用python随机生成姓名的实例教程
  5. 【JEECG技术博文】jeecg 定时任务配置用法
  6. 多元正态分布的后验采样(包含程序)
  7. python unescape函数_Python中的Unescape字符串
  8. 《UNIX环境高级编程(第3版)》——2.6 选项
  9. fatal error: stropts.h: 没有那个文件或目录
  10. bp神经网络预测模型原理,神经网络模型怎么预测
  11. html 刷新页面,javascript刷新页面的几种方法
  12. ZXing实现扫描或选取图片识别二维码及条码功能
  13. 自然语言处理系列四》新词发现与短语提取》新词发现
  14. Binet‘s Formula 算法
  15. 根据经纬度定位百度地图(带图片的)
  16. chap4Web服务器-入门学习笔记
  17. Big Faceless Java Pdf报表生成器
  18. 怎么修改PDF文字,PDF修改文字用什么方法
  19. 零基础新手小白学编程必会的100个代码
  20. 关于谷歌浏览器不能用flash插件的问题

热门文章

  1. java——自己实现基础的线程池及带有任务数过多拒绝策略、线程池销毁、自动扩充线程数量及闲时自动回收线程等操作的改进版线程池
  2. 缓冲流、转换流、序列化流、打印流
  3. JavaWeb项目中如何扩展一个Request对象——包装器HttpServletRequestWrapper
  4. websettings 哪里设置_云浮超级电容用石墨哪里买,可膨胀石墨_青岛天源达
  5. 银河麒麟可执行文件双击,闪退问题
  6. 开头和结尾标记 在不同系统_文本标记的宝藏平台——Docusky
  7. 7、leetcode410 分割数组的最大值
  8. java内存模型浅析_浅析java内存模型
  9. apply_async进程不执行_c/c++面试精选题(八)简单回答,进程和线程关系及区别...
  10. python处理数据库_python操作数据库