首先我们来分步骤进行,
第一步:完全备份数据库服务器上指定的数据库
procedure BackUpDataBase;
var
Path:string;
begin
try
path:=ExtractFilepath(application.exename);
with DM.cmd do
begin
CommandText:='BACKUP DATABASE official TO disk=''D:\official_001.bak''';
Execute;
end;
MessageDlg('数据库备份成功!',mtInformation,[MBOK],0);
except
MessageDlg('数据库备份失败!',mterror,[MBOK],0);
end;
end;第 2步 就是如何将数据库备份文件复制到自己的机器上,分2小步完成:
(1) 是否获得了服务器的读写权限
winexec('net use \\webserver 密码 /user:administrator',SW_HIDE); 然后再连接数据库服务器,copyD盘下的备份文件!
或者建立映射驱动,将服务器的D盘映射到自己机器上来作为一个Y盘
首先创建驱动器:
procedure CreateDriver(DriverID: string);
var
NetSource:TNetResource;
B:dword;
begin
try
with NetSource do
begin
dwType:=RESOURCETYPE_ANY;
lpLocalName:=Pansichar(DriverID);
lpRemoteName:=Pchar('\\webserver\d$');
lpProvider:='';
end; b:=WnetAddConnection2(netSource,Pchar(''),Pchar('administrator'),CONNECT_UPDATE_PROFILE);
if not (b=NO_ERROR) then showmessage(SysErrorMessage(GetLastError));
except
// Exit;
ShowMessage('无法联接网络路径');
end;
end;
这是删除映射驱动器
procedure DeleteDriver(DriverID: string);
var
dwFlags: DWORD;
errCode: DWORD;
begin
dwFlags := CONNECT_UPDATE_PROFILE;
errCode := WNetCancelConnection2(PChar(DriverID), dwFlags, true);
if (errCode <> NO_ERROR) then
Application.MessageBox(PChar(SysErrorMessage(GetLastError)), '', MB_OK);
end;当连接号数据库服务器,获得权限后,进行复制数据库备份文件
文件复制,带进度条
procedure NetFileCopy(SourceFile,MoveToFile:string;P:TProgressBar);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
AssignFile(FromF, MoveToFile);
Reset(FromF, 1); { Record size = 1 } AssignFile(ToF,SourceFile); { Open output file }
Rewrite(ToF, 1); { Record size = 1 } P.postion:=0;
P.max:=sizeof(FromF);
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
P.StepIt;
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
P.postion:=0;
end;
调用方式,
NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'\\webserver/D$\official_001.bak',PB);
或者(如果你创建的是Y)
NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'Y\official_001.bak',PB);第3步 我们在自己的机器上创建相同名字的数据库 这个很简单
procedure CreateDataBase(DataBaseName:string);
with cmd do
begin
CommandText:='IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'''+DataBaseName+''') CREATE DATABASE [OFFICIAL]';//self.RzMemo1.Text;
Execute;
end;第四步 获取备份文件中逻辑文件名对应的物理地址最关键的部分就是对备份文件进行分析,因为在备份的文件中有关于数据库存放的逻辑文件名是SQLSERVER安装目录下,如果你的机器上有这样的路径,可以复制,如果没有,则需要创建这个路径。因为备份文件中这个物理路径是不能修改的(目前我没能修改成功),所以只能按照其要求创建相同的路径。
在强制还原的时候会出现地址不符合,需要将逻辑文件名移动到物理文件名地址下,
如何获取这些路径呢
这里我将获取路径名和还原数据库一并写上
procedure CopyDatabasse(backDatabaseFile:string);
var
Conn:TADOConnection;
cmd:TADOCommand;
DataSet:TADODataSet;
LogicFilePath:string;
begin
try
with cmd do
begin
DataSet.Connection:=conn;
DataSet.CommandText:='RESTORE FILELISTONLY FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
DataSet.Active:=true;
LogicFilePath:=ExtractFilePath(trim(DataSet.Fields[1].asstring));
if not DirectoryExists(LogicFilePath) then
ForceDirectories(LogicFilePath);
CommandText:='use master RESTORE DataBase Official FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
execute;
end;
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制成功!',mtinformation,[MBOK],0);
except
on E:Exception do
begin
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制失败!',mtinformation,[MBOK],0);
end;
end;
end;做的比较粗糙,希望各位前辈帮忙改进!
第一步:完全备份数据库服务器上指定的数据库
procedure BackUpDataBase;
var
Path:string;
begin
try
path:=ExtractFilepath(application.exename);
with DM.cmd do
begin
CommandText:='BACKUP DATABASE official TO disk=''D:\official_001.bak''';
Execute;
end;
MessageDlg('数据库备份成功!',mtInformation,[MBOK],0);
except
MessageDlg('数据库备份失败!',mterror,[MBOK],0);
end;
end;第 2步 就是如何将数据库备份文件复制到自己的机器上,分2小步完成:
(1) 是否获得了服务器的读写权限
winexec('net use \\webserver 密码 /user:administrator',SW_HIDE); 然后再连接数据库服务器,copyD盘下的备份文件!
或者建立映射驱动,将服务器的D盘映射到自己机器上来作为一个Y盘
首先创建驱动器:
procedure CreateDriver(DriverID: string);
var
NetSource:TNetResource;
B:dword;
begin
try
with NetSource do
begin
dwType:=RESOURCETYPE_ANY;
lpLocalName:=Pansichar(DriverID);
lpRemoteName:=Pchar('\\webserver\d$');
lpProvider:='';
end; b:=WnetAddConnection2(netSource,Pchar(''),Pchar('administrator'),CONNECT_UPDATE_PROFILE);
if not (b=NO_ERROR) then showmessage(SysErrorMessage(GetLastError));
except
// Exit;
ShowMessage('无法联接网络路径');
end;
end;
这是删除映射驱动器
procedure DeleteDriver(DriverID: string);
var
dwFlags: DWORD;
errCode: DWORD;
begin
dwFlags := CONNECT_UPDATE_PROFILE;
errCode := WNetCancelConnection2(PChar(DriverID), dwFlags, true);
if (errCode <> NO_ERROR) then
Application.MessageBox(PChar(SysErrorMessage(GetLastError)), '', MB_OK);
end;当连接号数据库服务器,获得权限后,进行复制数据库备份文件
文件复制,带进度条
procedure NetFileCopy(SourceFile,MoveToFile:string;P:TProgressBar);
var
FromF, ToF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
begin
AssignFile(FromF, MoveToFile);
Reset(FromF, 1); { Record size = 1 } AssignFile(ToF,SourceFile); { Open output file }
Rewrite(ToF, 1); { Record size = 1 } P.postion:=0;
P.max:=sizeof(FromF);
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
P.StepIt;
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
P.postion:=0;
end;
调用方式,
NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'\\webserver/D$\official_001.bak',PB);
或者(如果你创建的是Y)
NetFileCopy(path+'\back\W'+FormatDateTime('yy-mm-dd',date),'Y\official_001.bak',PB);第3步 我们在自己的机器上创建相同名字的数据库 这个很简单
procedure CreateDataBase(DataBaseName:string);
with cmd do
begin
CommandText:='IF NOT EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'''+DataBaseName+''') CREATE DATABASE [OFFICIAL]';//self.RzMemo1.Text;
Execute;
end;第四步 获取备份文件中逻辑文件名对应的物理地址最关键的部分就是对备份文件进行分析,因为在备份的文件中有关于数据库存放的逻辑文件名是SQLSERVER安装目录下,如果你的机器上有这样的路径,可以复制,如果没有,则需要创建这个路径。因为备份文件中这个物理路径是不能修改的(目前我没能修改成功),所以只能按照其要求创建相同的路径。
在强制还原的时候会出现地址不符合,需要将逻辑文件名移动到物理文件名地址下,
如何获取这些路径呢
这里我将获取路径名和还原数据库一并写上
procedure CopyDatabasse(backDatabaseFile:string);
var
Conn:TADOConnection;
cmd:TADOCommand;
DataSet:TADODataSet;
LogicFilePath:string;
begin
try
with cmd do
begin
DataSet.Connection:=conn;
DataSet.CommandText:='RESTORE FILELISTONLY FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
DataSet.Active:=true;
LogicFilePath:=ExtractFilePath(trim(DataSet.Fields[1].asstring));
if not DirectoryExists(LogicFilePath) then
ForceDirectories(LogicFilePath);
CommandText:='use master RESTORE DataBase Official FROM DISK = '''+ExtractFilePath(application.ExeName)+backDatabaseFile+'''';
execute;
end;
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制成功!',mtinformation,[MBOK],0);
except
on E:Exception do
begin
Conn.Close;
DataSet.Close;
DataSet.Free;
cmd.Free;
conn.Free;
MessageDlg('数据库被强制复制失败!',mtinformation,[MBOK],0);
end;
end;
end;做的比较粗糙,希望各位前辈帮忙改进!
up up
upup
upup
upup
upup
Upupupupupupupup
uupupupupupupupupu
uupupupupupupupupupupu
upupupupupupupupuuupupup
upupupupupupupupupupupupupup
uupupupupupupupuupupupupupup
upupupupupupupupupupupuupupup
upupupupupupupupupupupupupuup
upupupupupupupupupupupupupu
upupupupupupupupupupupup学习中。。
\\localhost\..\backup
然後再在別的電腦上讀出來.