2024年1月15日发(作者:)

Java实现Sqlserver及MySql的备份与还原

注:本人是采用Struts1做的一个简单小例子。

实现步骤:

1.数据库基类

package ;

import tion;

import Manager;

import eption;

/**

* @ClassName: DataBaseUtil

* @Description: TODO

* @author 莫希柏

* @date Jul 4, 2012 2:21:41 PM

*/

public class DataBaseUtil {

/**

* @Description: 获取数据库连接

* @author 莫希柏

* @date Jul 4, 2012 2:23:11 PM

*/

public static Connection getConnection() {

Connection conn = null;

try {

e("verDriver");

String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;

DatabaseName=datatest";

String username = "sa";

String password = "sa";

conn = nection(url, username, password);

} catch (ClassNotFoundException e) {

tackTrace();

} catch (SQLException e) {

tackTrace();

}

return conn;

}

/**

* @Description: 关闭

* @author 莫希柏

* @date Jul 4, 2012 2:22:57 PM

*/

public static void closeConn(Connection conn) {

if (conn != null) {

try {

();

} catch (SQLException e) {

tackTrace();

}

}

}

}

package ;

import edReader;

import ;

import putStream;

import tputStream;

import ption;

import tream;

import treamReader;

import Stream;

import StreamWriter;

import leStatement;

import edStatement;

import rvletRequest;

import rvletResponse;

import Form;

import Forward;

import Mapping;

import chAction;

import seUtil;

public class DataAction extends DispatchAction{

/**

* @Description: SqlServer备份

* @author 莫希柏

* @date Jul 4, 2012 2:45:16 PM

*/

public ActionForward doSqlServerBackUp(ActionMapping mapping,

ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

String mssqlBackupName=

ameter("mssqlBackupName");//自定义备份数据库名

String mssqlBackupPath=

ameter("mssqlBackupPath");//自定义备份数据库保存路径

String dbName="datatest";//被备份的数据库名称

boolean flag=false;

try {

File file = new File(mssqlBackupPath);

String path = h() + ""

+ mssqlBackupName + ".bak";//备份生成的数据路径及文件名

String bakSql = "backup database "

+dbName+" to disk=? with init";//备份数据库SQL语句

PreparedStatement bak = nection()

.prepareStatement(bakSql);

ing(1, path);//path必须是绝对路径

e(); //备份数据库

();

flag=true;

} catch (Exception e) {

flag=false;

tackTrace();

}

racterEncoding("utf-8");

try {

if(flag==true){

ter().print(

"");

}else{

ter().print(

"");

}

} catch (IOException e) {

tackTrace();

}

return null;

}

/**

* @Description: SqlServer还原

* @author 莫希柏

* @date Jul 4, 2012 4:28:05 PM

*/

public ActionForward doSqlServerRecovery(ActionMapping mapping,

ActionForm form,HttpServletRequest request, HttpServletResponse

response){

boolean flag = false;

String mssqlRecoveryPath =

ameter("mssqlRecoveryPath"); //

被还原数据库文件的路径

String dbname="datatest";//数据库名称

try{

File file = new File(mssqlRecoveryPath);

String path = h();//数据库文件名

String recoverySql = "ALTER DATABASE "

+dbname+" SET ONLINE WITH

ROLLBACK IMMEDIATE";// 断开所有连接

PreparedStatement ps

= nection()

.prepareStatement(recoverySql);

CallableStatement cs

= nection().prepareCall("{call

killrestore(?,?)}"); //调用存储过程

ing(1, dbname); // 数据库名

ing(2, path); // 已备份数据库所在路径

e(); // 还原数据库

e(); // 恢复数据库连接

flag=true;

} catch (Exception e) {

flag=false;

tackTrace();

}

racterEncoding("utf-8");

try {

if(flag==true){

ter().print(

"");

}else{

ter().print(

"");

}

} catch (IOException e) {

tackTrace();

}

return null;

}

/**

* @Description: MySql备份

* @author 莫希柏

* @date Jul 4, 2012 4:39:02 PM

*/

public ActionForward doMySqlBackUp (ActionMapping mapping,

ActionForm form, HttpServletRequest request,

HttpServletResponse response){

boolean flag=false;

try {

Runtime rt = time();

String mySqlBackupName

=ameter("mySqlBackupName");//mysql自定义数据库备份名称

String mysqlBackupPath

=ameter("mysqlBackupPath");//mysql自定义数据库备份保存路径

String fPath=mysqlBackupPath+mySqlBackupName+".sql";

String command="C:/Program Files/MySQL/MySQL Server

5.0/bin/mysqldump -uroot -p123456 datatest";

//调用 mysql的cmd:

Process child = (command);// 设置导出编码为utf8。这里必须是utf8

//把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行

InputStream in = utStream();// 控制台的输出信息作为输入流

InputStreamReader input = new InputStreamReader(in,

"utf8");// 设置输出流编码为utf8。这里必须是utf8,否则从流中读入的是乱码

String inStr;

StringBuffer sb = new StringBuffer("");

String outStr;

//组合控制台输出信息字符串

BufferedReader br = new BufferedReader(input);

while ((inStr = ne()) != null) {

(inStr + "rn");

}

outStr = ng();

//要用来做导入用的sql目标文件:

FileOutputStream fout = new FileOutputStream(fPath);

OutputStreamWriter writer = new OutputStreamWriter(fout,

"utf8");

(outStr);

//这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法则可以避免

();

//关闭输入输出流

();

();

();

();

();

n("MYSQL备份成功");

flag=true;

} catch (Exception e) {

flag=false;

tackTrace();

}

racterEncoding("utf-8");

try {

if(flag==true){

ter().print(

"");

}else{

ter().print(

"");

}

}

} catch (IOException e) {

tackTrace();

}

return null;

/**

* @Description: MySql还原

* @author 莫希柏

* @date Jul 4, 2012 4:39:10 PM

*/

public ActionForward doMySqlRecovery(ActionMapping mapping,

ActionForm form,HttpServletRequest request,

HttpServletResponse response){

boolean flag=false;

try {

String fPath =

ameter("mySqlWebtruePath");//路径

Runtime rt = time();

String command="C:/Program Files/MySQL/MySQL Server

5.0/bin/ -uroot -p123456 datatest ";

// 调用mysql的cmd

Process child = (command);

OutputStream out = putStream();//控制台的输

入信息作为输出流

String inStr;

StringBuffer sb = new StringBuffer("");

String outStr;

BufferedReader br

= new BufferedReader(new InputStreamReader(

new FileInputStream(fPath), "utf8"));

while ((inStr = ne()) != null) {

(inStr + "rn");

}

outStr = ng();

OutputStreamWriter writer = new OutputStreamWriter(out,

"utf8");

(outStr);

//这里如果用缓冲方式写入文件的话,会导致中文乱码,用flush()方法

则可以避免

();

//关闭输入输出流

();

();

();

n("MYSQL还原成功");

flag=true;

} catch (Exception e) {

flag=false;

tackTrace();

}

racterEncoding("utf-8");

try {

if(flag==true){

ter().print(

"");

}else{

ter().print(

"");

}

} catch (IOException e) {

tackTrace();

}

return null;

}

/**

* @Description: 返回主页

* @author 莫希柏

* @date Jul 5, 2012 9:14:46 AM

* @throws

*/

public ActionForward toBackIndex(ActionMapping mapping,

ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

return rward("index");

}

}

