SQL server 2000数据还原小小经验谈

原创 2006年06月13日 13:34:00

RESTORE DATABASE  DatabaseName 
                   FROM Filename
                   WITH RESTARTE
是最基本的数据库还原命令,可是执行的时候多半会出现错误提示:“为数据库正在使用,所以未能获得对数据库的排它访问权。”,数据库正在使用的解决办法很简单,就是进行还原操作时,连接的数据库为“Master”就好。但是接下来的问题是“排它访问权”。SQL Server 对现有数据库进行还原时需要切断现有的连接,即杀掉所有连接该数据库的进程。
         首先,获取所用连接该数据库的进程(strDBName 为要还原的数据库名称):
 SELECT spid FROM master..sysprocesses WHERE dbid=db_id('" + strDBName + "')
得到的便是SPID数据集,取得每个spid, 在利用 Kill   spid  命令就可以杀掉所有连接进程 ,然后执行还原语句。
在实际的应用中,可以结合开发语言特点进行编程实现。下面是我用C#做的


//TODO: 以程序的方式实现关闭当前连接数据库的连接进程
  /// <summary>
  
/// 关闭当前连接数据库的连接进程
  
/// </summary>
  
/// <param name="DBName">要关闭进程的数据库名称</param>

  private void KillSPID(string DBName)
  
{
   
string strDBName = DBName ;
   
string strSQL = String.Empty ,strSQLKill = String.Empty;
    
//因为DataReader独占连接,本程序需要两个Connection,并且连接的数据库是master,所以要初始化新的连接字符串
   string tmpConnectionString = "server=(local);uid=sa;pwd=;database=master" ;
   
   
try
   
{
    SqlConnection TmpConn 
= new SqlConnection();
    SqlConnection conn 
= new SqlConnection() ;
    TmpConn.ConnectionString 
= tmpConnectionString;
    conn.ConnectionString 
= tmpConnectionString;
    TmpConn.Open();
    conn.Open();
   
    
//读取连接当前数据库的进程
    strSQL = "select spid from master..sysprocesses where dbid=db_id('" + strDBName + "')";
    SqlCommand mycmd 
= new SqlCommand( strSQL, TmpConn);
    SqlDataReader mydr 
= mycmd.ExecuteReader() ;
   
    
//开取杀进程的数据连接
    SqlCommand mycmd1 = new SqlCommand();
    mycmd1.Connection 
= conn ;
            
    
while (mydr.Read())
    
{
     strSQLKill 
= "kill " + mydr["spid"].ToString();
     mycmd1.CommandText 
= strSQLKill ;
     mycmd1.CommandType 
= CommandType.Text ;
     mycmd1.ExecuteNonQuery(); 
//杀进程
    }

    mydr.Close();
    TmpConn.Close();
        conn.Close();
   }

   
catch (Exception Err)
   
{
    MessageBox.Show(Err.Message );
   }

  }

 

有个随SQL Server一起发布的组件SQLDMO,使用它可以轻松实现数据库备份与还原,而且还提供带进度的事件,但这个COM中的参数Files不支持长文件名,就是说带有空格的文件名将会抛出异常,只有调用系统API进行转换方可解决。

[DllImport("kernel32")]
        
public static extern int GetShortPathName(string path, StringBuilder shortPath,int shortPathLength);
private void DBRestore()
{
string strRestoreFileName = String.Empty ; //要还原的数据文件包含路径的全名
  
   fBDRestore.ShowDialog();
   
   strRestoreFileName = fBDRestore.FileName; //获得要还原的数据文件名称
  
   if (g_strRestoreFileName .Length == 0 ) //是否选取路径
   {
    return ;
   }
SQLDMO.SQLServer  m_Svr 
= new SQLDMO.SQLServerClass();
m_Svr.Connect(
"(local)","sa",  strPassword) ;//连接服务器
if ( m_Svr.Status == SQLDMO.SQLDMO_SVCSTATUS_TYPE.SQLDMOSvc_Running )//连接是否成功
{
    SQLDMO.Restore m_Restore = new SQLDMO.RestoreClass();
//带进度条事件
    SQLDMO.RestoreSink_PercentCompleteEventHandler pceh =new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
    m_Restore.PercentComplete += pceh ;
    m_Restore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database ;
     StringBuilder strRestoreFileNameShort=new StringBuilder(255);
   GetShortPathName(strRestoreFileName, strRestoreFileNameShort,255); //转换成短文件名
   strRestoreFileName=strBackupFileNameShort.ToString();
    m_Restore.Files = strRestoreFileName;    
    m_Restore.Database = "test";//要还原的数据库名称
     m_Restore.ReplaceDatabase = true;
    m_Restore.Restart = true ;
    m_Restore.SQLRestore( m_Svr) ;
           }
        else
{
MessageBox.Show("密码错误","提示", MessageBoxButtons.OK, MessageBoxIcon.Information );
return ; //密码错误,退出
}
}

