MySQL基于java实现备份表操作

核心是mysqldump和Runtime
操作其实并不是很困难,创建一个进行备份操作的类,接收到备份调用后,标记该表正在备份,然后创建一个子线程进行备份操作。所需的配置信息是从配置文件读取的,也要注意在Windows和linux下路径问题。

配置文件如下:

Java代码 收藏代码
# 数据库地址
dbAddress=localhost
# 要备份的数据库名称
databaseName=nms
# 数据库用户名
username = root
# 数据库密码
password = root
# mysqldump 路径 Linux
mysqlpath = /usr/bin/
# 备份文件存放位置 Linux
sqlFilePath =/MySQlBack/
# mysqldump 路径 Windows
#mysqlpath = C\://Program Files//MySQL//MySQL Server 5.5//bin//
# 备份文件存放位置 Windows
#sqlFilePath =C\://MySQl//

执行功能的代码类如下:

Java代码 收藏代码
package com.nms.common.db;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 用于数据库备份操作
*/
public class DbBackUpMethod {
private static Log logger = LogFactory.getLog(DbBackUpMethod.class);
private static Properties pros = getPprVue("db.properties");
public static Map<String, String> backUpTableList = new ConcurrentHashMap<String, String>();
private static DbBackUpMethod backObj = new DbBackUpMethod();
public static DbBackUpMethod getDbBackUpMethod(){
return backObj;
}
public void backup(String tableName) {
if(null != backUpTableList.get(tableName)) return ;
backUpTableList.put(tableName, tableName); // 标记已经用于备份
new Thread(new DbBackUpThread(tableName)).start();
}
/**
* 用于执行某表的备份
*/
class DbBackUpThread implements Runnable {
String tableName = null;
public DbBackUpThread(String tableName){
this.tableName = tableName;
}
@Override
public void run() {
try {
String username = pros.getProperty("username");
String password = pros.getProperty("password");
String mysqlpaths = pros.getProperty("mysqlpath");
String address = pros.getProperty("dbAddress");
String databaseName = pros.getProperty("databaseName");
String sqlpath = pros.getProperty("sqlFilePath");
File backupath = new File(sqlpath);
if (!backupath.exists()) {
backupath.mkdir();
}
StringBuffer sb = new StringBuffer();
sb.append(mysqlpaths);
sb.append("mysqldump ");
sb.append("--opt ");
sb.append("-h ");
sb.append(address);
sb.append(" ");
sb.append("--user=");
sb.append(username);
sb.append(" ");
sb.append("--password=");
sb.append(password);
sb.append(" ");
sb.append("--lock-all-tables=true ");
sb.append("--result-file=");
sb.append(sqlpath);
sb.append(tableName+".sql");
sb.append(" ");
sb.append("--default-character-set=utf8 ");
sb.append(databaseName);
sb.append(" ");
sb.append(tableName);
Runtime cmd = Runtime.getRuntime();
Process p = cmd.exec(sb.toString());
p.waitFor(); // 该语句用于标记,如果备份没有完成,则该线程持续等待
} catch (Exception e) {
logger.error("备份操作出现问题", e);
}finally{
backUpTableList.remove(tableName); // 最终都将解除
}
}
}
public static Properties getPprVue(String properName) {
InputStream inputStream = DbBackUpMethod.class.getClassLoader().getResourceAsStream(properName);
Properties p = new Properties();
try {
p.load(inputStream);
inputStream.close();
} catch (IOException e) {
logger.error("无法读取用于备份数据的配置文件", e);
}
return p;
}
}

在Action中,可以直接调用备份操作方法:

Java代码 收藏代码
DbBackUpMethod.getDbBackUpMethod().backup(tableName); // 调用备份

同时,如果页面有删除该表的操作,在操作前应该判断该表是否在进行备份

Java代码 收藏代码
if(null != DbBackUpMethod.backUpTableList.get(tableName))

然后页面JSP调用时,可以给予响应的提示,我的判断是只能删除一张表:

