Linux平台下Sybase数据库备份的方法分析

2018-06-07 06:48刘君尧王辉静刘云霞
无线互联科技 2018年1期

刘君尧 王辉静 刘云霞

摘 要:对于从事信息系统管理的人员来说,掌握数据库的备份方法在工作中尤为重要。当本地数据出错或者磁盘损坏时,可以利用备份的数据恢复数据库系统,从而保证系统的正常运行。文章以Linux平台下的Sybase数据库为例,给出两种不同备份的实现方法。

关键词:Linux平台;Sybase;数据库备份

对于从事信息管理系统的人员来说,掌握数据库的备份是必备的技能。当本地数据出错、人为误操作或者磁盘/文件损坏时,可以利用备份的数据进行恢复,从而保证系统的正常运行[1]。本文以Linux平台下Sybase数据库的备份为例,给出两种备份的实现方法,并对这两种方法实现的操作专业程度、时间性能、可扩展性等方面进行比较说明,以供信息系统管理人员进行相应管理操作使用。Linux平台下Sybase数据库备份的方法主要有两种:(1)整库二进制备份;(2)整表文本备份。下面针对这两种备份方法进行详细描述,并给出客观的对比结论。

1 整库二进制备份恢复

1.1整库二进制备份

整库二进制备份主要采用转储数据库的方式进行,就是为整个数据库(包括数据、表结构、触发器、游标、存储过程、事务日志等)做一次完整的物理备份。

Sybase进行数据库转储时,Sybase系统自动执行一次Checkpoint(所谓的Checkpoint是将日志和数据从内存缓冲区写入到硬盘中(只针对改动过的数据进行写入,即脏页写入),把己被分配的日志页和数据页也写入到磁盘中,确保进行数据库转储时数据的正确性。 通过整库二进制备份,可以将整个数据库的运行环境完整复制一份,包括数据库的结构、脏页和碎片,在使用load命令恢复时,只能恢复到同样大小的数据库中(数据和日志的大小都只能和原来完全一致),可以确保真正地还原,恢复后数据库准确无误。

可以采用如下的方式进行Sybase的整库二进制备份:使用Sybase数据库提供的isql命令登录数据库服务器,并使用dump命令进行备份。具体的命令实现为:

dbuser> isql -S{DBServerName)-U{username) -P{password)

dump database {dbname) to “path/filename” withcompression={level)

dump transaction {dbname) to“path/filename"

go

其中“path/filename”为备份出来的文件放置的目录以及文件名。compression为备份时是否进行压缩,取值范围:0-9以及100或者101。其中0表示不压缩,9表示最高压缩比进行压缩。100表示提供更快速度的压缩;101表示提供压缩比更高的压缩,一般根据磁盘的情况以及压缩的时长,来决定具体的压缩等级。

1.2整库二进制恢复

整库二进制恢复可以将整库二进制备份方式下备份出来的数据库物理备份进行恢复。采用整库二进制恢复,可以确保数据库恢复到备份时的情况,包括数据库结构、数据、页和碎片等。整库二进制恢复在进行恢复前,需要确保要恢复的数据库设备存在,并且要比备份的容量相等或者更大。以便可以完整地进行物理恢复。整库二进制恢复分3步进行。

第一步:创建准备恢复的数据库设备(包括数据设备和日志设备)以及数据库。

可以采用如下命令,创建恢复所需的数据库设备:

dbuser> isql -S{DBServerName)-U{username) -P{password)

disk init name=datadev, physname=/opt/Sybase/data/datadev.dat. size=150m'

disk init name=logdev, physname=/opt/Sybase/data/logdev.dat, size=300m'

go

datadev为数据设备,用于放置实际的数据;logdev为日志设备,用于放置日志数据,disk init命令用于创建数据库所需的数据设备和日志设备。上面命令表示,创建一个数据设备,容量大小为150 M,设备名称为datadev;创建一个日志设备,容量大小为300 M,设备名称为logdev。

可以采用如下命令,创建恢复所需的数据库:

dbuser> isql -S{DBServerName)-U{username) -P{password)

create database dbname on datadev=150m' log onlogdev=300m

go

上面的命令表示,在数据设备datadev以及日志设备logdev(这两个设备由disk init命令创建)上创建数据库dbname,数据库大小为:数据容量大小150 M,日志容量大小300 M。创建的数据库容量(包括数据容量和日志容量)以及数据库用到的数据设备、日志设备数量、大小,都要與备份的数据库保持一致。

第二步:进行物理恢复,可以采用如下命令,在第一步创建的数据库上进行数据恢复。

dbuser> isql -S{DBServerName} -U{username}P{password}

load database dbname from "path/filename"

go

上述命令表示从path/filename备份文件中,将数据直接导入到数据库dbname。

第三步:激活数据库,可以采用如下命令,在第二步导入数据库后进行数据库激活。

dbuser> isql -S{DBServerName)-U{username) -P{password)

online database dbname

go

2 整表文本备份恢复

2.1整表文本备份

整表文本备份主要采用文本导出的方式,将数据库中数据表的数据,按照csv格式导出为文本文件。整表文本备份只能进行数据表的数据的备份,无法将数据库结构、页面信息、数据库日志等信息导出。

整表文本备份,可以使用Sybase数据库提供的bcp命令进行,具体的命令实现为:

dbuser> isql -S{DBServerName)-U{username) -P{password)

use dbname

go

checkpoint

90

quit

dbuser>bcp {tablename) out “path/filename" 一c -t{字段间隔符)-r{记录间隔符)-S{DBServerName) -U{username)-P{password)

默认的字段间隔符为\t;默认的记录间隔符为\n。如果表中字段本身有\t\n等特殊字符,可以采用较为复杂的字符串作为字段间隔符或者记录间隔符,以避免出現恢复失败。

如果要对整个数据库进行备份,需要对数据库中所有的数据表逐个执行bcp命令进行备份,可以用一个命令来生成备份的语句,实现对一个数据库的所有数据表进行备份:

dbuser> isql -S{DBServerName)-U{username) -P{password)

select 'bcp ‘+name+out ‘+path/filename -c -t{字段间隔符)-r{记录间隔符)- S{DBServerName) -63U{username) -P{password) from sysobjects where type='U'

go

2.2整表文本恢复

当数据库中某个数据表,或者整个数据库出现故障需要恢复时,可以采用整表文本恢复的方式进行恢复。采用整表文本恢复,需要的前提是:(1)数据库已经存在;(2)数据表已经创建,并且和备份时的字段名称、顺序完全相同。

因此,整表文本恢复需要如下4个步骤。

第一步:创建准备恢复的数据库设备(包括数据设备和日志设备)以及数据库,如果数据库已经存在,则可以跳过。具体创建数据库设备和数据库的命令,可以参考“整库二进制恢复”的内容。

第二步:创建要恢复的数据表,如果该数据表已经存在,则可以跳过。可以采用如下命令,在第一步创建的数据库上创建数据表。

dbuser> isql -S{DBServerName)-U{username) -P{password)

use dbname

90

create tabletablename}

