如何备份还原数据库sql server2000

为什么我还原的时候会出现“数据库正在使用,无法获得对数据库的排他权”.
希望各位高手不吝赐教。感谢

----------------------------------------------
-
作者:
男 jyenjoy (jy)▲△△△△-
普通会员
2003-11-28 15:36:51
1楼:Restore database Mydatabasename from disk='C:/MyDB.db'  WITH replace,stats   // 恢复 


不过在恢复的时候没有取得排它的访问权限。 


解决方案 :1  获得权限 ,

          2  建立新的别名数据库 ,连接 master,断开与源数据库的连接 ,

           在 master 中执行还原的 SQL 语句 ,完成后删除新建别名数据库。
请问:解决方案1,2如何在delphi中实现。恳切,恳切 
按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 luyiting (lusin)▲△△△△-
普通会员
2003-11-30 12:22:36
2楼:1.确保只有一个应用程序使用该数据库,在还原数据库时,必须关掉delphi编程环境下的数据库连接和企业管理器到数据库的连接,用sql sever自带的事件探测器可以看见当前有几个到数据库的连接。事件探测器本身不算一个连接。

2.用一个AdoCommand直接连到Master表。

3. 用企业管理器试着还原一次数据库,在事件探测器中观看执行过程,提出有RESTORE的那一句,将这一句写入AdoCommand的 CommandText中然后执行。执行前先断开你的应用程序中其他的数据库连接,等待大概一分钟左右。执行后等待大概三十秒,再重新连接数据库,并打开 数据集,应用程序恢复到原来状态。
----------------------------------------------
-
作者:
男 niewenlong (niewenlong)▲△△△△-
普通会员
2004-11-9 19:29:19
3楼:我贴代码出来吧  呵呵 
自己看就明白怎么回事了
procedure TDB_frm.SB_bakClick(Sender: TObject);
var
  BackupToFile,tempstr: string;
  adobackup:TAdocommand;
begin
BackupToFile := self.EdtBackUpPath.Text ;
if Trim(EdtBackUpPath.Text) = '' then
  begin
    MessageDlg('未设置备份的目的数据库!', mtError, [mbOK], 0);
    Exit;
  end
else
  begin
  tempstr:= copy(BackupToFile,length(BackupToFile)-3,4);
  if uppercase(tempstr)<>'.BAK' then
     backuptofile :=self.EdtBackUpPath.Text+'.bak'
  end;

