精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 数据库技术>>Sybase产品>>Sybase数据库自动备份与自动异地存放的实

主题:Sybase数据库自动备份与自动异地存放的实
发信人: chedong()
整理人: (1999-10-10 17:57:39), 站内信件
一.问题的提出

Sybase数据库系统已被广泛应用于各企事业单位的计算机信息系统中,其先进的
复制服
务器技术是实现数据库实时异地备份的很好途径,但该技术实现难度较大,需要
的投资
也较大,一般中小型企业用的比较少。通常数据库系统管理员每天要进行手工du
mp操
作,但几乎不进行异地备份,这不符合数据异地容灾的原则,存在着数据不安全
的隐
患。
笔者在平时数据库系统的维护管理中,摸索出一种对Sybase数据库进行自动备份
、对备
份出来的文件自动异地存放以及在异地自动进行数据库表的bcp的方法。该方法简
单容
易行,投资小,在很大程度上实现了数据的异地容灾,确保数据的及时备份,减
轻了数
据库系统管理员的工作。本文就此介绍,旨在给读者一些实用的帮助。
二.实现方法
1. 数据库的自动备份
①在Unix主机上编制dump数据库的脚本文件。
该文件由Sybase的客户端应用程序isql来调用,以实现数据库的dump操作,并返
回至
Unix操作系统。文件名为autodump.sql,存放在根目录下,文件内容如下:
dump database testdb to "/u/dumpfile.dat"
go
exit
例子中testdb为需要dump的数据库名,dump出来的文件名为dumpfile.dat,存放
在/u目
录下,exit返回至Unix OS。
②利用Unix的命令程序设计语言shell,编制一个shell程序。
该程序在指定时间点启动Sybase的客户端应用程序isql,实现数据库的dump操作
。文件
名为timerdump,存放在根目录下,文件内容如下:
rm /u/dumpfile.dat
isql -Usa -P -Ooutput.err -i/autodump.sql
at -f /timerdump 1:15am
例子中第一行表示删除上一次dump出来的文件,第二行表示启动Sybase的客户端
应用程
序isql,并运行autodump.sql脚本文件,第三行at命令在每天的凌晨1点15分循环
执行
timerdump。
③编制另一个shell程序。
在Unix系统重新启动时,自动执行该程序,以实现在指定时间点触发timerdump。
该程
序放在/etc/rc2.d目录下,文件名为:startdump,内容如下:
at -f /timerdump 1:15am
④修改timerdump和startdump文件的权限,使其可执行。
#chmod 777 /timer /etc/rc2.d/startdump
⑤重新启动Unix系统,并分别启动Sybase SQL Server和Backup Server,Unix系
统利用
at命令在每天凌晨1点15分定时启动timerdump,实现testdb数据库的自动dump操
作。

2. 数据库备份文件的异地自动拷贝和表的自动bcp
① 在异地安装一台PC机,要求如下:
l 内存≥32M,操作系统为Win95或Win98;
l 硬盘必须足够大(存放dumpfile.dat和bcp出来的文本文件);
l 能够通过网络,利用TCP/IP协议访问到Unix主机;
l 安装Sybase Open Clent for Win95/win98。
② 建立一个配置文件。
该文件存放Unix主机的IP地址,Ftp的端口号,Unix的用户名及口令,数据库备份
文件
存放的源、目的路径与名称,数据库所有需bcp的表名。文件名为:dumpfile.ini
,存放
在c:\dump目录下,内容如下:
[Server Options]
Server IP Address=100.10.10.1
Server Port=21
User Name=root
User Password=root123
Ftp Source=/u/dumpfile.dat
Ftp Target=c:\dump\dumpfile.dat
[Bcp Tables]
t1=table1
t2=table2
例子中的table1,table2为testdb数据库中需要bcp的表。
③ 利用Delphi Clent/Server Suite V4.0编制一个程序,实现数据库备份文件的
异地
自动拷贝和表的自动bcp。该程序利用了 Delphi 的Timer控件、NMFTP控件以及W
in32
API的进程创建函数CreateProcess。现对几个主要的程序片段逐一说明:
l 定时器过程。定时器Timer1的OnTimer事件调用该过程,它用来循环检测当前时
间是
否为凌晨2点15分,若是就去调用自动拷贝过程(FtpProc)和自动bcp过程(BcpP
roc)。
procedure TForm1.Timer1Timer(Sender: TObject);
var Present: TDateTime;Hour, Min, Sec, MSec: Word;
begin Present:= Now;DecodeTime(Present, Hour, Min, Sec, MSec);
if ((Hour=2) and (Min=15) and (Sec=0)) then begin
FtpProc;BcpProc; end;
end;
l Ftp登录函数。该函数从c:\dump\dumpftp.ini中取出Unix主机的有关信息,进
行Ftp
登录。
function TForm1.ConnectServer: Boolean;
var IniFile : TIniFile;
begin IniFile := TIniFile.Create(INI_FILE);
NMFTP1.Host := IniFile.ReadString('Server Options','Server IP Address'
,'');
NMFTP1.Port := IniFile.ReadInteger('Server Options','Server Port',21);

