用asp.net还原与恢复sqlserver数据库(转)

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

None.gif 利用SQLDMO实现的,只要添加SQLDMO引用就好了,然后利用下边的类的方法就可以实现了。
None.gif我把原作者的类扩充了一下,可以自动识别web.config里 的数据库连接字符串,可以通过变量设置还原恢复的信息。
None.gif
None.gif需要注意的时还原,还原的时候问题最大了,有别的用户使用数据库的时候无法还原,解决办法就是在MASTER数据库中添加一个存储过程:
None.gif
None.gif
None.gifcreate proc killspid (@dbname varchar(
20 ))
None.gif
as
None.gifbegin
None.gifdeclare @sql nvarchar(
500 )
None.gifdeclare @spid 
int
None.gif
set  @sql = ' declare getspid cursor for 
None.gif
select spid from sysprocesses where dbid = db_id( ''' +@dbname+ ''' ) '
None.gif
exec (@sql)
None.gifopen getspid
None.giffetch next from getspid into @spid
None.gif
while  @@fetch_status <>- 1
None.gifbegin
None.gifexec(
' kill  ' + @spid)
None.giffetch next from getspid into @spid
None.gifend
None.gifclose getspid
None.gifdeallocate getspid
None.gifend
None.gifGO
None.gif
None.gif
None.gif在还原之前先执行这个存储过程,需要传递dbname,就是你的数据库的名字。下边是类的原代码:(web.config里的数据库连接字符串是constr)
None.gif 
None.gif
None.gif
using  System;
None.gif
None.gif
using  System.Configuration;
None.gif
None.gif
using  System.Data.SqlClient;
None.gif
None.gif
using  System.Data;
None.gif
None.gif
namespace  web.base_class
None.gif
ExpandedBlockStart.gif
{
InBlock.gif
ExpandedSubBlockStart.gif     
/// <summary>
InBlock.gif
InBlock.gif     
/// DbOper类,主要应用SQLDMO实现对Microsoft SQL Server数据库的备份和恢复
InBlock.gif
ExpandedSubBlockEnd.gif     
/// </summary>

InBlock.gif
InBlock.gif     
public class DbOper
InBlock.gif
ExpandedSubBlockStart.gif     
{
InBlock.gif
InBlock.gif          
private string server;
InBlock.gif
InBlock.gif          
private string uid;
InBlock.gif
InBlock.gif          
private string pwd;
InBlock.gif
InBlock.gif          
private string database;
InBlock.gif
InBlock.gif          
private string conn;
InBlock.gif
ExpandedSubBlockStart.gif         
/// <summary>
InBlock.gif
InBlock.gif         
/// DbOper类的构造函数
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public DbOper()
InBlock.gif
ExpandedSubBlockStart.gif         
{
InBlock.gif
InBlock.gif              conn
=System.Configuration.ConfigurationSettings.AppSettings["constr"].ToString();
InBlock.gif
InBlock.gif              server
=cut(conn,"server=",";");
InBlock.gif
InBlock.gif              uid
=cut(conn,"uid=",";");
InBlock.gif
InBlock.gif              pwd
=cut(conn,"pwd=",";");
InBlock.gif
InBlock.gif              database
=cut(conn,"database=",";");
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif         
public string cut(string str,string bg,string ed)
InBlock.gif
ExpandedSubBlockStart.gif         
{
InBlock.gif
InBlock.gif              
string sub;
InBlock.gif
InBlock.gif              sub
=str.Substring(str.IndexOf(bg)+bg.Length);
InBlock.gif
InBlock.gif              sub
=sub.Substring(0,sub.IndexOf(";"));
InBlock.gif
InBlock.gif              
return sub;
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gif         
/// <summary>
InBlock.gif
InBlock.gif         
/// 数据库备份
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public  bool DbBackup(string url)
InBlock.gif
ExpandedSubBlockStart.gif         
{
InBlock.gif
InBlock.gif              SQLDMO.Backup oBackup 
= new SQLDMO.BackupClass();
InBlock.gif
InBlock.gif              SQLDMO.SQLServer oSQLServer 
= new SQLDMO.SQLServerClass();
InBlock.gif
InBlock.gif              
try
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   oSQLServer.LoginSecure 
= false;
InBlock.gif
InBlock.gif                   oSQLServer.Connect(server,uid, pwd);
InBlock.gif
InBlock.gif                   oBackup.Action 
= SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
InBlock.gif
InBlock.gif                   oBackup.Database 
= database;
InBlock.gif
InBlock.gif                   oBackup.Files 
= url;//"d:\Northwind.bak";
InBlock.gif

InBlock.gif                   oBackup.BackupSetName 
= database;
InBlock.gif
InBlock.gif                   oBackup.BackupSetDescription 
= "数据库备份";
InBlock.gif
InBlock.gif                   oBackup.Initialize 
= true;
InBlock.gif
InBlock.gif                   oBackup.SQLBackup(oSQLServer);
InBlock.gif
InBlock.gif                   
return true;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
catch
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   
return false;
InBlock.gif
InBlock.gif                   
throw;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
finally
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   oSQLServer.DisConnect();
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockStart.gif         
/// <summary>
InBlock.gif
InBlock.gif         
/// 数据库恢复
InBlock.gif
ExpandedSubBlockEnd.gif         
/// </summary>

InBlock.gif
InBlock.gif         
public string DbRestore(string url)
InBlock.gif
ExpandedSubBlockStart.gif         
{
InBlock.gif
InBlock.gif              
if(exepro()!=true)//执行存储过程
InBlock.gif

ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   
return "操作失败";
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
else
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   SQLDMO.Restore oRestore 
= new SQLDMO.RestoreClass();
InBlock.gif
InBlock.gif                   SQLDMO.SQLServer oSQLServer 
= new SQLDMO.SQLServerClass();
InBlock.gif
InBlock.gif                   
try
InBlock.gif
ExpandedSubBlockStart.gif                   
{
InBlock.gif
InBlock.gif                        oSQLServer.LoginSecure 
= false;
InBlock.gif
InBlock.gif                        oSQLServer.Connect(server, uid, pwd);
InBlock.gif
InBlock.gif                        oRestore.Action 
= SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
InBlock.gif
InBlock.gif                        oRestore.Database 
= database;
InBlock.gif
InBlock.gif                        oRestore.Files 
= url;//@"d:\Northwind.bak";
InBlock.gif

InBlock.gif                        oRestore.FileNumber 
= 1;
InBlock.gif
InBlock.gif                        oRestore.ReplaceDatabase 
= true;
InBlock.gif
InBlock.gif                        oRestore.SQLRestore(oSQLServer);
InBlock.gif
InBlock.gif                       
return "ok";
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
InBlock.gif                   
catch(Exception e)
InBlock.gif
ExpandedSubBlockStart.gif                   
{
InBlock.gif
InBlock.gif                       
return "恢复数据库失败";
InBlock.gif
InBlock.gif                       
throw;
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
InBlock.gif                   
finally
InBlock.gif
ExpandedSubBlockStart.gif                   
{
InBlock.gif
InBlock.gif                        oSQLServer.DisConnect();
InBlock.gif
ExpandedSubBlockEnd.gif                   }

InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
InBlock.gif          
private bool exepro()
InBlock.gif
ExpandedSubBlockStart.gif         
{
InBlock.gif
InBlock.gif              SqlConnection conn1 
= new SqlConnection("server="+server+";uid="+uid+";pwd="+pwd+";database=master");
InBlock.gif
InBlock.gif              SqlCommand cmd 
= new SqlCommand("killspid",conn1);
InBlock.gif
InBlock.gif              cmd.CommandType 
= CommandType.StoredProcedure;
InBlock.gif
InBlock.gif              cmd.Parameters.Add(
"@dbname","port");
InBlock.gif
InBlock.gif              
try
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   conn1.Open();
InBlock.gif
InBlock.gif                   cmd.ExecuteNonQuery();
InBlock.gif
InBlock.gif                   
return true;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
catch(Exception ex)
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   
return false;
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif              
finally
InBlock.gif
ExpandedSubBlockStart.gif              
{
InBlock.gif
InBlock.gif                   conn1.Close();
InBlock.gif
ExpandedSubBlockEnd.gif              }

InBlock.gif
InBlock.gif 
InBlock.gif
ExpandedSubBlockEnd.gif         }

InBlock.gif
ExpandedSubBlockEnd.gif     }

InBlock.gif
ExpandedBlockEnd.gif}

None.gif




本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2006/02/28/339458.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
14天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
2月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
37 4
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
96 0
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
77 0
|
2月前
|
SQL 人工智能 算法
【数据库SQL server】传统运算符与专门运算符
【数据库SQL server】传统运算符与专门运算符
69 0
|
1月前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
18 1
|
1月前
|
SQL 安全 数据库
SQLServer 实现数据库表复制到另一个数据库_kaic
SQLServer 实现数据库表复制到另一个数据库_kaic
|
14天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
15天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例