SQL SERVER 2005如何建立自动备份的维护计划
SQL Server 2005中可以使用维护计划来为数据库自动备份,减少数据库管理员的工作负担。其使用方法如下:
(1)启动【sql server Management Studio】,在【对象资源管理器】窗口里选择【管理】——【维护计划】选项。
2)右击【维护计划】,在弹出的快捷菜单里选择【维护计划向导】选项
,弹出如图所示的【维护计划向导】对话框,单击【下一步】按钮
3)弹出如图所示【选择目标服务器】对话框,在【名称】文本框里可以输入维护计划的名称;在【说明】文本框里可以输入维护计划的说明文字;【在服务器】文本框里可以输入要使用的服务器名;最后选择正确的身份证信息,单击【下一步】按钮。
(4)弹出如图所示【选择维护任务】对话框,在该对话框
里可以选择多种维护任务:检查数据库完整性、收缩数据库、重新生成或组织索引、更新统计信息、清除历史记录、执行sql
Server代理作业、备份数据库等。在本例中选择【备份数据库(完整)】复选框,其他维护任务的设置都大同小异。
(5)单击【下一步】按钮,弹出如图所示【选择维护任务顺序】对话框,如果有多个维护任务,在此可以通过【上移】和【下移】两个按钮来设置维护任务的顺序,设置完毕后单击【下一步】按钮。
(6)弹出如图所示【定义任务】对话框,在【数据库】下
拉列表框里可以选择要备份的数据库名;在【备份组件】区域里可以选择备份数据库还是备份数据库文件;在【目标】区域可以添加备份文件和备份设备、设置是否将备份数据追加到备份文件里等。设置完毕后单击【下一步】按钮。
(7)弹出如图所示【选择计划属性】对话框,单击【更改】按钮。
8)弹出如图所示【新建作业计划】对话框,在该对话框里可以设置备份数据库的时间及频率,设置完毕后单击【确定】按钮回到如下所示对话框,再单击【下一步】按钮。
(9)弹出如图18.24所示【选择报告选项】对话框,在该对话框里可以选择如果管理维护计划报告:可以将其写入文件中,也可以通过电子邮件发送数据库管理员。设置完毕后单击【下一步】按钮。
10)弹出如图所示【完成向导】对话框,单击【完成】按钮完成维护计划创建操作。
11)创建完维护计划后,请确认sql server代理是否启动:在【对象资源管理器】窗口里,右击【sql Server代理】,在弹出的快捷菜单里选择【启动】选项。
备份整个数据库:
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'"
SQLServer20xx数据库维护计划计算机系统各种软硬件故障用户误操作以及恶意破坏是不可避免的这些影响到数据的正确性甚至造成数…
执行计划首先在分析的用户下执行rdbmsadminutlxplansql用sys用户登录sqlplusadminplustrace…
看懂执行计划例子1以AdventureWorks的DatabaseLog查询为例SELECTFROMAdventureWorks2…
有三种方法1Explainplanexplainplanforselectfromaa查看结果selectfromtabledbm…
查询速度慢的原因很多常见如下几种1没有索引或者没有用到索引这是查询慢最常见的问题是程序设计的缺陷2IO吞吐量小形成了瓶颈效应3没有…
1对查询进行优化应尽量避免全表扫描首先应考虑在where及orderby涉及的列上建立索引2应尽量避免在where子句中对字段进行…