sqlserver备份计划

sqlserver备份计划

SQL SERVER 2005如何建立自动备份的维护计划

SQL Server 2005中可以使用维护计划来为数据库自动备份,减少数据库管理员的工作负担。其使用方法如下:

(1)启动【sql server Management Studio】,在【对象资源管理器】窗口里选择【管理】——【维护计划】选项。

2)右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项

sqlserver备份计划

,弹出如图所示的【维护计划向导】对话框,单击【下一步】按钮

sqlserver备份计划

3)弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字;【在服务器】文本框里可以输入要使用的服务器名;最后选择正确的身份证信息,单击【下一步】按钮。

sqlserver备份计划

(4)弹出如图所示【选择维护任务】对话框,在该对话框

里可以选择多种维护任务:检查数据库完整性、收缩数据库、重新生成或组织索引、更新统计信息、清除历史记录、执行sql

Server代理作业、备份数据库等。在本例中选择【备份数据库(完整)】复选框,其他维护任务的设置都大同小异。

sqlserver备份计划

(5)单击【下一步】按钮,弹出如图所示【选择维护任务顺序】对话框,如果有多个维护任务,在此可以通过【上移】和【下移】两个按钮来设置维护任务的顺序,设置完毕后单击【下一步】按钮。

sqlserver备份计划

(6)弹出如图所示【定义任务】对话框,在【数据库】下

拉列表框里可以选择要备份的数据库名;在【备份组件】区域里可以选择备份数据库还是备份数据库文件;在【目标】区域可以添加备份文件和备份设备、设置是否将备份数据追加到备份文件里等。设置完毕后单击【下一步】按钮。

sqlserver备份计划

(7)弹出如图所示【选择计划属性】对话框,单击【更改】按钮。

sqlserver备份计划

8)弹出如图所示【新建作业计划】对话框,在该对话框里可以设置备份数据库的时间及频率,设置完毕后单击【确定】按钮回到如下所示对话框,再单击【下一步】按钮。

sqlserver备份计划

(9)弹出如图18.24所示【选择报告选项】对话框,在该对话框里可以选择如果管理维护计划报告:可以将其写入文件中,也可以通过电子邮件发送数据库管理员。设置完毕后单击【下一步】按钮。

sqlserver备份计划

10)弹出如图所示【完成向导】对话框,单击【完成】按钮完成维护计划创建操作。

sqlserver备份计划

11)创建完维护计划后,请确认sql server代理是否启动:在【对象资源管理器】窗口里,右击【sql Server代理】,在弹出的快捷菜单里选择【启动】选项。

 

第二篇:sqlserver备份还原

备份整个数据库:

BACKUP DATABASE { database_name | @database_name_var }

TO < backup_device > [ ,...n ]

备份特定的文件或文件组:

BACKUP DATABASE { database_name | @database_name_var }

< file_or_filegroup > [ ,...n ]

TO < backup_device > [ ,...n ]

备份一个事务日志:

BACKUP LOG { database_name | @database_name_var }

TO < backup_device > [ ,...n ]

---------------------------------------------------------------------------------------------------------------------------------------------

unit DBBackupForm_Unt;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, XP_Button, DB, Mask, ComCtrls, ADODB, ProgressCyl,INIFiles, XP_Form;

type

TDBBackupForm = class(TForm)

XP_Form1: TXP_Form;

Label1: TLabel;

pgbar: TProgressCyl;

XP_Button1: TXP_Button;

XP_Button2: TXP_Button;

XP_Button3: TXP_Button;

SaveDialog1: TSaveDialog;

OpenDialog1: TOpenDialog;

ADOCommand1: TADOCommand;

procedure XP_Button1Click(Sender: TObject);

procedure XP_Button2Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure XP_Button3Click(Sender: TObject);

private

SYSINI: TINIFile;

DevName,TmpStr,InitDB:String;

strlen:Integer;

public

end;

var

DBBackupForm: TDBBackupForm;

implementation

uses DataModule_Unt;

{$R *.dfm}

procedure TDBBackupForm.XP_Button1Click(Sender: TObject);

begin

close;

end;

procedure TDBBackupForm.XP_Button2Click(Sender: TObject);

begin

pgbar.Max:=100;

