分类: Sybase
2006-12-24 14:43:37
SQL SERVER的日志达到一定程度时,会阻塞其它事务的处理,在九七工程项目的维护过程中,曾多次出现日志溢出导致系统的瘫痪。引起日志溢出的主要原因有:
1:系统管理人员没有及时清除日志。SQL SERVER在缺省值下,必须定期备份数据和日志,日志不能自动的清除。
2:由于执行非法的语句,如执行一条ute语句,由于条件出错,导致无限量的产生日志,直到系统死机。
日志问题的解决办法
针对不同的错误原因,错误的严重性,采取不同的解决办法:
1:由小的事务引起日志溢出,系统能正常启动。
解决办法:
扩大数据库日志空间:
alter database 数据库名 on 设备名=数量(M为单位)
sp_logdevice 数据库名,设备名
清除日志
dump transaction 数据库名 with no_log(no_truncate)
2:由大的事物引起日志溢出,系统较长时间内无法正常启动或数据库无法恢复
解决办法:
等待。
较长的事务恢复时间较长,在无锡,有一次由于用户执行一条更新用户信息的SQL语句,由于使用错误的关联条件,导致日志溢出,恢复
日志花了14小时。日志恢复完成后,一般系统就可正常运行。
强行清空日志。
在实在无法恢复数据库或有近期备份的情况下,可采用强行清空日志的方法。采取这种方法的后果有可能彻底破坏数据库。执行步骤如下:
Ⅰ 以-v 方式启动SQL SERVER(不检测日志)
Ⅱ 修改数据库状态为-32768(阻塞状态)
update sysdatabases set status=-32768 where name=数据库名
Ⅲ 授权sybase_ts_role权限(sybase_ts_role为SQL SERVER特殊
管理员权限,在日常的数据库管理中,不需要这个角色)
sp_role “grant”,”sybase_ts_role”,sa
set role “sybase_ts_role”
Ⅳ 清除日志
dbcc rebuild_log(数据库名,1,1)
完成以上步骤后,重新启动SQL SERVER即可。如果数据库能正常启
动,数据库就恢复完成;如果无法启动,只能重新创建数据库。
避免产生日志溢出的方法有:人工方法和自动方法。
人工方法:根据执行任务量的不同,定期备份日志和清除无用的日志,尽量增加日志可用的空间。优点:安全,数据库被破坏时,能恢复到上次备份的日志时为止。缺点:需人工操作,长时间不备份日志或执行非法的语句,有可能导致日志溢出。
自动方法:通过数据的阀值,可实时控制日志的溢出。优点:不会产生日志溢出。缺点:日志有可能会丢失,增大数据库处理的负担。阀值创建方法如下:
1:创建段
sp_addsegment 段名,数据库名,设备名
相关过程:sp_helpsegment,sp_dropsegment
2:创建阀值
sp_addthreshold 数据库名,段名,空闲空间,执行过程名
相关过程:sp_helpthreshold,sp_modifythreshold,sp_dropthreshold
创建阀值之后,当日志空闲空间达到阀值定义的空闲空间时,SERVER自动激活阀值定义的过程名。该存储过程对日志进行处理。以下以最简单的处理过程为例说明。
Create procedure sp_thresholdaction
@dbname varchar(30),
@segmentname varchar(30),
@space_left int,
@status int
as
dump transaction @dbname to tapedump1
print “LOG DUMP:’%1!’ for ‘%2!’ dumped”,@segmentname,@dbname
/* 备份日志到磁带,然后打印备份的段名,数据库名 */