服务器 频道

Sql的日志维护

  【IT168 服务器学院】数据库系统管理主要包含如下内容:

  1:日志管理

  日志问题产生的原因

  日志问题的解决办法

  2:一致性校验

  3:审计管理

  1 日志的管理

  日志问题产生的原因

  SQL SERVER的日志达到一定程度时,会阻塞其它事务的处理,在九七工程项目的维护过程中,曾多次出现日志溢出导致系统的瘫痪。引起日志溢出的主要原因有:

  1:系统管理人员没有及时清除日志。SQL SERVER在缺省值下,必须定期备份数据和日志,日志不能自动的清除。

  2:由于执行非法的语句,如执行一条update语句,由于条件出错,导致无限量的产生日志,直到系统死机。

  日志问题的解决办法

  针对不同的错误原因,错误的严重性,采取不同的解决办法:

  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

  /* 备份日志到磁带,然后打印备份的段名,数据库名 */  

  2  一致性的检测

  数据库如果经常非正常的shutdown可能引起数据的错误;长时间的运行有可能导致索引等错误。直接后果是运行速度明显下降、无法利用BCP备份数据(BCP执行结果错误)。此外还会影响物理空间的分配。数据库的检测可采用数据库提供的过程执行,最重要的一个过程如下:

  1:dbcc checkcatalog(数据库名)

  检查系统数据表中数据的一致性问题,如验证syscolumns表中的某个类型包含systypes表中的一行等。 

  2:dbcc checkdb(数据库名,skip_ncindex)

  检查数据库中的每个表的空间分配情况,在数据转储时,可采用带

  skip_ncindex参数的方法加快表的检查速度。

  3:dbcc checktable(表名)

  检查每个表的分配信息,包含如下内容:页面连接、索引排序、指针的一致性、每页上的数据行在对象分配映射(OAM)页的入口。

  4:dbcc checkalloc(表名|数据库名,full,nofix)

  检查核实是否所有的页都被正确的分配,未分配的页是否也不是页面链的一部分,以及不属于页面链部分的页是否也未标记被分配了。

  除了对已分配的页面进行检查外,checkalloc也检查数据库中所有分配页,以确保它们包含有效的信息。 

  3 审计管理

  审计系统是作为SYSTEM10发行的一部分引入的。使用审计主要原因有:

  1:检测数据库对象访问的信息;

  2:跟踪SQL SERVER中的潜在热点或怀疑问问题的区域使用信息;

  3:监控存储过程的使用信息;

  4:收集表的选择、插入、更新和删除的特定数据来确定变更率;

  5:监控特定的用户的活动。

  除了以上正常审计的功能外,审核校验还提供了分析应用程序的捷径,主要表现在以下几个方面:

  1:分析语法结构。我们目前很多应用系统采用PB开发,数据的显示和操作利用SYBASE公司的专利検荽翱凇N朔治鍪荽翱诘挠锓ǎ刹捎?/FONT>PB的断点调试方法,这种方法得到的结果无法直接保存,不易管理,采用审计方法可记录用户的操作全过程。方法如下:采用特定的用户登录,对该用户设定全程审计,浏览sysaudits表即可查看执行的全过程,包括执行的语法,执行时间等。

  2:优化程序,特别是复杂的SQL和存储过程。在审计结果表中,通过分析优化过的SQL语句,我们可以分析到SQL使用的索引、SQL执行所花的时间,存储过程的执行方案。利用这些数据我们可以分析表索引建立的合理性,存储过程编写合理性等。

  3:表的利用率。通过一段时间的审计,可以得到所有表操作的频繁度,SQL SERVER可以利用CACHE等技术,把频繁使用的表调到内存,减少I/O操作,提高系统的整体性能。

  4:系统维护的管理。对表数据的修改也许涉及到系统的多个地方,需要对表结构进行修改时,可能会遗漏导致系统的错误。通过对表的审计,记录所有与该表有关的所有功能,可以提前发现问题、解决问题。

0
相关文章