package com.keertech.util.backup;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import com.keertech.util.publics.AppendMessage;
import com.keertech.util.publics.DbConfig;
import com.keertech.util.publics.DbConnection;
import com.keertech.util.publics.PublicMethod;
import com.keertech.util.publics.TableColumn;
/**
* MySql的备份和还原
* @author 吴浩
* @version 1.0
* 2011-6-29
*/
@SuppressWarnings("serial")
public class MySqlBackup implements IBackup{
private DbConfig dbConfig;
public MySqlBackup(){ }
public MySqlBackup(DbConfig dbConfig){
this.dbConfig = dbConfig;
}
/**
* 创建mysql备份
*/
public void createSqlScript(String filePath) throws Exception{
File file;
File newFile;
PrintWriter pwrite;
try {
file =new File(filePath);
SimpleDateFormat smf = new SimpleDateFormat("yyyy:MM:dd");
newFile = new File(file.getPath() + "/" + dbConfig.getDbName() + "_" + smf.format(new Date()).replaceAll(" |:", "") + ".sql");
pwrite = new PrintWriter(new OutputStreamWriter(new FileOutputStream(newFile,false), "UTF8"));
//写入头部信息
pwrite.println(AppendMessage.headerMessage(dbConfig));
pwrite.println("SET FOREIGN_KEY_CHECKS=0;" + "\n");
List<String> tablelists = PublicMethod.getAllTableName(dbConfig, "show tables");
for (String table : tablelists) {
StringBuilder strBuilder =new StringBuilder();
strBuilder.append("show create table ")
.append(table);
List<String> list = PublicMethod.getAllColumns(dbConfig,strBuilder.toString());
for (String line : list) {
//在建表前加说明
pwrite.println(AppendMessage.tableHeaderMessage(table));
//生成建表语句
pwrite.println("DROP TABLE IF EXISTS " + " `" + table + "`;");
pwrite.println(line + ";" + "\n");
}
}
pwrite.println(AppendMessage.insertHeaderMessage());
for (Object table : tablelists) {
//生成insert语句
List<Vector<Object>> insertList = getAllDatas(dbConfig,table.toString());
for (int i = 0; i < insertList.size(); i++) {
Vector<Object> vector = insertList.get(i);
String tempStr = vector.toString();
tempStr =tempStr.substring(1, tempStr.length()-1);
tempStr ="INSERT INTO " + "`"+ table + "`" + " VALUES(" + tempStr + ");";
pwrite.println(tempStr);
}
}
pwrite.flush();
pwrite.close();
} catch (Exception e) {
e.printStackTrace();
throw new Exception("出现错误,创建备份文件失败!");
}
}
/**
* 还原mysql备份
*/
public void executSqlScript(String filePath) throws Exception {
Connection conn = null;
Statement stmt = null;
List<String> sqlStrList = null;
try {
sqlStrList = PublicMethod.loadSqlScript(filePath);
conn = PublicMethod.getConnection(dbConfig);
stmt = conn.createStatement();
// 禁止自动提交
conn.setAutoCommit(false);
for (String sqlStr : sqlStrList) {
int index = sqlStr.indexOf("INSERT");
if (-1 == index) {
stmt.addBatch(sqlStr);
}
}
stmt.executeBatch();
// INSERT语句跟建表语句分开执行,防止未建表先INSERT
for (String sqlStr : sqlStrList) {
int index = sqlStr.indexOf("INSERT");
if (-1 != index) {
stmt.executeUpdate(sqlStr);
}
}
stmt.executeBatch();
conn.commit();
} catch (Exception ex) {
conn.rollback();
throw ex;
}finally{
DbConnection.closeAll(conn, stmt, null);
}
}
/**
* 拼接连接字符串
* @param dbConfig
* @return String
* @throws Exception
*/
public static String getDbUrl(DbConfig dbConfig) throws Exception {
StringBuilder urlStr = null;
try {
urlStr = new StringBuilder();
urlStr.append("jdbc:mysql://")
.append(dbConfig.getIpNo())
.append(":")
.append(dbConfig.getPortNo())
.append("/")
.append(dbConfig.getDbName());
} catch (Exception e) {
throw e;
}
return urlStr.toString();
}
/**
* 查询生成Insert语句所需的数据
* @param tableName
* @return List<Vector<Object>>
* @throws Exception
*/
public List<Vector<Object>> getAllDatas(DbConfig config,String tableName) throws Exception {
List<Vector<Object>> list ;
Vector<Object> vector;
StringBuilder typeStr = null;
List<TableColumn> columnList;
StringBuilder sqlStr;
ResultSet rs= null;
StringBuilder columnsStr ;
try {
//生成查询语句
typeStr =new StringBuilder();
sqlStr =new StringBuilder();
columnsStr =new StringBuilder().append("describe ").append(tableName);
columnList = PublicMethod.getDescribe(config,columnsStr.toString());
sqlStr.append("SELECT ");
for (TableColumn bColumn : columnList) {
//处理BLOB类型的数据
String columnsType = bColumn.getColumnsType();
if("longblob".equals(columnsType)||"blob".equals(columnsType)||"tinyblob".equals(columnsType)||"mediumblob".equals(columnsType)){
typeStr.append("hex(" + "`" + bColumn.getColumnsFiled() + "`" + ") as " + "`" + bColumn.getColumnsFiled() + "`" + " ,");
}else{
typeStr.append("`" + bColumn.getColumnsFiled() + "`" + " ,");
}
}
sqlStr.append(typeStr.substring(0,typeStr.length()-1));
sqlStr.append(" FROM ").append("`"+tableName + "`;");
//查询insert语句所需的数据
list = new ArrayList<Vector<Object>>();
rs = PublicMethod.queryResult(config, sqlStr.toString());
while (rs.next()) {
vector = new Vector<Object>();
for (TableColumn dbColumn : columnList) {
String columnsType = dbColumn.getColumnsType();
String columnsFile = dbColumn.getColumnsFiled();
if(null == rs.getString(columnsFile)){
vector.add( rs.getString(columnsFile));
//处理BIT类型的数据
}else if("bit".equals(columnsType.substring(0,3))){
vector.add(Integer.valueOf(rs.getString(columnsFile)).intValue());
}else if("bit".equals(columnsType.substring(0,3)) && 0 == Integer.valueOf(rs.getString(columnsFile)).intValue()){
vector.add("\'"+"\'");
}else if("longblob".equals(columnsType)||"blob".equals(columnsType)||"tinyblob".equals(columnsType)||"mediumblob".equals(columnsType)){
vector.add("0x"+rs.getString(columnsFile));
//处理
}else if("text".equals(columnsType)||"longtext".equals(columnsType)||"tinytext".equals(columnsType)||"mediumtext".equals(columnsType)){
String tempStr = rs.getString(columnsFile);
tempStr = tempStr.replace("\'", "\\'");
tempStr = tempStr.replace("\"", "\\\"");
vector.add("\'" + tempStr +"\'");
}else{
vector.add("\'" + rs.getString(columnsFile) + "\'");
}
}
list.add(vector);
}
} catch (Exception e) {
throw e;
} finally {
DbConnection.closeAll(null, null, rs);
}
return list;
}
}
mrhao1991
- 粉丝: 1
- 资源: 2
最新资源
- 博途S7-1200主站与S7-200从站实现RS485通讯程序 S7-200可以当作一个仪表
- C#、C++分别开发的OPC DA CLIENT软件. 1、枚举服务器名称; 2、连接服务器以后枚举出TAG; 3、根据TAG名称自动读取服务器数据; 4、图片内有OPC SERVER和CLIENT实
- python-workspace.zip.005
- 龙门上下料样本程序,四轴 用台达AS228T和台达触摸屏编写 注意软件是用台达新款软件ISPSOFT ,借鉴价值高,程序有注释
- 一款window下的串口监视抓包工具
- 欧姆龙CP1H与3台力士乐VFC-x610变频器通讯程序 功能:原创程序,可直接用于现场程序 欧姆龙CP1H的CIF11通讯板,实现对3台力士乐VFC-x610变频器 设定频率,控制正反转,读取实际
- dp111113333
- CV-密集人群图像数据集(5800张图片).rar
- 福特汽车主观评价规范,性能开发参考,英文原版直译,评价条目、规则描述非常细致 包含平顺舒适性,转向,操稳,NVH,制动,加速感,驾驶性等等性能,并详细描述了评价的准备工作 评价条目细分至第四级,共
- 三菱FX3S两轴标准程序,XZ两轴,包含轴点动,回零,相对与绝对定位,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了,注释完整
- MATLAB代码:考虑P2G与碳捕集机组的多能微网低碳经济调度 关键词:碳交易 阶梯碳交易 碳捕集 多能微网 低碳调度 仿真平台:MATLAB+yalmip+cplex 主要内容:代码主要做的是一个
- 本程序采用matlab编写,主要是实现电流注入型牛拉法 除此之外,本人还编写了很多种关于潮流计算的程序,主要有牛拉法,前推回代法,以还有相和三相潮流计算程序
- 智能门锁架构图,供大家参考
- 三菱FX3U六轴标准程序,程序包含本体3轴控制,扩展3个1PG定位模块,一共六轴 程序有轴点动控制,回零控制,相对定位,绝对定位 另有气缸数个,一个大是DD马达控制的转盘,整个是转盘多工位流水作业
- 批量登录到远程Linux服务器检查服务器时间差的shell
- MATLAB电动车七自由度整车模型 MATLAB Simulink电动车转弯制动abs模型asr转弯制动防抱死abs模型+模糊控制算法+七自由度整车模型+纵向运动+侧向运动+横摆运动+四轮魔术公式+四
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页