pgbar.Min:=0;

pgbar.Position:=0;

pgbar.Step:=20;

With SaveDialog1 do

begin

filename:='DB'+FormatDateTime('yy_MM_dd_hh_mm_ss',Now);

options:=[ofhidereadonly,offilemustexist,ofpathmustexist];

if execute then

begin

label1.Caption:='正在备份中...';

DataModule1.ADOConnection1.Close;

TmpStr:= ExtractFileName(filename);

strlen:= Length(TmpStr);

DevName:= Copy(TmpStr,1,strlen-4);

begin

try

ADOCommand1.CommandText:='use Master';

pgbar.StepIt;

ADOCommand1.Execute;

adocommand1.CommandText:='execute sp_helpdevice';

pgbar.StepIt;

adocommand1.Execute ;

pgbar.stepit;

adocommand1.CommandText:='backup database '+InitDB+' to disk='''+filename+''' with init';

pgbar.StepIt;

adocommand1.Execute ;

adocommand1.CommandText:='Use '+InitDB;

pgbar.StepIt;

adocommand1.Execute ;

Self.Hide;

ShowMessage('数据库已经成功备份到 '+filename+'!');

Try

DataModule1.ADOConnection1.Connected:= True;

Except

ShowMessage('无法重新接连数据库!,系统即将退出!');

Application.Terminate;

End;

self.Close;

Except

On Exception do

if DataModule1.ADOConnection1.InTransaction then

DataModule1.ADOConnection1.RollbackTrans;

End;

End;

end;

end;

end;

procedure TDBBackupForm.FormActivate(Sender: TObject);

begin

SYSINI := TIniFile.Create(ExtractFilePath(Application.ExeName)+'DB.INI'); try

InitDB := SYSINI.ReadString('Database', 'InitDB', '');

finally

SYSINI.Free;

end;

end;

procedure TDBBackupForm.XP_Button3Click(Sender: TObject);

begin

pgbar.Max:=100;

pgbar.Min:=0;

pgbar.Position:=0;

pgbar.Step:=20;

With OpenDialog1 do

begin

filename:='';

options:=[ofhidereadonly,offilemustexist,ofpathmustexist];

if execute then

begin

label1.Caption:='正在还原中...';

DataModule1.ADOConnection1.Close;

TmpStr:= ExtractFileName(filename);

strlen:= Length(TmpStr);

DevName:= Copy(TmpStr,1,strlen-4);

pgbar.StepIt;

try

ADOCommand1.CommandText:='use Master';

ADOCommand1.Execute;

pgbar.StepIt;

adocommand1.CommandText:='execute sp_helpdevice';

adocommand1.Execute ;

pgbar.stepit;

adocommand1.CommandText:='Restore database '+InitDB+' From disk='''+filename+''' with replace';

pgbar.StepIt;

adocommand1.Execute ;

adocommand1.CommandText:='Use '+InitDB;

pgbar.StepIt;

adocommand1.Execute ;

Self.Hide;

ShowMessage('数据库已经成功还原到数据库 '+InitDB+'!');

Try

DataModule1.ADOConnection1.Connected:= True;

Except

ShowMessage('无法重新接连数据库!,系统即将退出!');

Application.Terminate;

End;

self.Close;

Except

On Exception do

if DataModule1.ADOConnection1.InTransaction then

DataModule1.ADOConnection1.RollbackTrans;

End;

end;

end;

end;

end.

全部的代码

-----------------------------------------------------------------------------------------------------------------------------------

主 题: 请教:delphi控制SQL Server数据恢复的问题!(好邪门!!!!!数据库一直被占用!)(最多可以加到1000分)

作 者: Iamfish (呆鱼)

等 级:

信 誉 值: 95

所属论坛: Delphi DataBase

问题点数: 100

回复次数: 30

发表时间: 2003-01-20 17:16:51Z

我用

backup database mydb to disk='c:\mydb.bak'

把数据库备份下来。

然后要通程序把c:\mydb.bak还原到数据库。sql语句如下:

restore database mydb from disk='c:\mydb.bak'

我知道数据库不能被打开,所以,在恢复前,我试着关闭已经存在的数据库连接,用了如下语句:

AdoConnection1.close(); //这两个语句的所有组合我都试过了 AdoConnection1.Connected:=false;

然后我用一个新的AdoConnection连接到master数据库。

然后执行sql:

restore database mydb from disk='c:\mydb.bak'

提示数据库正在使用。

我再试着改变

AdoConnection1.ConnectionString,用原来的AdoConnection对象连接到master,连接没有出错。(我试过执行select * from spt_fallback_db,这个表在mydb中是没有的,执行成功)

然后我再执行

restore database mydb from disk='c:\mydb.bak'

还是提示数据库被占用!为什么我明明已经连接到master数据库了,mydb数据库还使用?难道一被连接就得等到程序关闭才能被释放?

我几乎把所有的可能存在的方法试过了,都不行啊,是不是只能把数据恢复做成一个独立的EXE文件?

各位做过Sql server备份的提供点经验、代码、思路...

谢谢

回复人: fyje(云中仙) ( ) 信誉:105 2003-01-20 17:21:15Z 得分:10

数据恢复必须独占方式,这个问题我没处理过,替你up

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-20 17:30:22Z 得分:0

不是,我试过恢复成功过的,

主要是问题是在同一个程序中,如果已经打开过这个数据库,即使关掉后还是不行。

Top

回复人: forgot2000(忘记20xx年) ( ) 信誉:95 2003-01-20 17:34:49Z 得分:1

在Master数据库中建如下存储过程:

Create Procedure killspid (@dbname varchar(20))

as

begin

declare @sql nvarchar(500)

declare @spid int

set @sql='declare getspid cursor for

select spid from 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

end

GO

在恢复数据库之前先执行此存储过程,像这样:

Use Master

Go

exec killspid 'mydb'

Go

restore database mydb from disk='c:\mydb.bak'

在Delphi中直接用ExecSQL先后执行以上SQL语句即可

Top

回复人: cookieyfeng(怪癖幽魂) ( ) 信誉:100 2003-01-20 17:38:46Z 得分:0

你说的问题我还真没有碰见过!不过我得想法是:当你连接SQL SERVER之后,这个连接通道已经被这个连接给占用了,即使你关闭了这个通道,但实际上只是不执行而已,数据库的通道并没有被释放

出来。所以当你恢复之前,应该改变以下连接,当你下一次再使用时,仍然需要释放数据库通道,也就是改变数据库连接。

这只是鄙人的想法,是否正确有待进一步证实!

Top

回复人: xiaohuitu(小灰兔) ( ) 信誉:99 2003-01-20 22:06:55Z 得分:10

很简单的!

AdoConnection1不用断开,

使用一个adoquery,SQL语句如下:

adoquery1.SQL.Clear;

adoquery1.SQL.Add('use master');

adoquery1.SQL.Add('restore database mydb from disk='''c:\mydb.bak''');

adoquery1.SQL.Add('use mydb');

恢复数据库之前一定要user master !

Top

回复人: xiaohuitu(小灰兔) ( ) 信誉:99 2003-01-20 22:12:17Z 得分:0

补上贴,adoquery1.connectionstr可以用adoconnection的。

Top

回复人: gmc007(江西的佬表) ( ) 信誉:103 2003-01-20 23:00:43Z 得分:20

在“查询分析器”中输入:sp_who看一下,就知道了:)

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-21 08:49:08Z 得分:0

谢谢各位,

我试一下,如果可以用,每人50分(或以上)

Top

回复人: okgxs(一叶风铃) ( ) 信誉:104 2003-01-21 09:27:46Z 得分:5

i agree to :xiaohuitu(小灰兔) (

Top

回复人: gzyzljk(潜龙) ( ) 信誉:99 2003-01-21 09:51:21Z 得分:10

unit backup;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls, DB, ADODB;

type

TFbackup = class(TForm)

Panel1: TPanel;

StatusBar1: TStatusBar;

Panel3: TPanel;

btnClose: TBitBtn;

btnBackup: TBitBtn;

btnRestore: TBitBtn;

pgBar: TProgressBar;

Label1: TLabel;

SaveDialog1: TSaveDialog;

ADOQuery1: TADOQuery;

procedure btnBackupClick(Sender: TObject);

procedure btnRestoreClick(Sender: TObject);

procedure btnCloseClick(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction); private

{ Private declarations }

public

{ Public declarations }

end;

var

Fbackup: TFbackup;

implementation

uses dldata;

{$R *.dfm}

procedure TFbackup.btnBackupClick(Sender: TObject);

var

i:integer;

device_is:boolean;

begin

with pgbar do

begin

pgbar.Max:=100;

pgbar.Min:=0;

pgbar.Position:=0;

pgbar.Step:=20;

end;

with savedialog1 do

begin

filter:='备份文件(*.dat)*.dat';

defaultext:='dat';

filename:='';

options:=[ofhidereadonly,offilemustexist,ofpathmustexist];

device_is:=false;

if execute then

begin

statusbar1.Panels[1].Text:='正在备份中....';

try

with adoquery1 do

begin

close;

sql.Clear;

sql.Add('execute sp_helpdevice');

open;

pgbar.Stepit;

first;

while not eof do

begin

if trim(fieldbyname('device_name').AsString)='dl_1' then begin

device_Is:=true;

break;

end;//if fieldbyname('name').AsString='dl_1' then next;

end;//for i:=0 to recordcount-1 do

pgbar.Stepit;

//-----------------------------------------------------------

if device_Is then

begin

close;

sql.Clear;

sql.Add('execute sp_dropdevice ''dl_1''');

