傻瓜式Java操作MySQL数据库备份

news2024/12/25 9:27:04

在这里插入图片描述

文章目录

  • 前言
  • 存储数据库
  • 存储数据表

前言

  数据库备份是开发工作中经常要做的事情,好处是mysql提供了一个非常好的命令 mysqldump,直接调用它就可以将数据以sql文件的形式备份出来。但是直接写命令非常不方便,遇到定时备份或者指定备份那么就需要代码调用。下面是一个使用java代码调用该命令的小示例:

mysqldump -u username -p password -h host -P port exportDatabaseName exportPath

  在进行导出的时候,需要注意命令语句的运行环境,如果已经将mysql安装路径下的bin加入到系统的path变量中,那么在导出的时候可以直接使用命令语句,否则,就需要在执行命令语句的时候加上命令所在位置的路径,即mysql安装路径想的bin下的mysqldump命令。

存储数据库

public class DataSyncTransfer {
	/** MySQL安装目录的Bin目录的绝对路径 */
	private static String mysqlBinPath = "/usr/local/mysql/bin/";
	private static String mysqldump = mysqlBinPath + "mysqldump";

	/**
	 * 备份 MySQL 数据库
	 * 
	 * @param clientIp   访问MySQL数据库的主机
	 * @param port       访问MySQL数据库的端口
	 * @param userName   访问MySQL数据库的用户名
	 * @param password   访问MySQL数据库的密码
	 * @param database   需要备份的数据库,多个数据库之间使用逗号分隔
	 * @param backupFile 备份文件存放的路径,如果指定路径的文件不存在会自动生成
	 */
	public static boolean backupDatabase(String clientIp, int port, String userName, String password, String database,
			String backupPath) throws Exception {
		// 当前日期
		String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		// 当前时间
		String currentTime = new SimpleDateFormat("HH-mm-ss").format(Calendar.getInstance().getTime());
		// 备份文件名
		String backupFileName = database + "-" + currentDate + "-" + currentTime + ".sql";
		// 备份文件路径
		String backupFilePath = backupPath + backupFileName;
		// 创建备份文件存放目录,如果已经存在则不创建
		new File(backupPath).mkdirs();

		// 新建命令列表
		List<String> commandList = new ArrayList<>();
		// 添加命令:备份 MySQL 数据库
		commandList.add(mysqldump);
		// 添加命令参数:MySQL 服务器地址
		if (StringUtils.isNoneBlank(clientIp)) {
			commandList.add("--host=" + clientIp);
		}
		// 添加命令参数:MySQL 用户名
		commandList.add("--user=" + userName);
		// 添加命令参数:备份文件路径
		commandList.add("--result-file=" + backupFilePath);
		// 添加命令参数:指定要备份的数据库
		commandList.add("--databases");
		// 添加要备份的数据库名称
		commandList.add(database);

		// 创建进程构建器
		ProcessBuilder pb = new ProcessBuilder(commandList);
		// 设置 MySQL 密码
		pb.environment().put("MYSQL_PWD", password);
		// 启动进程
		Process process = pb.start();
		readStringFromInputStream(process.getInputStream(), backupFilePath);
		// 等待进程结束
		int processComplete = process.waitFor();

		if (processComplete == 0) { // 如果进程成功结束
			return true;
		} else { // 如果进程没有成功结束
			return false;
		}
	}

	/**
	 * 存储文件
	 */
	private static void readStringFromInputStream(InputStream stream, String backupFilePath) throws IOException {
		byte[] buff = new byte[128];
		int n;
		FileOutputStream fileOutputStream = null;
		StringBuilder sb = new StringBuilder();
		try {
			while ((n = stream.read(buff)) != -1) {
				sb.append(new String(buff, 0, n));
			}
			fileOutputStream = new FileOutputStream(new File(backupFilePath));
			fileOutputStream.write(sb.toString().getBytes());

		} finally {
			fileOutputStream.close();
			stream.close();
		}
	}
}

存储数据表

public class DataSyncTransfer {
	/** MySQL安装目录的Bin目录的绝对路径 */
	private static String mysqlBinPath = "/usr/local/mysql/bin/";
	private static String mysqldump = mysqlBinPath + "mysqldump";