NMFTP1.UserID := IniFile.ReadString('Server Options','User Name','');

NMFTP1.Password :=IniFile.ReadString('Server Options','User Password',
'');
try NMFTP1.Connect; except begin
Result:=False;Application.MessageBox('连接务器失败!','错误',MB_OK);exi
t;
end; Result := True; IniFile.Free;
end;
l 拷贝备份文件的过程。该过程调用Ftp登录函数ConnectServer,进行Ftp登录,
登录
成功后利用NMFTP控件的download方法进行拷贝,Unix主机相当于Ftp服务器,异
地PC机
器相当于Ftp客户端。
procedure TForm1.FtpProc;
var IniFile : TIniFile;ftp_source,ftp_target,ftp_old: String;
begin IniFile := TIniFile.Create(INI_FILE);
ftp_source:= IniFile.ReadString('Server Options','Ftp Source','');
ftp_target:= IniFile.ReadString('Server Options','Ftp Target','');
if not ConnectServer then begin
Memo1.Lines.Add('★连接数据库服务器失败,中断!');IniFile.Free;exit;
end;
Memo1.Lines.Add('★开始拷贝数据库备份文件!'+ ftp_source + '->' +
ftp_target);
NMFTP1.Mode(MODE_IMAGE);
try NMFTP1.download(PChar(ftp_source), PChar(ftp_target));
except Memo1.Lines.Add('***文件复制错误!***'); end;
Memo1.Lines.Add('★拷贝数据库备份文件完毕!');
NMFTP1.Disconnect;IniFile.Free;
end;
l 数据库表的bcp过程。该过程从c:\dump\dumpftp.ini中循环取出数据库需要bc
p的表
名,利用Win32 API的进程创建函数CreateProcess,给Sybase Open Clinet for

Win95/Win98的bcp程序创建进程,实现bcp操作。
procedure TForm1.BcpProc;
var IniFile:TIniFile;str,str1:string;
SI:TStartupInfo;PI:TProcessInformation;
p_status:boolean; section: TStringList;i: Integer;
begin Memo1.Lines.Add(''); Memo1.Lines.Add('★开始 Bcp Tables !');
IniFile:=TIniFile.Create(INI_FILE);section:=TStringList.Create;
IniFile.ReadSection('Bcp Tables',section);
for i :=0 to section.Count -1 do begin
FillChar(SI,SizeOf(SI),0);SI.cb:=SizeOf(SI);SI.dwFlags:=STARTF_USESHOW
WINDOW
;
str:=IniFile.ReadString('Bcp Tables',section[i],'');str:=section[i];
str1 :='bcp testdb..'+str+' out '+str+'.txt -c -Usa -P -SSYBASE';
p_status:=CreateProcess(nil,PChar(str1),nil,nil,True,0,nil,nil,SI,PI);

if not p_status then begin ShowMessage('★ bcp 失败!'); exit; end;
WaitForSingleObject(PI.hProcess,INFINITE);
CloseHandle(PI.hThread);CloseHandle(PI.hProcess);
Memo1.Lines.Add('★bcp tele114..'+str+' out '+str+'.txt 结束');
end; Memo1.Lines.Add('★结束 Bcp Tables!');
end;
④ 生成可执行文件dumpftp.exe。把用Delphi编制的程序编译生成exe文件,存放

c:\dump目录下,并运行该程序。
至此,实现了Sybase数据库的自动备份、备份文件异地自动拷贝以及数据库表的
自动
bcp。
三.几点说明
1. 异地是指主机和PC机放在不同的建筑物内,可以是不同城市或同一城市的不同

区,但两者必须能够通过局域网或广域网相连。
2. 本文例子中的主机操作系统为SCO OpenServer 5.05,startdump必须存放于

/etc/rc2.d目录下。若主机操作系统为DEC Unix或HP Unix,则存放于/sbin/rc2
.d目录
下。
3. Sybase Backup Server必须一直启动着。
4. 可以根据实际情况,确定数据库自动备份(at命令的时间参数)、备份文件异地
自动
拷贝以及自动bcp数据库表的时间点(timer 的时间参数),但必须确保数据库备份
结束
后才能进行自动拷贝和bcp。
5. 因为数据库的不断增大,PC机的硬盘必须考虑足够大的余量。



--
如果你觉得可笑的话,那么你错了
如果你觉得不可笑的话,那么我错了

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 159.226.194.22]

[关闭][返回]