大家好,请教一下关于SQL Server 2005 中,使用了这样的代码来备份还原数据库啊
备份:
SQL.Add('Use Master Backup database YLEMS To Disk=:A');
parameters.ParamByName('A').Value :=DirectoryListBox1.Directory+Label6.Caption还原:
sql.Add('Use Master Restore Database YLEMS From Disk=:A');
parameters.ParamByName('A').Value:=DirectoryListBox1.Directory+Files使用了backup好像已经可以备份出来一个数据库啦,而且还是10几兆的,但是还原的时候好像不行哦,还原不进去,不知道是什么原因呢,谢谢大家
备份:
SQL.Add('Use Master Backup database YLEMS To Disk=:A');
parameters.ParamByName('A').Value :=DirectoryListBox1.Directory+Label6.Caption还原:
sql.Add('Use Master Restore Database YLEMS From Disk=:A');
parameters.ParamByName('A').Value:=DirectoryListBox1.Directory+Files使用了backup好像已经可以备份出来一个数据库啦,而且还是10几兆的,但是还原的时候好像不行哦,还原不进去,不知道是什么原因呢,谢谢大家
BACKUP DATABASE AdventureWorks
TO DISK = 'Z:\SQLServerBackups\AdvWorksData.bak'
WITH FORMAT;
GO/* Example of restoring a to the point of failure */
-- Step 1: Create a tail-log backup by using WITH NORECOVERY.
BACKUP LOG AdventureWorks
TO DISK = 'C:\AdventureWorks_Log.bck'
WITH NORECOVERY;
GO
-- Step 2: Restore the full database backup.
RESTORE DATABASE AdventureWorks
FROM DISK = 'C:\AdventureWorks_Data.bck'
WITH NORECOVERY;
GO
-- Step 3: Restore the first transaction log backup.
RESTORE LOG AdventureWorks
FROM DISK = 'C:\AdventureWorks_Log.bck'
WITH NORECOVERY;
GO
-- Step 4: Restore the tail-log backup.
RESTORE LOG AdventureWorks
FROM DISK = 'C:\AdventureWorks_Log.bck'
WITH NORECOVERY;
GO
-- Step 5: Recover the database.
RESTORE DATABASE AdventureWorks
WITH RECOVERY;
GO
restore database MyDB from disk = 'E:\TDDownload\mydb_data_backup_200904290100.bak' with replace;我常用,强力恢复大法。
restore database MyDB from disk = 'E:\TDDownload\mydb_data_backup_200904290100.bak' with replace;
这个方法,在我的程序没有打开的时候,直接使用SQL SERVER 2005 执行SQL语句可以达到了还原的目的啦,但是如果把这个语句在程序运行期间执行,或者在程序中执行,都会不行啊,在sql server 2005 就提示这样啊:消息 3101,级别 16,状态 1,第 2 行
因为数据库正在使用,所以无法获得对数据库的独占访问权。
消息 3013,级别 16,状态 1,第 2 行
RESTORE DATABASE 正在异常终止。好像是这个数据库正在使用不能还原啊,但是程序那里是打开了一些表格啊,不知这样怎样处理比较好呢?谢谢,
如果在程序那里关闭了adoconnect连接,那样aodquery就不能执行这个sql语句啦,所以不知道怎样处理比较好呢?
谢谢
//开始备份 with adoquery1 do
begin
close;
sql.Clear;
sql.Add('Backup database library to disk=:p1 with init');
parameters.ParamByName('p1').Value:=self.SaveDialog1.FileName;
try
Execsql;
ShowMessage('备份成功!!');
except
ShowMessage('备份失败!!');
exit;
end;
end; //End of 备份下面来说一下还原,还原与备份不一样,备份不需要关闭数据库,但还原就要先关闭数据库才行.第一次写的代码如下: with ADOQuery1 do
begin
Close;
SQL.Clear; SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');
SQL.Add('restore database library from disk=:p1 with REPLACE');
SQL.Add('alter database library set online with rollback immediate');
parameters.ParamByName('p1').Value := self.Edit1.Text;
try
ExecSQL;
ShowMessage('还原成功!!');
except
Showmessage('还原失败!!');
exit;
end;
end;
运行,还原成功!!但是數據庫會變爲脫機狀態,導致其他用戶不能連接。解決的辦法有两种: 一:用存储过程: 在master数据库中加入下面的存储过程if exists(select name from sysobjects where name='usp_restoredb')
drop proc usp_restoredb
go
/*
exec usp_restoredb "library","D:\dbbak.bak"
*/
create proc usp_restoredb
(
@dbname varchar(255), --数据库名字
@filepath varchar(255) --文件路径
)
as
set nocount on
--exec ('use master go')
exec ('alter database '+@dbname+' set offline WITH ROLLBACK IMMEDIATE')
exec ('restore database '+@dbname+' from disk="'+@filepath+'" with REPLACE')
exec ('alter database '+@dbname+' set online with rollback IMMEDIATE')
if @@error<>0
begin
select 'F','数据库恢复失败'
return
end
else
begin
select 'T','数据库恢复成功'
return
end运行. 然后在Delphi的调用这一存储过程,调用过程如下://注意:这时的ADOQuery1要连到master数据库,不能连到library数据库!! with ADOQuery1 do
Begin
Close;
SQL.Clear; // filename是你备份文件的路径加文件名
SQL.Add('exec usp_restoredb "Library","'+ filename+'"');
Open;
if ADOQuery1.Fields[0].AsString='F' then
ShowMessage('还原失败!!')
else
ShowMessage('还原成功!!');
end; 运行成功!且library数据库不会变为脱机! 第二种方法: 也是运行ADOQuery1来实现,不用存储过程,ADOQuery1一定要连到master数据库,否则就会让library脱机!,代码如下:begin
DataModule17.ADOConnection1.Close;//这个是连到library数据库的,所以要先断开
with ADOQuery1 do
begin
Close;
SQL.Clear; SQL.Add('use master alter database library set offline WITH ROLLBACK IMMEDIATE ');
SQL.Add('restore database library from disk=:p1 with REPLACE');
SQL.Add('alter database library set online with rollback immediate');
parameters.ParamByName('p1').Value := self.Edit1.Text; //显示备份文件的路径和文件名
try
ExecSQL;
ShowMessage('还原成功!!');
except
Showmessage('还原失败!!');
exit;
end;
end;
end; //End Of 还原数据库运行成功!library数据库被还原