execsql;

end;//if not device_Is then

pgbar.Stepit;

//------------------------------------------------------------

close;

sql.Clear;

sql.Add('execute sp_addumpdevice ''disk'',''dl_1'','''+filename+''''); execsql;

//--------------------------------------------------------

pgbar.Stepit;

close;

sql.Clear;

sql.Add('backup database dl to dl_1');

execsql;

pgbar.Stepit;

end;//with adoquery1 do

except

showmessage('备份失败!');

end;//try

end;//if execute then

end;//with savedialog1

statusbar1.Panels[1].Text:='备份完成。';

end;

procedure TFbackup.btnRestoreClick(Sender: TObject);

begin

with pgbar do

begin

pgbar.Max:=100;

pgbar.Min:=0;

pgbar.Position:=0;

pgbar.Step:=50;

end;

if messagedlg('恢复数据库后必须重新登陆!是否继续?',mtwarning,[mbok,mbcancel],0)=mrok then

begin

statusbar1.Panels[1].Text:='正在恢复中....';

dm.dlconnection.Close;

dm.Free;

//try

with adoquery1 do

begin

close;

sql.Clear;

sql.Add('restore database dl from dl_1');

execsql;

end;//with do

//except

// showmessage('备份文件不存在!ss');

//end;

pgbar.StepIt;

pgbar.StepIt;

statusbar1.Panels[1].Text:='恢复完成.';

application.MainForm.Caption:='正在关闭系统....';

winexec(pchar(application.exename),sw_show);

application.Terminate;

end;//if messagedlg()=mrok

end;

procedure TFbackup.btnCloseClick(Sender: TObject);

begin

close;

end;

procedure TFbackup.FormClose(Sender: TObject; var Action: TCloseAction); begin

action:=cafree;

end;

end.

Top

回复人: wjlsmail(计算机质子) ( ) 信誉:105 2003-01-21 10:29:40Z 得分:10

我用下面的代码没有问题,即使在调试环境中

-------------------------------------------------------

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB;

type

TForm1 = class(TForm)

ADOConnection1: TADOConnection;

ADOQuery1: TADOQuery;

Button1: TButton;

Button2: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin

ADOConnection1.Open ;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Caption := '正在备份中...' ;

with ADOQuery1 do

begin

Close ;

Sql.Text := 'Backup DataBase Hdcims to disk = ''D:\hdcims.bak''' ; ExecSql ;

end ;

Caption := '备份完成 !' ;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Caption := '正在恢复中...' ;

with ADOQuery1 do

begin

Close ;

Sql.Add('use Master') ;

Sql.Add('Restore DataBase Hdcims From Disk = ''D:\Hdcims.Bak''') ; ExecSql ;

end ;

Caption := '恢复完成 !' ;

end;

end.

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-21 10:38:34Z 得分:0

谢谢forgot2000(忘记20xx年)的sp,100分!

别外,这个sp好像只能放在master库中,如果放在mydb中,会提示无法删除自己的进程,如果先Use master,又说不能找到这个sp。而从这个库调用的另一个库的sp我不太清楚(学delphi+sql server才1个月,不过,我学过vb,asp...),不过从逻辑上来讲,是行不通的(就像不能引一个已经关闭的Form中的变量或控件一样)。

谢谢cookieyfeng(怪癖幽魂)的想法,50分

我先用语句断开连接,然后用sp_who看了一下,真的还没有断开,装态为sleeping.

非常感谢xiaohuitu(小灰兔),100分+本贴50分!

你的做法好简单,却帮了我的大忙,我一时晕了头,把use给忘记了。

谢谢gmc007(江西的佬表) ,本贴子40分!

让我知道了还有sp_who的这sp,好用。一个同事搞了两年SQL Server还不知道有这个呢,[:) 也许这个很少用吧,但有用!

剩下10给第一个帮我UP的人。

其它的分数另外贴子给分。

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-21 10:41:05Z 得分:0

晕,这个页面打开太久了,没想到还有代码呢。

我看清楚后再给这两个代码定分。

问题已经解决,以后的回复不再给分。

Top

回复人: xiaocuo_zrf(谁知我情深似海,全都是泪来灌溉) ( ) 信誉:104 2003-01-21 10:41:29Z

得分:1

你开出的分太诱人了,进来学习!

Top

回复人: forgot(忘记forgot2000) ( ) 信誉:100 2003-01-21 12:09:20Z 得分:0

我觉得xiaohuitu(小灰兔)的做法在并发操作时会有问题,当然,如果是对单机而言,大家的做法都是正确的,具体搂主不妨试一试,在多台机器同时通过不同的指令来访问某个数据库时,你必须先断开所有与这个数据库相关的事务才能进行恢复操作。

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-21 13:12:47Z 得分:0

谢谢。你所说的那个问题我知道。你那个存储过程我也试过了,很好用,而且我现在也找到了一种方法:

先用

try...except...end;

关掉其它的连接,然后,再把当前的连接改到master数据库,这样就不会了(不过,我程序中已经说明必须断开所有的客户端程序)。

还有一个问题是:怎样把数据备分到客户端,我知道可以通过共享目录备份下来。但好像不是很完美,我们的程序不可能要求每个客户端都共享一个目录。

我的做法是:

在服务器上开一个共享,把文件备份到那个共享目录,然后再把文件拷贝到客户端。

不知道有没有更好的办法?

此贴继续有效!

因为 forgot(忘记forgot2000)大哥/大姐不要分,下面的贴子有100,作为散分的贴子。要分的可以去那里UP。

/Expert/topic/1378/1378665.xml?temp=.367016

Top

回复人: wdjlover(小德) ( ) 信誉:97 2003-01-21 13:26:51Z 得分:2

要把其他所有使用这个数据库的进程都kill掉,用sqlserver的kill命令

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-21 13:30:09Z 得分:0

这个我知道:

forgot大哥(女士在这里很少,就这样叫了)已经做了一个存储过程:

Create Procedure killspid (@dbname varchar(20))

as

begin

declare @sql nvarchar(500)

declare @spid int

set @sql='declare getspid cursor for

select spid from 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

end

GO

Top

回复人: forgot(忘记forgot2000) ( ) 信誉:100 2003-01-21 14:27:08Z 得分:1

在服务器上开共享目录可以,但必须要求是对所有用户完全共享的目录(即既可读又可写),备份路径直接写网络路径即可。

forgot和forgot2000是同一个人,是男是女你查旧帖子吧!

Top

回复人: xiaohuitu(小灰兔) ( ) 信誉:99 2003-01-21 16:04:11Z 得分:0

我很开心,我以前只是在这里查询资料,看别人的答案,很少帮别人回答问题(是不是好自私?)。其实帮别人回答问题也很有成就感。:)

