用BCP远程备份和恢复SYBASE数据库

软件世界

  SYBASE针对不同的操作系统有多种版本,但是各个版本备份的数据库文件不能通用。虽然利用SYBASE自身的远程备份恢复功能可以实现数据库迁移,而且实现方法也比较简单、安全、可靠,但它要求源服务器操作系统、数据库版本与目的服务器相同,且目的数据库容量要大于或等于源数据库的容量。本文以Sybase Adaptive Server Enterprise 12.0为例,详细介绍用BCP工具实现SYBASE数据库的跨平台远程备份和恢复。

  实现原理

  整个实现过程分为两部分:数据库结构转移与表中记录转移。

  对于数据库结构转移我们可以用DBArtisan数据库管理工具将数据库所有对象还原成物理模型,并利用此物理模型重建一新数据库结构。数据库结构建好之后先用BCP命令将源数据库中的数据导出为文本文件,再用BCP命令将数据导入到新数据库中。

  实现方法

  1.生成一个标准的数据库结构

  使用DBArtisan和POWERDESIGN等工具可以生成数据库建库脚本语句。该建库脚本只能包含建表语句(create table)等数据库DDL,不能包含其他脚本语句。以DBArtisan为例,打开DBArtisan,登录进入源数据库,打开数据库找到TABLES项,选中全部表后EXTRACT,导出生成表结构的脚本语句,存为CREATETALBE.SQL,并在第一行加上“USE 本地数据库名”,否则要是在MASTER上操作就麻烦了。

  2.导出脚本语句

  数据表和脚本文件的对应关系如下:

  aliases 对应createaliases.sql

  check constrants对应createconstrants.sql

  其他依此类推。

  提示:只生成源数据库中有的脚本语句,如果没有,我们就不必生成了。同样要在每个文件的第一行加上“USE 本地数据库名”。

  3.导出LOGINS脚本语句

  进入SECURITY下面的LOGINS,将所有的用户全部选中后导成脚本语句CRE ATELOGINS.SQL,当然要将sp_addlogin存储过程中的缺省数据库改为本地数据库名。

  4.生成远程备份和恢复数据记录BCP命令

  在SQL ADVANTAGE中执行“select"bcp 远程数据库名.."+name+" out d:\da ta\"+name+".txt -Uusername -Ppassword -S远程服务器名 -c " from sysobjects where type="U"”。其中“d:\data”为数据库记录存放的目录,可任意建。执行后会生成数据库中所有用户表的BCP备份命令行,将它保存成文本文件后改名为bcpout.bat。该文件用于数据库记录的导出。将上句中的OUT改为IN,服务器名和数据库名改为本地导出,存为bcpin.bat,该文件用于数据库记录的导入。

  5.配置本地服务器及数据库环境

  在本地安装SYBASE服务器,并建立本地数据库,数据库的大小可以比源数据库小一些,根据数据容量大小而定。当然,目前数据库是空数据库,服务器名和数据库名要与bcpin.bat中的一致。

  6.数据表记录的远程备份

  运行批处理文件bcpout.bat将远程数据表记录以文本文件的形式备份在本地计算机中。

  7.本地数据库的恢复

  依次执行下面的语句:

  ①c:\isql -Usa -P密码 -S本地服务器名 createtable.sql -o error1.txt 生成数据表结构,执行完后可以打开tableerror.txt看执行是否成功。

  ②运行bcpin.bat,将数据表记录恢复到本地数据库中,该操作只能执行一次。目前数据库还没有任何必要的约束和一致性限制。

  ③c:\isql -Usa -P密码 -S本地服务器名 create view.sql -o error2.txt

  ④c:\isql -Usa -P密码 -S本地服务器名 create constrants.sql -o error3.txt

  ⑤c:\isql -Usa -P密码 -S本地服务器名 cre ateindexes.sql -o error4.txt

  ⑥c:\isql -Usa -P密码 -S本地服务器名 cre ateprimary.sql -o error5.txt

  ⑦c:\isql -Usa -P密码 -S本地服务器名 create foreign.sql -o error6.txt

  ⑧c:\isql -Usa -P密码 -S本地服务器名 cre atetrigger.sql -o error7.txt

  ⑨c:\isql -Usa -P密码 -S本地服务器名 cre ateprocedure.sql -o error8.txt

  至此数据记录已成功导入本地数据库中。

  提示:SQL语句导入的先后顺序是不能变的,如果顺序不对执行将不会成功,如果还有其他语句按上面的方法执行,执行完毕后打开ERROR文件看是否成功执行。

  8.导入LOGINS

  执行“c:\isql -Usa -P密码 -S本地服务器名CREATELOGINS.SQL -o error9.txt”。

  现在可以打开业务软件登录试试,当然登录密码已全部改为缺省密码,至此数据库恢复成功。如果还需要用POWER BUILDER开发程序,则还需要进行下一步。

  9.更新PowerBuilder系统表

  目的是为了在PowerBuilder中的Database面板中可看到每张表的中文表名、中文列名等信息。现在数据库中已创建了五张PowerBuilder的系统表;先用BCP将源数据库中pbcatcol、pbcattbl两张表中的数据导入到新数据库对应的表中,再执行以下两条SQL语句:

  update pbcattbl set pbcattbl.pbt_tid=sysobjects.id from pbcattbl,sysobjects

  where pbcattbl.pbt_tnam = sysobjects.name

  update pbcatcol set pbcatcol.pbc_tid=sysobjects.id from pbcatcol,sysobjects

  where pbcatcol.pbc_tnam = sysobjects.name

  注意事项

  在进行数据库恢复过程中,我们要注意以下几个方面:

  1.一定要将目的数据库属性“允许选择进入/批量复制”选项勾选,恢复工作结束后再将此选项取消。

  2.要注意创建存储过程、触发器、主键及索引的SQL语句一定要在导入数据后运行。

  3.注意几个SQL语句的执行顺序。

  4.生成的存储过程如果是在本地数据库上操作一定要加上“USE 本地数据库名”。

  5.要使数据恢复更方便,可将初始化数据设备、建立数据库等操作都生成SQL语句,然后按顺序做成批处理,使数据库恢复自动化。