	/**
	 * 备份数据表
	 * 
	 * @param clientIp   访问MySQL数据库的主机
	 * @param port       访问MySQL数据库的端口
	 * @param userName   访问MySQL数据库的用户名
	 * @param password   访问MySQL数据库的密码
	 * @param database   需要备份的数据库
	 * @param tableName  需要备份的数据库,多个表之间使用空格分隔
	 * @param backupFile 备份生成的文件路径,如果指定路径的文件不存在会自动生成
	 */
	public static boolean backupTable(String clientIp, int port, String userName, String password, String database,
			String tableNames, String backupPath) throws Exception {
		// 根据逗号分隔符,将要备份的数据库名称拆分成数组
		// String[] tableArr = tableNames.split(",");
		// 当前日期
		String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());
		// 当前时间
		String currentTime = new SimpleDateFormat("HHmmss").format(Calendar.getInstance().getTime());
		// 备份文件名
		String backupFileName = database + "-" + currentDate + currentTime + ".sql";
		// 备份文件路径
		String backupFilePath = Paths.get(backupPath, backupFileName).toFile().getPath();

		String command = mysqldump + " -u" + userName + " -p" + password + " " + database + " " + tableNames;
		Process process = Runtime.getRuntime().exec(command);
		readStringFromInputStream(process.getInputStream(), backupFilePath);

		// 等待进程结束
		int processComplete = process.waitFor();