这个备份问题我以前也碰到过,也尝试了好久和好多方法,包括大家写的相类似的存储过程,不过我到后来发觉还是自己的最快最简洁。对于SQL数据库来说,一定要独占方式下才能恢复,哪怕你用相同的用户在其他客户机上同时登录也不行。你可以用系统存储过程检查谁已登录或KILL他们。但是,对于备份本身这个动作,一定要独占方式,而且是use master 而不是use mydb,明白这一点就会发现就是这么简单。

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-22 09:53:22Z 得分:0

谢谢

xiaohuitu(小灰兔) 这里拿分

/Expert/topic/1378/1378693.xml?temp=.1416742

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-22 09:58:02Z 得分:0

TO forgot(忘记forgot2000):

其实,我说的意思不是可不可以的问题,因为我已经试过,而且很成功。但总要共享一下目录,有定麻烦。不过,这是我目前知道的最好的方式。所以我想知道有没有更好的方式(人心不足蛇吞象,呵呵~~)。

Top

回复人: pengdali(大力 V3.0) ( ) 信誉:110 2003-01-23 01:29:41Z 得分:30

create PROCEDURE GY_DBBak

@bakequip int, -- 备份设备:磁盘&磁带

@bakpath varchar(50), -- 带全路径的备份文件名 @baktype int, -- 完全备份&增量备份 @baklog int, -- ‘0’备份日志