3.存储过程

create proc killrestore (@dbname varchar(20),@dbpath varchar(40))

as

begin

declare @sql nvarchar(500)

declare @spid int

set @sql='declare getspid cursor for select spid from master..sysprocesses where

dbid=db_id('''+@dbname+''')'

exec (@sql)

open getspid

fetch next from getspid into @spid

while @@fetch_status <> -1

begin

exec('kill '+@spid)

fetch next from getspid into @spid

end

close getspid

deallocate getspid

restore database @dbname from disk= @dbpath with replace

end

页面展示

<%@ page language="java" import=".*" pageEncoding="UTF-8"%>

<%

String path = textPath();

String basePath =

eme()+"://"+verName()+":"+verPort()+path+"/";

%>

数据备份与还原

content="keyword1,keyword2,keyword3">

MSSQL备份文件名称:

name="mssqlBackupName">

MSSQL备份文件路径:

size="30">

备份路径"

onclick="toSqlServerBackUp();">

MSSQL还原文件路径:

name="mssqlRecoveryPath">

MYSQL备份文件名称:

name="MysqlBackupName">

MYSQL备份文件路径:

size="30">

onclick="browseFolder('mysqlBackupPath')">

value="MYSQL备份" onclick="toMySqlBackUp();">

MYSQL还原文件路径:

name="mySqlWebtruePath">

value="MYSQL还原" onclick="toMySqlRecovery();">

注:

一、JS 实现文件夹目录选择

如果点击选择按钮提示:你没有权限,应该如下修改:

1. 单击菜单工具->Internet选项->安全->受信任站点->站点->把此网站设为可信站点

2. 在自定义级别->对没有标记为安全的ActiveX控件进行初始化和脚本运行启用