Chinaunix首页 | 论坛 | 博客
  • 博客访问: 361860
  • 博文数量: 71
  • 博客积分: 4691
  • 博客等级: 上校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-14 15:14
个人简介

who am i ... i'm back.

文章分类

全部博文(71)

文章存档

2014年(4)

2011年(1)

2010年(22)

2009年(17)

2008年(27)

我的朋友

分类: Sybase

2008-05-13 20:40:17


我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T -SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事 务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。

    一、SYBASE SQL Server 如何记录和读取日志信息

    SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录 到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能 完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。

    二、日志设备

    Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的 Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份?Backup 事务日志;二是防止数据库溢满;三是可以看到Log的 空间使用情况。

    所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修 改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我 们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。

    三、日志的清除

    随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:

    1.自动清除法

    开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。

    2.手动清除法

    执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:

dump transaction with truncate_onlydump transaction with no_log

    通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它 作为“最后一招”。

    以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。

    四、管理庞大的事务

    有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。

    例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务, 并执行“dump transaction”动作。

    上例中的情况就可以分成两个或多个小的事务:

update tab_a set col_a=0 where col_b>x godump transaction database_name with truncate_only go update tab_a set col_a=0 where col_b <=x go dump transaction database_name with truncate_only go

    这样,一个大的事务就被分成两个较小的事务。

    按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。



--------------
Table 1-23: Commands used to back up databases and logs
To do this Use this command
Make routine dumps of the entire database, including the transaction log.
 dump database

Make routine dumps of the transaction log, then truncate the inactive
portion.
dump transaction

Dump the transaction log after failure of a database device.
dump transaction with no_truncate

Truncate the log without making a backup, then copy the entire database.
dump transaction with truncate_only
dump database

Truncate the log after your usual method fails due to insufficient log space,
then copy the entire database.
dump transaction with no_log
dump database

Respond to the Backup Server’s volume change messages.
sp_volchanged
阅读(803) | 评论(0) | 转发(0) |
0

上一篇:sybase 12.5版本的新功能

下一篇:锁介绍

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