@bakdb int, -- ‘0’备份数据库 @kind varchar(7), --备份还是恢复

@retmsg varchar(20) output --返回信息 AS

DECLARE @DevName_data varchar(50)

DECLARE @DevName_log varchar(50)

declare @db_path varchar(100)

declare @log_path varchar(100)

DECLARE @RC INT

SELECT @db_path = @bakpath + '.dat' SELECT @log_path = @bakpath + 'log.dat' SELECT @RC=0

DBCC CHECKDB(Northwind)

/*********************************************************** ** CREATE BACKUP AND RESTORE DEVICES

************************************************************/ IF @RC=0

BEGIN

EXEC sp_addumpdevice 'disk', @DevName_data,@db_path

exec sp_addumpdevice 'disk', @DevName_log,@log_path select @rc=@@error

IF @RC<>0

begin

EXEC SP_DropDevice @Devname_data

exec sp_dropdevice @devname_log

SELECT @RC=-1000

return @rc

end

END

IF @kind='backup'

BEGIN

IF @bakequip=0

BEGIN

IF @baktype=0

BEGIN

IF @bakdb=0

BEGIN

BACKUP DATABASE Northwind TO DISK=@Devname_data WITH INIT

END

IF @baklog=0

BEGIN

BACKUP LOG Northwind WITH NO_LOG