90

创建数据表的create table命令格式如下:

CREATE TABLE table-name

{{ column-definition I table-constraint(pctfree)….)

[{ IN(ON) dbspace-name]

[ ENCRYPTED]

[ ON COMMIT{ DELETE(PRESERVE) ROWS

[NOT TRANSACTIONAL]

[ AT location-string]

[ SHARE BY ALL]

column- definition:

column-name data-type

[ COMPRESSED]

[ INLINE{ inline-length I USE DEFAULT)]

[ PREFIX{ prefix-length l USE DEFAULT)]

[[ NO] INDEX]

[[ NOT] NULL]

[ DEFAULT default-value|IDENTITY]

[ column-constraint…]

column-constraint:

[ CONSTRAINT constraint-name]{

UNIQUE[ CLUSTERED]

[PRIMARY KEY[ CLUSTERED][ASC | DESC]

[REFERENCES table-name[(column-name)]

[ MATCH[ UNIQUE]{SIMPLE[ FULL)]

[ action-list][CLUSTERED]

[CHECK( condition)

}

COMPUTE ( expression )table-constraint :

[ CONSTRAINT constraint-name]{

UNIQUE[ CLUSTERED](column-name[ ASC『DESC]….)

[PRIMARY KEY[ CLUSTERED](column-name[ASC[ DESC]….)

[CHECK( condition)

[foreign-key-constraint

}

foreign-key-constraint:

[ NOT NULL] FOREIGN KEY[ role-name]

[( column-name[ ASC[DESC]….)]

REFERENCES table-name

[(coluinn-name,.)]

[ MATCH[ UNIQUE]{ SIMPLE l FULL)]

[ action-list][CHECK ON COMMIT][CLUSTERED][FOR OLAP WORKLOAD]

第三步:刪除表中已有的数据,避免导入冲突,此步骤在表中已有数据的情况下执行即可,如果是新建的表,可以跳过此步骤。可以采用如下命令,将表中的数据清空。

dbuser> isql -S{DBServerName)-U{username) -P{password)

truncate table {tablename)

go

第四步:将数据导入,可以采用如下命令,将备份出的整表文本数据导入数据库中指定的数据表中。

bcp{dbname}.{tablename} in“path/filename”一c -t{字段间隔符)-r{记录间隔符)-S{DBServerName) -U{username)-P{password

3 两种备份方法的对比分析

整库二进制备份,可以对Sybase数据库的数据、相关的表结构和数据库事务日志都进行备份,但是备份的文件容量比较大,一般约等于数据库的真实容量(不做压缩情况下),同时由于采用整库备份(也支持数据库事务日志备份),因此,在备份效率、备份一致性以及信息完整性上有明显优势。

整表文本备份,只针对数据表中存储的数据进行备份,因此备份的文件容量较小,一般约等于数据库真实容量的20% -50%(一般文本数据,不做压缩情况下),由于采用数据表粒度进行备份,因此,可以灵活选择需要备份的内容进行备份,甚至对备份的数据进行调整和处理,同时也可以针对不同重要程度的数据表进行有差异的备份(比如不同的备份周期,重要的数据表以较短的备份周期进行备份)。但是采用整表文本备份也有明显的缺陷,如果数据库的数据表结构发生损坏,通过此备份方式将无法恢复,需要先恢复或者重建表结构;另外对于数据库中Image,Blob等二进制存储类型的数据,此方法容易产生乱码,不建议使用。

如果备份的磁盘空间比较大,建议可以两种备份方式都采用,在恢复的时候,根据具体的需要采取恢复的手段。4实验测试结果

具体的实验环境为:服务器:CPU 2*Xeon E5 4650;内存128 G;磁盘容量2T(磁盘阵列RAID l+0);操作系统:RedHat Linux 7;数据库服务器:Sybase ASE 15.7;数据库容量:约50 G; 336个数据表。实验效果如表所示,需要注意的是,不同的存储内容以及存储格式对备份时长及备份文件大小有一定的影响。两种数据库备份方法的比较如表1所示。

5结语

Linux平台下Sybase数据库备份的两种方法各有优劣势,也有不同的应用场景,信息系统管理人员在进行数据备份时,可以因地制宜,选择合适的备份方法进行数据备份。

[参考文献]

[1]王晖媛SQL Server中数据库备份和恢复方法的研究[J]计算机光盘软件与应用,2011(2):112-113