function deleteTableByTableName(){
	var pk = table.getSelectedKeys();
	if(""==pk){
		alert("请选择一条记录!");
		return false;
	}
	if(pk.length > 1){
		alert("请选择一条记录!");
		return false;
	}
	var rows = table.get(pk);
	var tableName=rows.tableName;
	if(confirm("你确认要删除该表吗?")) {
		if(confirm("删除该表前,你需要备份操作吗?\n\n选择备份后,系统将后台进行相关操作!\n在此期间,您不能删除该表!\n备份操作可能将持续数小时时间!请知晓!")) {
			document.form1.action="backUpTable.action?tableName=" + tableName;
			document.form1.submit();
		}else{
			if(confirm("你确认提交吗?该表将删除!")) {
				document.form1.action="del.action?tableName=" + tableName;
				document.form1.submit();
			}
		}
	}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java数据类型与MySql数据类型对照表

    本文讲述了Java数据类型与MySql数据类型对照表.分享给大家供大家参考,具体如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNE

  • 利用java+mysql递归实现拼接树形JSON列表的方法示例

    前言 本文给大家介绍的是关于利用java+mysql递归实现拼接树形JSON列表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据 例如: [ { "name": "商品目录", "pid": "-1", "id": "1", "children"

  • Java实现获得MySQL数据库中所有表的记录总数可行方法

    在MySQL中,可以通过SELECT COUNT(*) FROM table_name查询某个表中有多少条记录.如果想知道某个数据库中所有别的记录总数应该怎么做呢?本文给出两种可行的Java程序,解决该问题. 1. 首先确定数据库中有多少个表,然后对每个表执行SELECT COUNT(*) FROM table_name 复制代码 代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr

  • 让Java后台MySQL数据库能够支持emoji表情的方法

    前言 公司最近在开发中遇到一个问题,在弄帖子的发布与回复问题,然后再iOS端和Android端添加表情的时候都会出错 Caused by: java.sql.SQLException: Incorrect string value: '\xF6\x9D\x98\x84' for column 'comment' at row 1 提示表情有问题,然后赶紧查资料. 首先数据库编码为UTF-8,字段content设置为text(CHARSET=utf8 COLLATE=utf8_unicode_ci

  • Java连接mysql数据库的详细教程(推荐)

    该教程是面向那些不知道如何通过java连接mysql数据库的新手,所以该教程用的方法不是最优的方法,但求是最好理解的方法. 需要的工具: eclipse.mysql.mysql的驱动 mysql驱动链接:mysql-connector-java-5.1.7.zip 如果该链接下载不了的话,可以私信我 1.在eclipse中创建一个工程:jdbc 2.在工程下创建lib文件夹 鼠标右键点击jdbc工程 --> New -->Folder. 文件夹命名为lib 3.导入mysql驱动 解压上述连接

  • 关于Java中的mysql时区问题详解

    前言 话说工作十多年,mysql 还真没用几年.起初是外企银行,无法直接接触到 DB:后来一直从事架构方面,也多是解决问题为主. 这次搭建海外机房,围绕时区大家做了一番讨论.不说最终的结果是什么,期间有同事认为 DB 返回的是 UTC 时间. 这里简单做个验证,顺便看下时区的问题到底是如何处理. 环境 openjdk version "1.8.0_242" mysql-connector-java "8.0.20" mysql "5.7" 时区

  • mysql-connector-java.jar包的下载过程详解

    mysql-connector-java.jar包的下载教程: 1.首先我们打开mysql的官网:https://www.mysql.com/ 2.点击选择DOWNLOADS选项: 3.点击选择Community选项: 4.在左侧选项卡中选择MySQL Connectors选项: 5.单击选择Connector/J选项: 6.在此处下拉选择Platform Independent 选项: 7.选择下载第二个即可: 8.最后选择No thanks,just start my download: 到

  • 通过java备份恢复mysql数据库的实现代码

    复制代码 代码如下: 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

  • MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A...’的解决方法

    前言 本文主要介绍了关于MySQL存储表情报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\xA9\x0D\x0A...'的相关解决方法,分享出供大家参考学习,下面话不多说了,来一起看看详细的介绍: 本项目是基于Spring MVC + MySQL + Druid DataSource.在往数据库插入表情Emoji字符时报错: java.sql.SQLException: Incorrect string value:

  • MySQL基于java实现备份表操作

    核心是mysqldump和Runtime 操作其实并不是很困难,创建一个进行备份操作的类,接收到备份调用后,标记该表正在备份,然后创建一个子线程进行备份操作.所需的配置信息是从配置文件读取的,也要注意在Windows和linux下路径问题. 配置文件如下: Java代码 收藏代码 # 数据库地址 dbAddress=localhost # 要备份的数据库名称 databaseName=nms # 数据库用户名 username = root # 数据库密码 password = root # m

  • MySQL数据库入门之备份数据库操作详解

    本文实例讲述了MySQL数据库入门之备份数据库操作.分享给大家供大家参考,具体如下: 接上一次:MySQL数据库入门多实例配置 一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点................. 首先来看看数据库中的数据 mysql> select * from test; +-----+------+ | id | name | +-----+------+ | 1 | 1 | |

  • 使用mysqldump对MySQL的数据进行备份的操作教程

    MySQL 自身的 mysqldump 工具支持单线程工作, 依次一个个导出多个表,没有一个并行的机 ,这就使得它无法迅速的备份数据. mydumper 作为一个实用工具,能够良好支持多线程工作, 可以并行的多线程的从表中读入数据并同时写到不同的文件里 ,这使得它在处理速度方面快于传统的 mysqldump .其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起 DML 阻塞.但一般现在的 MySQL 都有主从,备份也大部分在从上进行,所以锁的问题可以不

  • MySQL基于DOS命令行登录操作实例(图文说明) 原创

    本文实例讲述了MySQL基于DOS命令行登录操作方法.分享给大家供大家参考,具体如下: 常用的MySQL命令行登录语句如下: 复制代码 代码如下: mysql -h localhost -u root -p123456 其中: -h 表示服务器地址,可省略,默认表示本机服务器 -u 表示登录用户,必选,可与用户名连在一起写,如:-uroot -p 表示数据库密码,必选,但这里可不输入密码(注意:命令行中-p与密码之间不能有空格) 因此,上述语句可写成如下几种形式: mysql -u root -

  • java代码实现mysql分表操作(用户行为记录)

    设置项目气动执行次方法(每天检查一次表记录) public class DayInterval implements ServletContextListener{ private static SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void showDayTime() { Timer dTimer = new Timer(); dTime

  • MySQL删除表操作实现(delete、truncate、drop的区别)

    本文主要讲mysql中三种删除表的操作,delete语句.truncate语句以及drop语句的区别: 简介 delete 1.删除整张表的数据: delete from table_name; 2.删除部分数据,添加where子句: delete from table_name where...; 3.说明 1).属于DML语言,每次删除一行,都在事务日志中为所删除的每行记录一项.产生rollback,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发,如果删除大数据量的表速

  • django连接mysql数据库及建表操作实例详解

    本文实例讲述了django连接mysql数据库及建表操作.分享给大家供大家参考,具体如下: django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找到settIngs里面的database设置如下 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's22',

  • 如何基于java向mysql数据库中存取图片

    这篇文章主要介绍了如何基于java向mysql数据库中存取图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 学mysql的时候都是做个表格,放的也都是文字内容,虽然我知道长篇的文章和图片或者视频的都是用过文件夹的方式存储的,再讲文件路径存进数据库中.但还是想试试直接往mysql数据库中存取图片.这里我用的是java语言和jdbc实现的 mysql数据库中有一个类型是Blob类型,这是一个二进制类型,通常我们会将图片或音像文件转成二进制再存入数

  • MySQL基于SSL协议进行主从复制的详细操作教程

    当mysql跨越互联网进行复制时别人可以窃取到mysql的复制信息,这些信息是明文的,因此存在不安全性,这里通过ssl对复制的信息进行加密.当在客户没有固定ip而要访问服务器时,mysql要允许任意地址的访问,服务端和客户端通过证书验证可以防止暴力破解. 开始之前让我们先来回顾一下SSL协议客户端OpenSSL的安装过程: 安装openssl mkdir /test/setup cd /test/setup tar zxvf openssl-0.9.8b.tar.gz cd openssl-0.

  • MySQL使用游标批量处理进行表操作

    一.概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇文章. 理解MySQL变量和条件:http://www.jb51.net/article/81375.htm 理解Mysql prepare预处理语句:http://www.jb51.net/article/81378.htm 理解MySQL存储过程和函数:http://www.jb51.net

随机推荐