BACKUP LOG Northwind TO DISK=@DevName_log

WITH INIT,NO_TRUNCATE

END

END

ELSE BEGIN

IF @bakdb=0

BEGIN

BACKUP DATABASE Northwind TO DISK=@DevName_data WITH NOINIT

END

IF @baklog=0

BEGIN

BACKUP LOG Northwind WITH NO_LOG

BACKUP LOG Northwind TO DISK=@DevName_log

WITH NOINIT,NO_TRUNCATE

END

END

END

SELECT @retmsg='数据库备份成功!'

END

IF @kind='restore'

BEGIN

RESTORE DATABASE Northwind FROM DISK= @DevName_data WITH REPLACE SELECT @retmsg='恢复数据库成功!'

END

RETURN 0

Top

回复人: pengdali(大力 V3.0) ( ) 信誉:110 2003-01-23 01:31:09Z 得分:0

或用这个来杀进程:

create proc killspid (@dbname varchar(20))

as

begin

declare @sql nvarchar(500)

declare @spid int

set @sql='declare getspid cursor for

select spid from 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

end

--用法

use master

exec killspid '数据库名'

Top

回复人: pengdali(大力 V3.0) ( ) 信誉:110 2003-01-23 01:33:30Z 得分:0

还有问题到sql版找大力

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-24 09:13:11Z 得分:0

谢谢,先结再说

Top

回复人: Iamfish(呆鱼) ( ) 信誉:95 2003-01-24 09:22:20Z 得分:0

我靠!整理得半死的FAQ居然不能提交,那个页面出错!

Top

回复人: afei78223(阿飞) ( ) 信誉:99 2003-04-21 18:45:14Z 得分:0

Up!

Top

