java对mysql数据库进行单表筛选备份、还原操作
最近在做的一个项目需要对mysql数据库中的单个表格进行备份
其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份)
思路:java调用系统命令完成备份操作
假设现在有数据库testdb
其中有数据表test_table
备份操作所做的是,把指定的数据库表中的一部分记录生成一个sql备份文件,以供还原操作,文件名使用日期生成。
备份操作
public void backUpTable(String tableName, Integer number) throws Exception {
StringBuilder command = new StringBuilder();
Runtime rt = Runtime.getRuntime();
Process pro = null;
command.append("mysqldump -u" + username + " -p" + password + " testdb ");
//username为数据库用户名 password为密码
String time = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
String fileName ="E://" + tableName + "/" + time + ".sql";//放在E盘下
//备份表中最新number行的数据
// mysqldump -uusername -ppassword testdb test_table -w \" 1=1 ORDER BY id DESC LIMIT 0,300\" --result-file=E://test.sql
command.append(tableName);
command.append(" ");
command.append("-w \" 1=1 ORDER BY id DESC LIMIT 0,");
command.append(number);
command.append("\"");
command.append(" ");
command.append("--result-file=" + fileName);
pro = rt.exec(command.toString());
//命令执行出错则打印相关错误信息
BufferedReader br = new BufferedReader(new InputStreamReader( pro.getErrorStream()));
String errorLine = null;
while ((errorLine = br.readLine()) != null) {
System.out.println(errorLine);
}
br.close();
}
其中,使用mysqldump进行备份操作
由于需要进行筛选,使用-w添加了筛选条件,--result-file= 指向生成文件的存放路径
备份完成了,接下来就是还原操作
假如我们需要将E://test.sql还原到数据库中,
需要执行的命令为mysql -uusername -ppassword testdb < E://test.sql
如果使用此命令,则涉及到了重定向符>,
而java无法识别重定向符和管道操作符,故不能向上面备份操作一样进行还原,需要采用其他方式,如下
在类中定义了字符串数组String[] command = new String[3];
1、需要先判断当前系统环境
public void initOSCommand(){
String osName = System.getProperty("os.name");
logger.info("系统环境为:" + osName);
osName = osName.toLowerCase();
if(osName.indexOf("win")>-1){
command[0] = "cmd";
command[1] = "/c";
}else if(osName.indexOf("linux")>-1){
command[0] = "/bin/bash";
// command[0] = "/bin/sh"; sh和bash的区别不大,bash是sh的增强版本
command[1] = "-c";
}else{
logger.error("当前系统环境不支持数据库还原操作");
}
}
2、执行还原操作
public void restoreTable()throws Exception {
//mysql -uusername -ppassword testdb < E://test.sql
StringBuilder commandStr = new StringBuilder();
Runtime rt = Runtime.getRuntime();
Process pro = null;
String fileName = "E://test.sql";
commandStr.append("mysql -u" + username + " -p" + password + " testdb < ");
commandStr.append(fileName);
command[2] = commandStr.toString();
// System.out.println(command[0] + command[1] + command[2]);
pro = rt.exec(command);
// 命令执行出错则打印相关错误信息
BufferedReader br = new BufferedReader(new InputStreamReader( pro.getErrorStream()));
String errorLine = null;
while ((errorLine = br.readLine()) != null) {
System.out.println(errorLine);
}
br.close();
}
以上为解决方法中的一种,另一种等测试完可行之后再贴上来。
以上代码在window10下能正常运行,尚未在linux上测试,后面测试完了再更新此随笔。
需要特别注意的是,mysql5.6版本以后,执行mysqldump -uusername -ppassword ····
会无法执行并提示安全警告
解决方法:对mysqldump命令进行配置(详情百度2333)或降低mysql的版本到5.6以下
个人能力渣渣,随笔有不对或者讲述的不到位的地方,求读者指点批判,谢谢阅读
java对mysql数据库进行单表筛选备份、还原操作的更多相关文章
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- MySQL数据库语法-单表查询练习
MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...
- mysql数据库之单表查询多表查询
单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex e ...
- mysql数据库之单表查询
单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...
- 基于MySql数据库的单表与多表联合查询
这里以学生 班级 身份证 以及课程为例 1,启动MySql数据库 开启服务 2.1.0新建一张班级表 备注:CHARSET = UTF8 (指定编码格式为utf8 防止中文乱码) /*班级表*/ C ...
- JAVA 操作远程mysql数据库实现单表增删改查操作
package MysqlTest; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.C ...
- MySql数据库之单表数据查询
查询数据 1.查询所有数据: select * from 表名; 2.根据指定条件查询数据:
- Java基础-MySQL数据库扫盲篇
Java基础-MySQL数据库扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据库概述 1>.什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按 ...
- 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...
随机推荐
- java中的string字符串中的trim函数的作用
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...
- yii分页
关于分页有一个重要的类CPagination. CPagination represents information relevant to pagination. http://www.yiifra ...
- bzoj3192
把堆顶和堆顶接起来,然后用树状数组模拟即可不得不说一开始我竟然把100000*100000当成不超出longint 而忘开int64,无药可救…… ..] of longint; now,n1,n2, ...
- FZYZOJ-1569 喝水
P1569 -- 喝水 时间限制:2000MS 内存限制:131072KB 状态:Accepted 标签: 无 无 无 Description GH的N个妹子要喝水, ...
- 安装 macbook 双系统( OS X 和 Ubuntu )
打算 macbook 上面多安装一个 ubuntu 系统来用下.流程大致下面几步: 1. 备份重要资料 2. 划分硬盘区域用于安装 ubuntu 3. 下载 ubuntu ISO 文件,并刻录到 U ...
- 吉哥系列故事--完美队形 - HDU 4513 (Manacher)
分析:刚开始的想法是匹配出来每个点的最大回文串,然后用每个点的最大不下降序找一个最小值,不过不明白为什么不对....很无奈,再匹配的时候加一些判断就可以过,或许还有什么没想到的地方吧..... 代 ...
- Cocos2d-iphone 为sprite添加双击的事件响应
这篇文章介绍两种方式处理cocos2d中的双击事件响应. 在iOS中使用UITapGestureRecognizer ,很容易就可以添加双击事件处理,但是在cocos2d中无法直接向sprite添加U ...
- 看小白如何解决ajax跨域问题
由于此前很少写前端的代码(哈哈,不合格的程序员啊),最近项目中用到json作为系统间交互的手段,自然就伴随着众多ajax请求,随之而来的就是要解决ajax的跨域问题.本篇将讲述一个小白从遇到跨域不知道 ...
- 性能比较工具runstats
runstats能对做同一件事的两个不同方法进行比较,得出谁好一点.我们只需要提供两个不同方法,余下的事情都由runstats负责.runstats只是测量3个要素: 1. 耗用的时间. 2. 系统统 ...
- ASP.NET中生成rss.xml
本文转载:http://www.afuhao.com/article_articleId-177.shtml RSS格式的xml文件的格式,可以考虑用nvelocity模板引擎. 北风网rss视频:h ...