		if (processComplete == 0) { // 如果进程成功结束
			return true;
		} else { // 如果进程没有成功结束
			return false;
		}
	}

	/**
	 * 存储文件
	 */
	private static void readStringFromInputStream(InputStream stream, String backupFilePath) throws IOException {
		byte[] buff = new byte[128];
		int n;
		FileOutputStream fileOutputStream = null;
		StringBuilder sb = new StringBuilder();
		try {
			while ((n = stream.read(buff)) != -1) {
				sb.append(new String(buff, 0, n));
			}
			fileOutputStream = new FileOutputStream(new File(backupFilePath));
			fileOutputStream.write(sb.toString().getBytes());

		} finally {
			fileOutputStream.close();
			stream.close();
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旗舰版企业CRM客户管理系统商业源码(基于Thinkphp内核开发)+无加密无域名限制+可二次开发

注&#xff1a;本资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; 旗舰版企业CRM客户管理系统商业源码&#xff0c;它无任何加密无域名限制&#xff0c;并且源码可以二次开发&#xff0c;它是基于Thinkph…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群&#xff0c;开始。 前提条件&#xff0c;docker安装了docker-compose。如果没安装的话&#xff0c;参考这里 docker-compose文件参考bitnami官网&#xff1a;https://github.com/bitnami/contai…

用Java打印长方形、平行四边形 、三角形、菱形、空心菱形

今天复习使用嵌套for来完成一些任务&#xff0c;于是想着打印一些图形来练习 思考感悟 长方形 行数 和 每行的星星数嵌套遍历即可 平行四边形 核心&#xff1a;每行空格数总行数-行数 行数空格数132231 三角形 核心&#xff1a;每行星星数2*当前行数-1 行数星星数1123…

【每日一题】2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 - 力扣&#xff08;LeetCode&#xff09; 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 …

Elasticsearch:使用 Elasticsearch 进行语义搜索

在数字时代&#xff0c;搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语&#xff0c;期望搜索引擎返回与这些确切关键字匹配的结果。 虽然关键字搜索对于简化信息检索非常有价值&#xff0c;但它也有其局…

【分布式计算】二、架构(Architectures)

1.中心化架构&#xff08;Centralized Architectures&#xff09; 1.1.经典C/S模型 服务器&#xff1a;一个或多个进程提供服务 客户端&#xff1a;一个或多个进程使用服务 客户端和服务器可以在不同的机器上 客户端遵循请求/回复模型 1.2.传统三层视图 用户界面层&#x…

【正点原子】开发板可以ping通电脑,电脑ping不通开发板

Uboot模式下 uboot模式下因为相关服务没有开启&#xff0c;只能uboot ping通电脑&#xff0c;电脑ping不通开发板 note: 电脑需要关闭防火墙 App模式 该模式下&#xff0c;如果已经打开网络还是ping不通开发板 关闭电脑wifi再重试

WebPack-打包工具

从图中我们可以看出&#xff0c;Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件&#xff0c;减少了页面的请求. 下面举个例子 &#xff1a; main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…

uboot启动流程涉及reset汇编函数

一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下&#xff0c;uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习&#xff0c;地址如下&#xff…

外包干了2个月,技术有明显退步...

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!可我已经在一个企业干了3年的功能测试&…

ELK 处理 Spring Boot 日志

ELK 处理 Spring Boot 日志&#xff0c;妙啊&#xff01; 来源&#xff1a;ibm.com/developerworks/cn/java /build-elk-and-use-it-for-springboot -and-nginx/index.html ELK 简介 Logstash Elasticsearch Kibana ELK 实现方案 ELK 平台搭建 安装 Logstash 安装 Elas…

ROS系统读取USB相机图像数据

ROS系统读取USB相机图像数据 前言usb_cam 功能包下载与编译摄像头选择连接摄像头可配置参数 前言 usb_cam功能包简介 为了丰富机器人与外界的交互方式&#xff0c;已经增加了与机器人的语音交互方式&#xff0c;不仅使机器人能够说话发声&#xff0c;还能听懂我们说的话&#…

友思特案例|友思特 Ensenso 3D相机:汽车工业自动化的革命性力量

01 内容摘要 在竞争激烈的汽车行业&#xff0c;自动化生产至关重要。友思特 Ensenso 3D相机为汽车制造商提供了可靠的工具和技术支持&#xff0c;助力多个关键环节。它在汽车座位泡棉切割中提高精确度&#xff0c;降低浪费&#xff0c;提高生产效率&#xff1b;在汽车压铸零部…

第七章 查找 九、B+树

目录 一、定义 二、B树需要满足的条件 三、重要考点 一、定义 1、B树是一种常用的数据结构&#xff0c;用于实现关系型数据库中的索引。 2、其特点是可以在磁盘等外存储器上高效地存储大量数据&#xff0c;并支持快速的查询、插入、删除等操作。 3、B树的结构类似于二叉搜…

ASUS华硕ZenBook 13灵耀U 2代U3300F笔记本UX333FN/FA原装出厂Win10系统工厂安装模式

系统自带所有驱动、出厂主题壁纸、系统属性华硕专属LOGO标志、Office办公软件、MyASUS华硕电脑管家等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1dK0vMZMECPlT63Rb6-jeFg?pwdbym5 所需要工具&#xff1a;16G或以上的U盘(非必需) 文件格式&#xff1a;HDI,SWP,O…

RocketMQ 消息丢失问题排查记录

现象 在 spring boot 项目中集成 RocketMQ 时发现消费者接收消息丢失&#xff0c;比如生产者发送了 10 条消息&#xff0c;但是消费者只能接收到 4 条。 在项目中使用的 RocketMQ 版本是 4.9.2&#xff0c;rocketmq-spring-boot-starter 版本是 2.2.2&#xff0c;消息处理逻辑…

聊聊并发编程——Condition

目录 一.synchronized wait/notify/notifyAll 线程通信 二.Lock Condition 实现线程通信 三.Condition实现通信分析 四.JUC工具类的示例 一.synchronized wait/notify/notifyAll 线程通信 关于线程间的通信&#xff0c;简单举例下&#xff1a; 1.创建ThreadA传入共享…

获取dom元素

<button type"button" click"greet">count is {{ count }}</button>function greet(event) {if (event) {console.log(event)console.log(event.target)console.log(event.target.tagName)} } 很明显没传参数&#xff0c;但是获取到了相应的值…

JIT介绍

JIT全称&#xff1a;Just in time。中文译为&#xff1a;即时的、实时的。 JVM中的这项技术名为&#xff1a;实时编译技术&#xff0c;也叫即时编译技术。就是在java程序运行的过程中&#xff0c;将字节码编译为机器码运行在本地&#xff0c;而不是通过JVM解释运行&#xff08;…

微信公众号网页授权登录获取用户基本信息

概述 微信公众号网页授权登录后微信获取用户基本信息&#xff0c;部署即可运行完整demo 详细 一、前言 &#xff08;1&#xff09;适合人群 1&#xff0c;JAVA服务端开发人员 2&#xff0c;初级人员开发人员 3&#xff0c;了解spring springboot maven 3&#xff0c;了…