java 备份 sql server_Java实现数据库的备份和还原简易教程(SQL Server,零基础学起)...

注意:以SQL Server2008为例。

1.安装sql server2008

下载地址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=1695

64位系统选择“SQLEXPR_X64_ENU.exe",其他的根据自己使用的PC配置选择。

安装完打开Microsoft SQL Server Mangement Studio,如果提示连不上,则没有装成功,重新安装一遍就好了。

2.配置sql server

(1) 设置端口号

如下图所示:右击我的电脑->管理->Services and Apllications->SQL Server Configuration Manager->Protocols for SQlEXPRESS,将TCP/IP属性中的IPAll的TCP Dynamic Ports设为1433端口, 并将其Status改为Enabled。

bfef0934bccb424ed3fa28dfbb8425e5.png

(2) 重启SQL server service

如下图:

1f1c2d28b3a3b5fcb35fb519d3c20a13.png

3. 创建存储过程killrestore

在master数据库下的Programmability下的Stored Procedures下创建存储过程。该存储过程实现还原数据库功能。传入两个参数:待还原数据库的名称和备份数据库的全路径(包含文件名)。

步骤:

(1) 右击“Stored Procedures”->选择“NewStored Procedures...”->新建的sql文件中替换成下面的代码。

ALTER PROCEDURE [dbo].[killrestore]( @dbname varchar(20), @dbpath varchar(100))

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

(2) 保存该文件到默认目录下,文件名设为killrestore.sql。

(3) 刷新master,就能在“Stored Procedures”下找到名字为“dbo.killrestore”的文件。

注意:存储过程不能建在待还原的数据库中。

4. java代码实现部分

用到了jdbc driver,下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=11774

选择tar.gz文件。

(1) 链接和关闭数据库:链接远程服务器192.168.2.150上的sql server数据库database_test

protected static Connection getConnection() {

Connection conn = null;

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

//sql 名称:database_test;如果是sql server在本机可将地址替换成127.0.0.1:1433,其中1433是sql server默认端口

String url = "jdbc:sqlserver://192.168.2.150;databaseName=database_test";

String userName = “holly”;

String pwd = “123456”;

conn = DriverManager.getConnection(url, userName, pwd);

}catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return conn;

}

protected static void closeConnection(Connection conn) {

if (null != conn) {

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

(2) 判断远程服务器上的备份数据库文件是够存在

public static boolean isBackup() {

String diskFilePath = “C:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\Backup\\bak_test”;

String diskFilePath = "http://192.168.2.150/”+diskFilePath;

try {

//注意:不能使用File的exists来判断,因为File exists智能判断本地的文件是否存在

URL url = new URL(diskFilePath);

HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();

Long len = Long.parseUnsignedLong(urlCon.getHeaderField("Content-Length"));

if(len>0){

return true;

}else {

return false;

}

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return false;

}

(3) 备份数据库代码

备份远程服务器192.168.2.150上的sql server数据库database_test。

public static boolean backup() {

//备份全路径,该路径是远程服务器上的

String diskFilePath = “C:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\Backup\\bak_test”;

String bakSql = "BACKUP DATABASE[database_test] TO DISK=N'"

+ diskFilePath + "'"

+ " WITH NOFORMAT, NOINIT, NAME=N'database_test-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS=10";

PreparedStatement ps = null;

try {

ps = getConnection().prepareStatement(bakSql);

ps.execute();

return true;

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

try {

ps.close();

} catch (SQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

return false;

}

(4) 还原数据代码

还原数据库需要用上上面写的存储过程killrestore。

public static boolean restore() {

String restoreSql = "ALTER DATABASE database_test SET ONLINE WITH ROLLBACK IMMEDIATE";

PreparedStatement ps = null;

Connection conn = getConnection();

try {

ps = conn.prepareStatement("USE master");//注意使用master下的存储过程。

ps.execute();

ps = conn.prepareStatement(restoreSql);

CallableStatement cs = conn.prepareCall("{call killrestore(?,?)}");

cs.setString(1, “database_test”);

//此处路径是上面备份数据库文件的路径

cs.setString(2, "C:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\Backup\\bak_test");

cs.execute();

ps.execute();

return true;

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

closeConnection(conn);

return false;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值