if self.RB_bak.Checked then  //备份
  begin
    if FileExists(BackupToFile) then
    begin
      if MessageDlg(BackupToFile + '已经存在,是否要覆盖该文件?', mtWarning,
        [mbYes,mbCancel], 0) = MrCancel then Exit;
    end;

    adobackup:=TAdocommand.Create(application);
    adobackup.ConnectionString:=' Provider=SQLOLEDB.1;'+'Persist Security Info=False;User ID='''+conninfo.username+''';Password='''+conninfo.userpassword+''';'+
          'Data Source='''+conninfo.servername+'''';
    adobackup.CommandText:='backup database '+conninfo.database+' to disk = '+ ''''+BackupToFile+'''';
    try
      adobackup.Execute;
      adobackup.Free;
    if Application.MessageBox( '备份成功! ','提示',64)=IDOK then Close;
    except
      Application.MessageBox('备份失败!','提示',64);
      adobackup.Free;
      exit;
    end;

  end;

end;

procedure TDB_frm.SB_restoreClick(Sender: TObject);
var
RestoreFromFile: string;
adorestore:TAdocommand;

begin
if Trim(self.edtRestorePath.Text) = '' then
  begin
  MessageDlg('未设置还原的目的数据库!', mtError, [mbOK], 0);
  Exit;
end;

if self.RB_restore.Checked=true then
  begin
    RestoreFromFile := self.edtRestorePath.Text;
    if not FileExists(RestoreFromFile) then
      begin
        MessageDlg('找不到用于还原数据库的备份文件!', mtError, [mbOK], 0);
        Exit;
     end;
  end;

  if application.MessageBox('此操作将使上次备份以来的所有数据丢失,是否继续?','恢复数据',33)=IDCANCEL then  exit;
    dm_frm.Free;
    adorestore:=TAdocommand.Create(application);
    adorestore.ConnectionString:=' Provider=SQLOLEDB.1;'+'Persist Security Info=False;User ID='''+conninfo.username+''';Password='''+conninfo.userpassword+''';'+
    'Data Source='''+conninfo.servername+'''';
    adorestore.CommandText:='restore database '+conninfo.database+' from disk='''+RestoreFromFile+''' with replace';
    try
      adorestore.Execute;
      adorestore.Free;
      if Application.MessageBox( '恢复成功! 现在需要重新登陆软件,请按“确定” ','提示',64)=IDOK then Close;
      Application.Terminate;
    except
      Application.MessageBox('恢复失败!请断开与该数据库的所有连接!','提示',64);
      adorestore.Free;
      exit;
    end;
end;


procedure TDB_frm.RB_bakClick(Sender: TObject);
begin
self.edtRestorePath.Clear;
self.EdtBackUpPath.Enabled  := true;
self.EdtBackUpPath.ReadOnly :=false;
self.edtRestorePath.Enabled :=false;
self.edtRestorePath.ReadOnly:=true;
self.SB_bak.Enabled:= true;
self.SB_bak_P.Enabled:= true;
self.SB_restore.Enabled:= false;
self.SB_restore_P.Enabled:= false;
end;

procedure TDB_frm.RB_restoreClick(Sender: TObject);
begin
self.EdtBackUpPath.Clear;
self.EdtBackUpPath.Enabled  :=false;
self.EdtBackUpPath.ReadOnly :=true;
self.edtRestorePath.Enabled :=true;
self.edtRestorePath.ReadOnly:=false;
self.SB_bak.Enabled:= false;
self.SB_bak_P.Enabled:= false;
self.SB_restore.Enabled:= true;
self.SB_restore_P.Enabled:= true;
end;

procedure TDB_frm.FormShow(Sender: TObject);
begin
self.RB_bak.Checked := true;
self.EdtBackUpPath.Clear;
self.edtRestorePath.Clear;
end;

procedure TDB_frm.SB_bak_PClick(Sender: TObject);
begin
self.SaveDialog1.Filter:='备份文件(*.bak)|*.bak';
if self.SaveDialog1.Execute then
  self.EdtBackUpPath.Text:=self.SaveDialog1.FileName;
end;

procedure TDB_frm.SB_restore_PClick(Sender: TObject);
begin
OpenDialog1.filter:='备份文件(*.bak)|*.bak' ;
if self.OpenDialog1.Execute then
   self.edtRestorePath.Text:=self.OpenDialog1.FileName; 
end;

end.



备份和恢复SQL SERVER 数据库   恢复数据库:
  关键字:Alter Database 被恢复的数据库名 Set Offline with Rollback immediate;
            restore database 被恢复的数据库名 from disk = '备份文件路径';
            Alter Database 被恢复的数据库名 Set OnLine With rollback Immediate;

/
    string sql = "Alter Database db Set Offline with Rollback immediate;"; //db 是要备份的数据库名
    sql +=  "restore database db from disk = '" ;
    sql += Server.MapPath("").ToString() +"//";
    sql += bakname + "'";  //bakname 是备份文件名
    sql += "Alter Database db Set OnLine With rollback Immediate;";
    try
    {
     连接 master 数据库 ;
     执行 sql  语句;
     Response.Write("<script language=javascript>alert('数据恢复成功!');</script>");
    }
    catch(Exception ex)
    {
     Response.Write("<script language=javascript>alert('数据恢复失败!');</script>");
     this.Label2.Text = ex.ToString();
    }

备份数据库:

关键字:backup database 被备份的数据库名 to disk ='备份文件路径';
//    
 string sql = "backup database db to disk = '" + Server.MapPath("").ToString() +"//"
    + bakname  //备份文件名
    + System.DateTime.Now.DayOfYear.ToString()
    + System.DateTime.Now.Millisecond.ToString() + ".bak'";
  try

  连接 被备份的数据库 ;
  执行 sql  语句;

   Response.Write("<script language=javascript>alert('备份成功!');location='restore.aspx'</script>");
}
    catch(Exception ex)
    {
     Response.Write("<script language=javascript>alert('备份失败!');</script>");
     this.Label2.Text = ex.ToString();
    }
 


----------------------------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值