这个问题好解决!!! Restore database databasename from disk='C:\buDB.mdf' WITH replace,stats //恢复 backup database databasename to disk='d:\server\jun.bak' with init //备分 你可以用TQUERY控件拼写并执行这些语句。
我以前也做过类似的问题,当时是采用Transact SQL 的Backup,Restore命令,根据具体需要配置命令的参数,需要注意的是,在使用Restore命令后,数据库处于DBO Use Only状态。
adocommand1.CommandText:='backup database zzccpmsdata to disk=''d:\delphi\zzc\data\zzccpmsdatacopy'' with init'; adocommand1.Execute; 其中zzccpmsdata为sql server数据库,备份结果正常。恢复数据库时的语句为: adocommand1.CommandText:='restore database zzccpmsdata from disk=''d:\delphi\zzc\data\zzccpmsdatacopy'' with replace'; adocommand1.Execute;
我的前一个程序里,刚刚实了这个功能,可惜我在网吧没有源码给你 备份: procedure tform1.btnbuckupclick(sender:tobject); var QryTmp:Tquery; begin qrytmp:=Tquery.create(self); qryTmp.databasenme:=database1.databasename QryTmp.sql.text:='Backup database 数据库 to disk='''+ 你的路径 +''''; QryTmp.execsql; end; 恢复: procedure tform1.btnrestoreclick(sender:tobject); var QryTmp:Tquery; begin qrytmp:=Tquery.create(self); qryTmp.databasenme:=database1.databasename; database1.connect:=false;//记住,关闭 QryTmp.sql.text:=' use master '+ +' restore database 数据库 to from='''+ 你的路径 +''''; QryTmp.execsql; database1.connect:=true;// end; end;
不如意思,打多了一个"to" 恢复:应改 procedure tform1.btnrestoreclick(sender:tobject); var QryTmp:Tquery; begin qrytmp:=Tquery.create(self); qryTmp.databasenme:=database1.databasename; database1.connect:=false;//记住,关闭 QryTmp.sql.text:=' use master '+ +' restore database 数据库 from='''+ 你的路径 +''''; QryTmp.execsql; database1.connect:=true;// end;
备份: USE master EXEC sp_addumpdevice 'disk', 'testdb', 'd:\mssql7\backup\dfsndb.bak' BACKUP DATABASE dfsndb TO testdb 恢复: USE MASTER RESTORE FILELISTONLY FROM DISK = 'c:\mssql7\backup\sndb5.bak' RESTORE DATABASE mydb FROM DISK = 'c:\mssql7\backup\sndb5.bak'
to 汗水 你用另一个adoconntion来连接master数据库就是了, 执行sql语句前把开始那个adoconntion断开 这样就不会出现权限的问题了。
query1.sql.add('dump database database1 to disk ="c:\Temp\1.dat") ; query1.execsql
book523(笑问):我就是那样做的照样有这个问题。
看看我的源程序:procedure backup.BackupClick(Sender: TObject); var aa:string; bb:string; present:Tdatetime; thistime:string; year,month,day:word; ym:string; s,t,ip:string; begin ip:=localip; s:=extractfilepath(application.exename); t:='\\'+ip+'\'+s+'databackup'; t:=move(t); if not DirectoryExists(t) then if not CreateDir(t) then raise Exception.Create('不能创建子目录:databackup,请检查。'); present:=strtodate(datesys); thistime:=timetostr(time); //*************************** decodedate(present,year,month,day); if month<10 then begin ym:=inttostr(year)+'0'+inttostr(month); end else begin ym:=inttostr(year)+inttostr(month); end; aa:=t+'\'+ym+'.dat'; aa:=''''+aa+''''; bb:=ym+'.dat'; //*************************** userbackup.Open; userbackup.Insert; userbackup.FieldByName('userno').asinteger:=useno; userbackup.FieldByName('backuptime').asstring:=thistime; userbackup.FieldByName('backupdate').asstring:=datesys; userbackup.FieldByName('backupfilename').asstring:=bb; userbackup.FieldByName('backuptype').asstring:='完全备份'; userbackup.Post; try dmmain.dbXin.ApplyUpdates([userbackup]); except messagedlg('备份不成功!请检查。',mtInformation,[mbok],0); raise; abort; end; if xinbackup.Active then xinbackup.Close; xinbackup.SQL.Clear; xinbackup.sql.Add('backup database sununit to disk='); xinbackup.SQL.Add(aa+'with INIT'); xinbackup.ExecSQL; end;
如果你想备份整个数据库的话,请使用 backup database
如果你想命令行备份的话,请使用bcp
一:SQL语句:Backup DataBase
二、SQL Server提供的备份服务。
Restore database databasename from disk='C:\buDB.mdf' WITH replace,stats //恢复
backup database databasename to disk='d:\server\jun.bak' with init //备分
你可以用TQUERY控件拼写并执行这些语句。
back database 库名 to disk='路径\文件名' with init(覆盖)
实现备份,恢复也一样.
不过你还可以,定期COPY一下呀,这样对新手来说是最好不过的了,我也经常用COPY的方法,完了之后你要恢复了,你这样做就可以了,在QUERY ANALYZER中:
Exec sp_attach_db @dbname=N'数据库名',
@Filename1=N'MDF的完整路径和MDF名带后缀名',
@Filename2=N'LDF的完整路径和MDF名带后缀名'
试一下吧,在7.0和2000中都能用,不过高手不建议如此用法,这也是我知道的一个方法,不妨先将你的数据库试一下!!!!!!
有什么问题请说!!!!
Restore Database
只能在服务器生成文件。当然,你开了网络共享也可以。如果服务器崩溃,这个备份文件不一定能够恢复。可能会产生孤立用户。你还需要针对孤立用户进行消除。
adocommand1.Execute;
其中zzccpmsdata为sql server数据库,备份结果正常。恢复数据库时的语句为:
adocommand1.CommandText:='restore database zzccpmsdata from disk=''d:\delphi\zzc\data\zzccpmsdatacopy'' with replace';
adocommand1.Execute;
备份:
procedure tform1.btnbuckupclick(sender:tobject);
var
QryTmp:Tquery;
begin
qrytmp:=Tquery.create(self);
qryTmp.databasenme:=database1.databasename
QryTmp.sql.text:='Backup database 数据库 to disk='''+
你的路径 +'''';
QryTmp.execsql;
end;
恢复:
procedure tform1.btnrestoreclick(sender:tobject);
var
QryTmp:Tquery;
begin
qrytmp:=Tquery.create(self);
qryTmp.databasenme:=database1.databasename;
database1.connect:=false;//记住,关闭
QryTmp.sql.text:=' use master '+
+' restore database 数据库 to from='''+
你的路径 +'''';
QryTmp.execsql;
database1.connect:=true;//
end; end;
恢复:应改
procedure tform1.btnrestoreclick(sender:tobject);
var
QryTmp:Tquery;
begin
qrytmp:=Tquery.create(self);
qryTmp.databasenme:=database1.databasename;
database1.connect:=false;//记住,关闭
QryTmp.sql.text:=' use master '+
+' restore database 数据库 from='''+
你的路径 +'''';
QryTmp.execsql;
database1.connect:=true;//
end;
CREATE procedure up_BackupDatabase
as
declare
@DatabaseName varchar(255),
@LogName varchar(255),
@csYear varchar(4), --年
@csMonth varchar(2), --月
@csDate varchar(2), --日
@DateEncode char(8) --当天日期的编码 --获取当天日期的编码:比如2002-2-4-12,编码后为:2002020412
set @csYear= convert(varchar(4),datepart(yyyy,getdate()))if datepart(mm,getdate())<=9
set @csMonth='0'+convert(char(1),datepart(mm,getdate()))
else
set @csMonth=convert(char(2),datepart(mm,getdate()))if datepart(dd,getdate())<=9
set @csDate='0'+convert(char(1),datepart(dd,getdate()))
else
set @csDate=convert(char(2),datepart(dd,getdate()))set @DateEncode=@csYear+@csMonth+@csDateset @DataBaseName = @DateEncode + '.dat'
set @LogName = @DateEncode + '.log'backup database JXCDB
to disk = @DataBaseName
with format,INIT,
description = '数据库备份',
name= 'Data Backup...'backup log JXCDB
to disk = @LogName
with format,INIT,
description = '日志备份',
name= 'Log Backup...'
GO--数据的恢复CREATE procedure up_RestoreDatabase
@DatabaseName varchar(255),
@LogName varchar(255)
asrestore database JXCDB_lms
from disk = @DatabaseName
with replacerestore log JXCDB
from disk = @LogName
with replace
GO
我没有取得这个权限,用了另外一个方法解决了这个问题,
1 断开数据库的连接
2 动态的创建一个数据库别名,连接master数据库,在master数据库中执行Restore database ...
3 删除新建的数据库别名但我还想知道如何取得对数据库的排它访问权限
vicky__gao(高伟奇):谢谢你,只是我是用ADO连接的,而那个控件只是基于BDE的,不过还是很感谢你!!等问题结了的时候我会给你分的。
USE master
EXEC sp_addumpdevice 'disk', 'testdb', 'd:\mssql7\backup\dfsndb.bak'
BACKUP DATABASE dfsndb TO testdb
恢复:
USE MASTER
RESTORE FILELISTONLY FROM DISK = 'c:\mssql7\backup\sndb5.bak'
RESTORE DATABASE mydb FROM DISK = 'c:\mssql7\backup\sndb5.bak'
你用另一个adoconntion来连接master数据库就是了,
执行sql语句前把开始那个adoconntion断开
这样就不会出现权限的问题了。
query1.execsql
var
aa:string;
bb:string;
present:Tdatetime;
thistime:string;
year,month,day:word;
ym:string;
s,t,ip:string;
begin
ip:=localip;
s:=extractfilepath(application.exename);
t:='\\'+ip+'\'+s+'databackup';
t:=move(t);
if not DirectoryExists(t) then
if not CreateDir(t) then
raise Exception.Create('不能创建子目录:databackup,请检查。'); present:=strtodate(datesys);
thistime:=timetostr(time);
//***************************
decodedate(present,year,month,day);
if month<10 then
begin
ym:=inttostr(year)+'0'+inttostr(month);
end
else begin
ym:=inttostr(year)+inttostr(month);
end;
aa:=t+'\'+ym+'.dat';
aa:=''''+aa+'''';
bb:=ym+'.dat';
//***************************
userbackup.Open;
userbackup.Insert;
userbackup.FieldByName('userno').asinteger:=useno;
userbackup.FieldByName('backuptime').asstring:=thistime;
userbackup.FieldByName('backupdate').asstring:=datesys;
userbackup.FieldByName('backupfilename').asstring:=bb;
userbackup.FieldByName('backuptype').asstring:='完全备份';
userbackup.Post;
try
dmmain.dbXin.ApplyUpdates([userbackup]);
except
messagedlg('备份不成功!请检查。',mtInformation,[mbok],0);
raise;
abort;
end;
if xinbackup.Active then xinbackup.Close;
xinbackup.SQL.Clear;
xinbackup.sql.Add('backup database sununit to disk=');
xinbackup.SQL.Add(aa+'with INIT');
xinbackup.ExecSQL;
end;
我说的方法也使用的BDE, book523(笑问) 兄说得完全对
另外,你的联列无需一定要连接到master数据库,其他任意一个数据库都可以。