Chinaunix首页 | 论坛 | 博客
  • 博客访问: 432895
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: Sybase

2008-06-17 22:59:25

数据库系统

相对于DB2ORACLEINFORMIX数据库系统,SYBASE系统的数据库日志实现比较独特,日志文件在逻辑上是作为数据库的一个表而存在。创建数据库时,如果没有为日志指定单独的设备,日志将和数据一起存放在相同的设备上。SYBASE公司强烈建议用户将数据库的日志和数据分开存放。

SYBASE系统可用的日志模式属于归档日志模式,尽管它仅仅使用了一个日志表来存放日志记录。数据库系统在最初运行时,从数据库日志表的起始部分开始,依次向下记录事务的更新日志。在达到日志表的结尾时,日志表中没有空间可以用来登记事务的更新日志,数据库的事务处理就被挂起。这时数据库管理员必须备份数据库日志。对日志的备份,就是从日志表的起始部分开始,找到所有不再活动的日志记录,归档这些日志记录并从日志表中删除。在日志的备份操作完成之后,数据库系统就返回到日志表的起始位置,继续记录事务的更新日志,数据库的事务处理就继续进行。在下一次日志表被写满后,这时的日志备份就从上一次备份操作的后面开始,循环在日志表中找出所有不再活动的日志记录进行归档进而释放空间。SYBASE系统就是这样周而复始地使用数据库的日志表。

当然,用户应当定期执行数据库日志备份,不要等到事务处理被挂起时才开始进行。在备份日志时,用户可以根据需要,只是清除不再活动的日志记录,而不将它们归档保存。

SYBASE系统的这种将日志和数据同时存放在数据库中的实现方式,总让人对系统的可靠性产生怀疑,这就好象将保险柜的备用钥匙也锁在保险柜中一样。在现有钥匙丢掉之后,需要使用备用钥匙打开保险柜,却发现备用钥匙取不出来。我们知道,数据库日志保证了数据库的数据一致性。在数据库遭到破坏后,使用数据库备份、加上从备份操作开始一直到故障发生时的所有数据库日志,就可以将数据库恢复到故障发生的那一时刻。但对SYBASE系统来说,数据库被破坏之后,日志表中仍旧处于活动状态的日志记录肯定不会被备份。使用数据库备份进行恢复,自然会将日志表中还没有被备份的日志记录所覆盖。

好在SYBASE公司已经对这个问题提供了解决方法。在数据库失败、恢复数据库之前,用户可以使用带with no_truncate选项的dump transaction命令,备份失败数据库当前的日志记录。该命令使用master系统数据库中的空间分配信息,直接访问已损坏数据库的日志磁盘空间。由于该命令跳过了数据库而直接访问磁盘,因此只能在数据库遭到破坏后使用。对处于正常状态的数据库使用此命令,可能会破坏现有数据库。此外,该命令能否执行成功,还取决于以下的两个条件:

1master系统数据库可以正常访问

2)失败数据库的日志和数据分开存放在不同的设备上

在一些资料中,对已损坏数据库的处理,建议使用bcp命令,将数据库中所有的数据导出来,存放在文本文件中。在数据库重建后,再导入数据。这种做法是一种舍本逐末的方法,同时也存在很大的缺陷。一来导出过程可能要花费很长的时间;二来部分数据可能无法导出。只是将部分数据导入重建后的数据库,无法保证数据库的数据一致性,除非用户有办法手工恢复已经丢失的数据。

 

1. 不生成数据库日志

 

在特殊情况下,要提高数据库系统的处理速度,可以使事务的更新处理不产生日志信息。在SYBASE系统中,既不能对整个数据库,也不能对单个表进行设置,使它们处于不记日志模式。SYBASE系统中的更新操作都要产生日志信息。

在向表中装入数据时,可以设置数据库的select into/bulkcopy/pllsort选项,使用bcp工具的快速装入方式,减少日志信息的生成,提高数据插入速度。要删除一个表中的所有记录数据,可以首先移走整个表,然后重新创建该表。更好的方法是使用truncate table命令,该命令删除表中的所有记录,不会生成日志信息,在保留表结构的同时回收表所拥有的磁盘空间。

 

2. 日志文件的归档

 

SYBASE系统只有一种日志模式,即归档日志模式,系统循环地使用数据库的日志表。日志表中的空间再次被使用前,日志信息必须被归档。对于数据和日志分开的数据库,可以使用命令dump transaction备份事务日志,并将不活动的部分从系统中删除。而对于数据和日志混合存放的数据库,只能使用命令dump transaction删除事务日志而无法单独归档备份。对关键的用户数据库,一定要将数据和日志分开存放。

对日志信息的归档,可以采用自动和手工两种方式。

1)手工归档。定期使用dump transaction命令归档数据库日志,可以保存、也可以不保存日志信息。

2)自动归档。可以设置数据库属性,使数据库在执行检查点操作时,自动清除日志。也可以使用sp_threshold命令,为数据库日志的空间使用设定界限值以及相应的脚本程序。在日志表的空间使用达到设置的界限值后,相应的脚本程序就自动执行,从而达到备份、清除日志的目的。

对日志信息自动或者手工归档方式的具体实现,可以参看第9章。

 

3. 长事务的处理

 

SYBASE系统的日志表不能够自动扩充,因此无法保证总是有足够的日志空间,使长事务顺利完成。管理员可以根据需要,为日志表分配更多的磁盘空间。此外,在长事务执行过程中,应不断地归档日志,释放日志空间。比较好的做法是让系统自动归档日志,手工归档方式往往是系统被挂起之后,才会引起用户的注意。

阅读(1032) | 评论(0) | 转发(0) |
0

上一篇:7.5 本章小结

下一篇:7.4.2 ORACLE数据库系统

给主人留下些什么吧!~~