Sybase数据库:日志过大导致不能启动
2008-03-27 15:09:07 来源:WEB开发网三、日志的清除
随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
dump transaction with truncate_only
dump 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
go
dump 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”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。
更多精彩
赞助商链接