回复人: DJ_KK(想了很久@恋了很久) ( ) 信誉:79 2003-05-08 14:01:31Z 得分:0

up sa

Top

回复人: shooter440(射手) ( ) 信誉:100 2003-08-13 11:02:18Z 得分:0

再请各位大虾帮帮忙,为何备份时,如果前一次备份用了一个文件,下次再用它来备份的话,不是覆盖前一次的文件(同一个文件名),而是直接又备份进去了,而恢复时还是第一次的数据库啊?笨人百思不得其解,有哪位大虾值点一下。谢谢了!

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

BDE用:TQuery

ADO用:ADOCommand或者ADOQuery,不过最好用ADOCommand,因为ADOQuery在

执行非查询命令的时候可能有Bug,而ADOCommand没有。

在备份时候参照Backup Database语句。

恢复的时候参照Restore Database语句

在以前的贴子里面我都是详细的描述。

在备份的时候还要注意,最好设置当前的Database Name为Master,这样可以有效避免对要备份的数据库的占用。

用存储过程可以很好地实现该功能

store procedure DataSys

//////////////////////////

CREATE proc datasys --数据备份和恢复

(@kind varchar(7),--备份还是恢复

@filename varchar(100),--文件名

@retmsg varchar(20) output --返回参数

)

as

if @kind='backup'

begin

backup database SubHealth to disk=@filename with init

end

if @kind='restore'

begin

-- drop database clientcenter_bak

restore database SubHealth from disk=@filename with replace

end

if @kind='backup' select @retmsg='数据库备份成功!'

if @kind='restore' select @retmsg='成功恢复数据库!'

return 0

GO

很简单的!

AdoConnection1不用断开,

使用一个adoquery,SQL语句如下:

adoquery1.SQL.Clear;

adoquery1.SQL.Add('use master');

adoquery1.SQL.Add('restore database mydb from disk='''c:\mydb.bak''');

adoquery1.SQL.Add('use mydb');

恢复数据库之前一定要user master !

=============================================================================================================================================

熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL SERVER、ACCESS、EXCEL数据转换,详细说明如下:

一、SQL SERVER 和ACCESS的数据导入导出

常规的数据导入导出:

使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:

1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation

2Services(数据转换服务),然后选择 czdImport Data(导入数据)。

3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。

4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。

5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。

6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

Transact-SQL语句进行导入导出:

1. 在SQL SERVER里查询access数据:

-- ======================================================

SELECT *

FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\DB.mdb";User ID=Admin;Password=')...表名

-------------------------------------------------------------------------------------------------

2. 将access导入SQL server

-- ======================================================

在SQL SERVER 里运行:

SELECT *

INTO newtable

FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\DB.mdb";User ID=Admin;Password=' )...表名

-------------------------------------------------------------------------------------------------

3. 将SQL SERVER表里的数据插入到Access表中

-- ======================================================

在SQL SERVER 里运行:

insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

'Data Source=" c:\DB.mdb";User ID=Admin;Password=')...表名

(列名1,列名2)

select 列名1,列名2 from sql表

实例:

insert into OPENROWSET('Microsoft.Jet.OLEDB.4.0',

'C:\db.mdb';'admin';'', Test)

select id,name from Test

INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:\trade.mdb'; 'admin'; '', 表名)

SELECT *

FROM sqltablename

-------------------------------------------------------------------------------------------------

二、 SQL SERVER 和EXCEL的数据导入导出

1、在SQL SERVER里查询Excel数据:

-- ======================================================

SELECT *

FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

SELECT *

FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended

properties=Excel 5.0')...xactions

-------------------------------------------------------------------------------------------------

2、将Excel的数据导入SQL server :

-- ======================================================

SELECT * into newtable

FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

实例:

SELECT * into newtable

FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',

'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended

properties=Excel 5.0')...xactions

-------------------------------------------------------------------------------------------------

3、将SQL SERVER中查询到的数据导成一个Excel文件

-- ======================================================

T-SQL代码:

EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'

参数:S 是SQL服务器名;U是用户;P是密码

说明:还可以导出文本文件等多种格式

实例:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'

EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'

在VB6中应用ADO导出EXCEL文件代码:

Dim cn As New ADODB.Connection

cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"

cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"