数据库备份是一项需要定期和重复进行的工作。那么有什么方法实现对数据库的自动备份呢?其实方法有很多。下面介绍笔者平时使用的、简单而容易实现的、针对本地网监控系统Sybase数据库备份方法。
1 全量备份方案
(1)传统方法:使用Sybase的BackupServer(备份服务器)进行Dump备份
转储数据库(DumpDatabase)就是为整个数据库(数据、表结构、触发器、游标、存储过程、事务日志等)进行一次物理备份。转储数据库时,系统自动执行一次CheckPoint,即将日志和数据从缓冲区拷贝到硬盘(只拷贝脏页),把已被分配的页(日志和数据)转存到设备。操作时首先保证BackupServer已经启动。如果没有启动,则可以通过以下命令启动备份服务。
Startserverf/u/Sybase/backupserver
备份数据库的命令格式为:dumpdatabase数据库名to 设备文件名 with 参数
如果把文件备份到硬盘,可以不预先估算备份文件的大小,只要硬盘有足够的存储空间就可以了。如果备份到dds磁带,那么就要估算一下备份后的文件大小,90m的dds磁带压缩存储空间为
4GB,120m的磁带压缩存储空间为8GB。如果数据库的备份文件超过了这个尺寸,就要考虑多文件转储,此时要使用stripe参数。命令格式为:
dumpdatabase数据库名to 设备文件名1
stripeon设备文件名2
stripeon设备文件名3……
with参数
这种数据备份方式是将整个数据库的运行环境完整地复制一份,包括数据库的脏页和碎片,在使用load命令恢复时,只能恢复到同样大小的数据库中(数据和日志的大小都只能与原来的完全一致)。该方法适用于每半年一次的日常备份,其优点是数据库完整无误,缺点是不能直接查看备份内容。笔者咨询过Sybase工程师,他建议一般不要使用dds备份方法,因为该方法在恢复过程中对dds的要求比较高,出现任何问题都不能完整恢复成功。笔者在实践中就出现过这样的问题,其实实现自动实现备份只需要制作一个可执行文件就可以了。
(2)使用Sybase工具备份方案
一般情况下,实际数据库都比较大,具体操作时可按数据结构和数据记录进行两次备份。
①数据结构备份。利用在Windows的SybaseCentral平台产生整个数据库服务器的所有信息。如果选择GenerateDatabaseObjects ddl则产生所选定数据库的信息,以Master库为例,将会形成一个脚本文件,对Master数据库结构进行系统备份,包括创建新的Master数据库,形成一个后缀为sql的文件,可以通过对该文件的倒入实现备份数据库结构的恢复。
②数据记录备份。将数据库各表以Sybase自带的bcp(bulkcopy)工具的方式生成一定格式的文本文件,该命令的位置一般在安装Sybase的目录下。如果把Sybase安装在C盘,那么该执行文件就在c:\sybase\bin下。
命令格式为:
bcp表名out路径名 文件名 -t 分隔符 r分隔符 -U(用户名)-P(密码)-S(服务器名)-c
如果想针对每个表进行一次bcp,一般情况下,一个数据库有许多个表,工作量比较大。此时可以利用数据库中的sysobjects系统表信息做一个bcp备份脚本,原理是每个用户表在系统表sysobjects中都有信息记载,可以通过iSQL语句查询得到。针对本地网监控系统的数据库,该方法举例如下:
l先编辑一个名为bcpout.sql的文件,内容如下:
useswdb
go
select"bcpswdb..."+ name + " out d:\backup\all\" + name +
".bcp-Usa-P*** -Sswdb -r'@@@' -t'$$$' -c" from sysobjects where type="U"
go
exit
此时将BCP的文件指定输出到d:\backup\all,形成后缀为bcp的文件。type=“U”的意思是为所有用户定义用户数据库表。因为Sybase本身是以TAB符号作为分割的,“-r‘@@@’-t‘$$$’”的意思是从@@@开头,遇到$$$就代表行结束,以防止表本身出现含有TAB符号。
l制作一个start.bat文件,文件内容为:
isql-Usa-P*** -Sswdb -i bcpout.sql -o bcpout.bat
l执行start.bat文件,得到bcpout.bat,对bcpout.bat文件稍做修改,执行bcpout.bat,导出数据文本。
③实现数据库的自动备份。在远端联机的计算机在Windows系统下指定一个定时执行的任务。此时可以参考Windows中的帮助来实现:可以定义在一个数据库比较空闲、监控系统使用相对较少的时间段来执行,因为bcp虽然在数据库中不产生日志文件,不会对数据库的运行速度产生很大的影响,但一样要影响到数据的传输,还可能造成生产人员查询数据库的时间延长。
2 对关键表的备份
上面只是对数据库的全量备份,能不能对部分增量变化较大,同时也很重要的数据库表进行按时间段自动备份呢,答案是肯定的。
如果需要备份2006年10月话务中的目的码数据,需要备份的数据表为HW_MDM(目的码话务),则应采取以下方法。
(1)制作一个createview.sql文件,创建一个名字为hw_mdm_20061031的视图,具体内容如下:
Useswdb
Go
createviewhw_mdm_20061031as select * from hw_mdm where tjqssk >="2006-10-1 00:00:00" and tjqssk <="2006-10-31 23:59:59"
go
exit
(2)制作一个dropview.sql文件,用来删除刚才创建的视图。
Useswdb
Go
Dropviewhw_mdm_20061031
Go
exit
(3)制作一个bcpoutmdm.bat可执行文件,内容如下:
c:\sybase\bin\isql-Usa–
-P***-Sswdb-ic:\sybase\createview.sql
c:\sybase\bin\bcpswdb...hw_mdm_20061031outd:\backup\hw_mdm_20061031.data -Usa -P -Sswdb -r'@@@' -t'$$$' -c
c:\sybase\bin\isql-Usa–
-P***-Sswdb-ic:\sybase\dropview.sql
(4)通过使用Windows自动执行计划功能的方法,制作一个自己定义的时间来备份该数据库表的计划任务。
利用以上全量备份和表备份方法能够简单地实现数据库的自动备份。这样既能减轻数据库维护人员的工作量,也能在不影响系统运行质量的前提下,保障系统备份数据的完整,满足系统安全和用户数据安全的需要。