发信人: 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]
  | 
 
 
 |