SQLserver2000还原数据库

一:重要 如果您有独立的数据库ftp控制面板,请首先登陆ftp控制面板。如果没有,直接忽略,跳到第六步(如图)   二:输入数据库的账号密码 登陆数据库控制面板,点击备份/还原/导入数据库     三...
  • salestina
  • salestina
  • 2016年02月24日 10:55
  • 326

SQL2008的备份恢复到2000

2008转到2000的步骤 1. 生成for 2000版本的数据库脚本 2008 的manger studio -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例 -- 右键要转到200...
  • chenli985
  • chenli985
  • 2009年12月22日 15:23
  • 5037

sql2008数据库恢复到2000

sql2008的数据库生成脚本  选择creat,全部数据,2000版本号,其他默认,将生成的sql语句复制到2000数据库执行 ps1:可能出现登录名不存在,需要在2000的企业版里面新建同名登...
  • wahaha4321
  • wahaha4321
  • 2016年10月31日 10:23
  • 1041

SQL SERVER 2000 数据库备份与还原

备份数据库,例如:BACKUP DATABASE Northwind    TO DISK = c:/Northwind.bak还原数据库,例如:--返回由备份集内包含的数据库和日志文件列表组成的结果...
  • feng19821209
  • feng19821209
  • 2006年08月29日 16:32
  • 3201

如何将sql2000备份数据库还原到sql2008中

 今天安装了sql server2008,于是乎想将自己原来在2000下备份的数据还原一番,很自然想到了2000下还原数据库的方法:     1、先新建一个数据库,有些同学说这个新建的数据库在...
  • builderwfy
  • builderwfy
  • 2017年07月29日 15:00
  • 1854

SQL Server2000:分离数据库与附加数据库

分离数据库分离数据库是指将数据库从服务器上分离出来。SQL Server服务器在运行的时候,它会维护所有数据库的信息,包括我们当前并没有用到的数据库。如果这些数据库我们暂时不用,让它们运行只会...
  • sky2098
  • sky2098
  • 2007年03月25日 17:49
  • 6169

SQL Server 2000数据库备份还原到SQL Server2005数据库

现在手中有SQL Server2000中的数据库备份文件(如果此备份文件没有后缀名*.bak或*.tm,请追加相应的后缀名,如*.bak),欲将此文件还原到SQL Server2005中,还原时突然报...
  • zhizhuo_33
  • zhizhuo_33
  • 2014年03月09日 21:48
  • 447

SqlServer_SqlServer恢复数据:如何通过mdf文件和ldf文件来恢复数据库;

问题二、SqlServer恢复数据:如何通过mdf文件和ldf文件来恢复数据库; 问题描述:服务器挂掉后,只得重装系统,幸好数据库的.mdf、.lsf文件还在,但如何恢复数据库呢? 解决方法:  解决...
  • u011168154
  • u011168154
  • 2015年03月12日 17:11
  • 3772

SqlServer2000还原数据库报物理文件名有误解决方案

SqlServer2000还原数据库报物理文件名有误解决方案: 出现这个问题是因为之前数据库备份的时候的数据库路径xian...
  • menghuannvxia
  • menghuannvxia
  • 2014年11月03日 16:24
  • 976

SQL2000如何还原数据库备份bak文件?

1.右击SQL Server 2000实例下的“数据库”文件夹。就是master等数据库上一级的那个图标。选择“所有任务”,“还原数据库” 2.在“还原为数据库”中填上你希望恢复的数据库名字。这个名字...
  • e_wsq
  • e_wsq
  • 2009年06月17日 13:01
  • 5139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL server 2000数据还原小小经验谈
举报原因:
原因补充:

(最多只允许输入30个字)