Sybase数据库死锁对策数据库

2024-08-04

Sybase数据库死锁对策数据库(共11篇)

篇1:Sybase数据库死锁对策数据库

死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源,引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交。本文介绍一种处理解决这种死锁的方法。 Sybase封锁原理

数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。并发控制的任务就是为了避免共享冲突而引起的数据不一致。Sybase SQL Server并发控制的方法是加锁机制(LOCKING).

锁的类型

可申请的锁

已有的锁 S U X S ∨ ∨ × U ∨ × × X × × × Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。这三种锁的相容矩阵表如下:

×:表示不兼容。∨:表示兼容。

Sybase SQL Server是自动决定加锁类型的。一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。

锁的力度

SQL Server有两级锁:页锁和表锁。通常页锁比表锁的限制更少(或更小)。页锁对本页的所有行进行锁定,而表锁则锁定整个表。为了减小用户间的数据争用和改进并发性,SQL Server试图尽可能地使用页锁。

当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。锁定策略直接受查询方案约束,如果update或delete语句没有可用的索引,它就执行表扫描或请求一个表锁定。如果update或delete语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的页锁超过锁提升阈值,SQL Server就设法给该对象分配一个表锁。如果成功了,页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁。

锁的状态

SQL SERVER加锁有三种状态:

1)意向锁(intend)—是一种表级锁,它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据页的表上获得排它锁。

2)阻塞(blocking,简记blk)—它表明目前加锁进程的状态,带有blk后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。

3)需求锁(demand)—表示此时该进程企图得到一个排它锁。它可以防止在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。

需求锁是一个内部过程,因此用sp_lock是无法看见的。

死锁DEADLOCK

简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。

SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行,

在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。

查找死锁原因

既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步:

1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。

2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。

3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查找程序并修改之。

用sp_who获取关于被阻碍进程的信息

系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则:

◆status列显示“lock sleep”。

◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。

◆loginame列显示登录操作员。结合相应的操作员信息表,便可知道操作员是谁。

Fid spid status loginame origname blk dbname cmd

0 1 lock sleep lm lm 18 QJYD SELECT

0 2 sleeping NULL NULL 0 master NETWORK HANDLER

0 3 sleeping NULL NULL 0 master NETWORK HANDLER

……

用sp_lock浏览锁

要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server进程id号,用sp_who可以得到锁定与被锁定的spid号:

◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放, 该进程就申请互斥锁。

◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。

执行该进程后屏幕显示

Fid Spid locktype table_id page row dbname Class context

0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur

0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock

0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur

……

定位出错处

根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。

篇2:Sybase数据库死锁对策数据库

死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交。本文介绍一种处理解决这种死锁的方法。

Sybase封锁原理

数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。并发控制的任务就是为了避免共享冲突而引起的数据不一致。Sybase SQL Server并发控制的方法是加锁机制(LOCKING).

锁的类型

clearcase/“ target=”_blank“ >cccccc>可申请的锁

已有的锁SUXS∨∨×U∨××X×××

Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。这三种锁的相容矩阵表如下:

×:表示不兼容。∨:表示兼容。

Sybase SQL Server是自动决定加锁类型的。一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。

锁的力度

SQL Server有两级锁:页锁和表锁。通常页锁比表锁的限制更少(或更小)。页锁对本页的所有行进行锁定,而表锁则锁定整个表。为了减小用户间的数据争用和改进并发性,SQL Server试图尽可能地使用页锁。

当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。锁定策略直接受查询方案约束,如果update或delete语句没有可用的索引,它就执行表扫描或请求一个表锁定。如果update或delete语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的页锁超过锁提升阈值,SQL Server就设法给该对象分配一个表锁。如果成功了,页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁。

锁的状态

SQL SERVER加锁有三种状态:

1)意向锁(intend)―是一种表级锁,它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据页的表上获得排它锁。

2)阻塞(blocking,简记blk)―它表明目前加锁进程的状态,带有blk后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。

3)需求锁(demand)―表示此时该进程企图得到一个排它锁。它可以防止在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。

需求锁是一个内部过程,因此用sp_lock是无法看见的。

死锁DEADLOCK

简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。

SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行,

在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。

查找死锁原因

既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步:

1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。

2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。

3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查找程序并修改之。

用sp_who获取关于被阻碍进程的信息

系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则:

◆status列显示“lock sleep”。

◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。

◆loginame列显示登录操作员。结合相应的操作员信息表,便可知道操作员是谁。

Fid spid status loginame origname blk dbname cmd

0 1 lock sleep lm lm 18 QJYD SELECT

0 2 sleeping NULL NULL 0 master NETWORK HANDLER

0 3 sleeping NULL NULL 0 master NETWORK HANDLER

……

用sp_lock浏览锁

要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sqlserver进程id号,用sp_who可以得到锁定与被锁定的spid号:

◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh―共享锁,Ex―排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放, 该进程就申请互斥锁。

◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。

执行该进程后屏幕显示

Fid Spid locktype table_id page row dbname Class context

0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur

0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock

0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur

……

定位出错处

根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。

(责任编辑:铭铭)

篇3:Sybase数据库死锁对策数据库

1 数据库阻塞及死锁对医院管理信息系统的危害

医院管理信息系统 (HIS) 是基于现代计算机数据库技术的一套内容涵盖广泛, 流程复杂, 数据量庞大的应用程序管理系统。并且, 其要求系统具有响应速度快、可靠性高等特点。在HIS的实际应用中, 数据阻塞及死锁会给整个系统的可靠性带来很大的危害, 严重时可能造成整个系统的瘫痪。具体表现为:连接HIS数据服务的各个终端就像“死机”一样, 无法再进行任何操作, 只能由数据库管理员“解锁” (杀掉已死锁或阻塞的数据库线程) 才能恢复系统。如果被阻塞及死锁的线程过多, 可能造成无法“解锁”, 从而使数据库服务终止, 造成整个数据库系统的瘫痪。

2 数据库阻塞及死锁的原因

死锁是指在某组资源中, 2个或2个以上的线程在执行过程中, 在争夺某一资源时而造成互相等待的现象。若无外力的作用, 它们将无法推进下去, 这时就可能会产生死锁, 这些永远在互相等待的进程称为死锁线程。简单地说, 进程A等待进程B释放它的资源, 而B又等待A释放它的资源, 这样互相等待就形成死锁。死锁是一种可能发生在任何多线程系统中的状态, 而不仅仅发生在关系数据库管理系统中。

若在数据库中, 如果需要对一条数据进行修改, 首先数据库管理系统会在上面加锁, 以保证在同一时间只有一个事务能进行修改操作。如事务1的线程T1具有表Supplier上的排它锁, 事务2的线程T2具有表Part上的排它锁, 并且之后需要表Supplier上的锁。事务2无法获得这一锁, 因为事务1已拥有它。事务2被阻塞, 等待事务1。然后, 事务1需要表Part的锁, 但无法获得锁, 因为事务2将它锁定了。事务在提交或回滚之前不能释放持有的锁, 因为事务需要对方控制的锁才能继续操作, 所以它们不能提交或回滚, 这样数据库就会发生死锁。

在图1中, 线程T2需要线程T1所拥有的Supplier表锁资源, 而线程T1又需要线程T2所拥有的Part表锁资源。两者争抢锁资源互不相让, 形成了一个死循环, 所以在线程T1和线程T2之间存在死锁。

数据库中的阻塞是指当第一个事务控制锁资源, 而第二个事务需要相同的锁资源时, 将发生阻塞。其结果是:强制第二个事务等待, 而在第一个事务上阻塞。

数据库中阻塞及死锁的区别:死锁经常与正常阻塞混淆。当一个事务锁定了另一个事务需要的锁资源, 第二个事务等待获得其锁资源, 但事务一始终没有释放锁资源, 第二个事务被阻塞, 而不是被死锁。当两者争抢锁资源互不相让又彼此等待, 形成一个死循环时, 那么两者发生死锁。

3 预防和处理数据库的阻塞及死锁的方法

(1) 整个系统中访问数据表时要按照统一的顺序进行访问, 如果各子系统访问数据表时出现逆序访问, 就可能造成相互争抢锁资源从而产生死锁。

(2) 优化SQL语句, 尽量缩短访问数据库的时间, 这样可以有效提高数据访问效率, 而且也会减少阻塞及死锁的可能。

(3) 不要使用或设计与用户在事务内交互的应用程序, 因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度, 例如答复应用程序请求参数的提示。如果事务正在等待用户输入, 而用户去做别的事了, 则用户将此事务挂起使之不能完成。因为事务持有的任何锁只有在事务提交或回滚时才会释放, 所以, 即使不出现死锁的情况, 访问同一资源的其他事务也会被阻塞, 等待该事务完成。

(4) 当为了保证数据完整性而使用事务处理时, 一定要合理使用回滚与提交等语句。如果在事务处理中漏掉相应的回滚或提交, 会增加数据表堵塞或死锁的概率。

(5) 用含有sum () 、count () 、max () 等聚合函数的SQL语句访问数据库 (包括PB数据窗口检索数据) 时, 语句执行后最好要提交事务。聚合函数可能会加长占用锁资源的时间, 从而发生阻塞及死锁。

(6) 使用查询或锁定超时, 防止失控查询和避免分布式死锁。

(7) 查询不适当地使用游标。游标可能是在结果集中浏览的便利方法, 但使用游标可能比使用面向集合查询慢, 从而加大阻塞的概率。

4 遇到的实际问题和解决方法

4.1 遇到的实际问题

在实际编程中, 本人也遇到了数据阻塞的问题。当时, 在门诊收费的过程中需要在一个两层循环中检索不同科室表的费用明细。新的收费程序实施后, 时常发生争抢科室表资源而造成阻塞甚至死锁的情况。当时医院共有17个门诊收费窗口, 每个收费过程中需要检索或修改十多个数据表, 同时控制6个事务对象。如此频繁访问数据表使得程序访问数据库的时间被拉长, 从而加大了阻塞的概率。更为棘手的是, 大量检索明细数据的任务需要在开始更新科室数据表收费状态标志之后完成, 检索使用的数据窗口中还含有带聚合函数的数据列, 这就意味着很多相关数据行会加上共享锁或排它锁, 无形中又加重了阻塞的可能。

4.2 解决方法

经过反复思考, 最后决定分为3个步骤改进:

(1) 把大量检索科室明细数据的任务放在收费进程开始的位置。虽然检索的数据量并未减少, 但是减少了之前与相关已被修改数据表相互争抢资源的可能性。所付出的代价是需要提前计算出票据的数量和相关的数据, 这样的代价是值得的。

(2) 检索费用明细数据后, 先提交一次事务对象。这样做的好处是把整个数据访问的进程分为2部分, 变相地缩短了事务访问数据库的时间, 从而降低了发生死锁和阻塞的概率。

(3) 对相关数据窗口添加侦测阻塞和死锁的功能代码, 尽可能做到早检测早处理。PB提供了数据窗口的dberror事件, 可利用它进行处理。相应代码如下:

经过以上改进, 之前发生的阻塞、死锁等问题得到了有效的解决。经过合理地调整程序结构, 以及优化数据库访问代码是可以有效防止数据阻塞及死锁现象发生的。

参考文献

[1]Michael Otey, Paul Conte.SQL Server2000开发指南[M].陈恩义, 译.北京:清华大学出版社, 2002.

篇4:sybase数据库恢复

load database 数据库名 from 转储设备名/物理文件名

load transaction数据库名 from 转储设备名/物理文件名

●利用备份恢复数据库举例:

某数据库数据和日志分别存储在两个独立的磁盘上,正常运转时的执行的备份计划如下,每天的17:00执行整个数据库的备份,每天的10:00、12:00、14:00、16:00点执行增量备份:

周一17:00磁带1(100M)周二10:00磁带2(30M)周二12:00磁带3(30M)周二14:00磁带4(30M)周二16:00磁带5(30M)周二17:00磁带6(30M)

DumpdatabaseDumptransactionDumptransactionDumptransactionDumptransactionDumpdatabase

若数据磁盘在周二的下午六点损坏,可以采用如下步骤恢复数据库:

(1)使用dump transaction with no_truncate获得当前的事务日志转储,磁带7;

(2)使用load database最新的数据库转储,磁带6;(offline)

(3)使用load transaction提交最新的事务日志转储,磁带7;

(4)使用online database把数据库状态设置为online,

若数据磁盘在周二的下午4:50损坏,恢复过程如下:

(1)使用dump transaction with no_truncate获得当前的事务日志转储,磁带7;

(2)使用load database转载最新的数据库转储,磁带6;(offline)

(3)使用load transaction依次装载磁带2、3、4、5上的事务日志;

(4)使用load transaction提交最新的事务日志转储,磁带7;

篇5:SYBASE数据库日志详解

一、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_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

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

篇6:Sybase数据库函数库

而就用户观点 Sybase 和 MS SQL Server 6.x 也是几乎相同的。当然 MS SQL Server 7.0 之后的差异就比较大了。

sybase_affected_rows: 取得最后 query 影响的列数。

sybase_close: 关闭与数据库的连接。

sybase_connect: 连上数据库。

sybase_data_seek: 移动列指针。

sybase_fetch_array: 返回数组资料。

sybase_fetch_field: 取得字段信息。

sybase_fetch_object: 返回类资料。

sybase_fetch_row: 返回单列的各字段。

sybase_field_seek: 配置指针到返回值的某字段。

sybase_free_result: 释放返回占用内存。

sybase_num_fields: 取得返回字段的数目。

sybase_num_rows: 取得返回列的数目。

sybase_pconnect: 打开服务器持续连接。

sybase_query: 送出一个 query 字符串。

sybase_result: 取得查询 (query) 的结果。

sybase_select_db: 选择一个数据库。

sybase_affected_rows

取得最后 query 影响的列数。

语法: int sybase_affected_rows(int [link_identifier]);

返回值: 整数

函数种类: 数据库功能

内容说明: 本函数用来取得最后一次对数据库下 query 指令所影响的列数,会影响的为 INSERT、UPDATE 或 DELETE 等指令,而 SELECT 不会影响。参数 link_identifier 可省略,为打开数据库的连接代号。返回值即为列数。

sybase_close

关闭与数据库的连接。

语法: boolean sybase_close(int link_identifier);

返回值: 布尔值

函数种类: 数据库功能

内容说明: 本函数用来关闭与 Sybase 数据库的连接,能关闭的为使用 sybase_connect 函数打开的数据库,若使用 sybase_pconnect() 打开的数据库则不能以本函数关闭。参数 link_identifier 可省略,为打开数据库的连接代号。关闭成功则返回 true 值。

参考: sybase_connect() sybase_pconnect()

sybase_connect

连上数据库。

语法: int sybase_connect(string [servername], string [username], string [password]);

返回值: 整数

函数种类: 数据库功能

内容说明: 本函数用来打开与 Sybase 数据库的连接。参数 servername 为欲连上的数据库服务器名称。参数 username 及 password 可省略,分别为连接使用的帐号及密码。使用本函数需注意早点关闭数据库,以减少系统的负担。连接成功则返回数据库的连接代号,失败返回 false 值。

参考: sybase_close() sybase_pconnect()

sybase_data_seek

移动列指针。

语法: boolean sybase_data_seek(int result_identifier, int row_number);

返回值: 布尔值

函数种类: 数据库功能

内容说明: 本函数用来移动 Sybase 资料表中的列指针到指定的列上,可供 sybase_fetch_row() 等函数使用。参数 result_identifier 为查询的代号值。参数 row_number 则为欲移往的列数。若失败则返回 false 值。

参考: sybase_close() sybase_pconnect()

sybase_fetch_array

返回数组资料。

语法: array sybase_fetch_array(int result);

返回值: 数组

函数种类: 数据库功能

内容说明: 本函数用来将查询结果 result 拆到数组变量中,

若 result 没有资料,则返回 false 值。而本函数可以说是 sybase_fetch_row() 的加强函数,除可以将返回列及数字索引放入数组之外,还可以将文字索引放入数组中。

使用范例

这是 joey@samaritan.com (22-Feb-) 所提出的例子

$q = sybase_query(”SELECT COUNT(DISTINCT OPPORTUN99vY_ID) FROM M_OPP_INTERESTS WHERE INTEREST_ID = $i_id“, $db);

while ($op_by_int = sybase_fetch_arr

ay($q)) {

while (list($k, $v) = each($op_by_int)) {

echo ”$op[$k] =>$v “;

}

?>

返回资料如下

$op[0] =>2164

$op[computed] =>2164 sybase_fetch_field

取得字段信息。

语法: object sybase_fetch_field(int result, int field_offset);

返回值: 类

函数种类: 数学运算

内容说明: 本函数返回的类资料为 result 的字段 (Column) 信息。返回类的属性如下:

name - 字段名称

column_source -字段所在表格的资料表名称

max_length - 字段的最大长度

numeric - 若为 1 表示本字段为数字类型 (numeric)

参考: sybase_field_seek()

sybase_fetch_object

返回类资料。

语法: object sybase_fetch_object(int result);

返回值: 类

函数种类: 数据库功能

内容说明: 本函数用来将查询结果 result 拆到类变量中。使用方法和 sybase_fetch_array() 几乎相同,不同的地方在于本函数返回资料是类而不是数组。若 result 没有资料,则返回 false 值。另外值得注意的地方是,取回的类资料的索引只能是文字而不能用数字,这是因为类的特性。类资料的特性中所有的属性 (property) 名称都不能是数字,因此只好乖乖使用文字字符串当索引了。关于速度方面,本函数的处理速度几乎和 sybase_fetch_array() 及 sybase_fetch_row() 二函数差不多,要用哪个函数还是看使用的需求决定。

参考: sybase_fetch_array() sybase_fetch_row()

sybase_fetch_row

返回单列的各字段。

语法: array sybase_fetch_row(int result);

返回值: 数组

函数种类: 数据库功能

内容说明: 本函数用来将查询结果 result 之单列拆到数组变量中。数组的索引是数字索引,第一个的索引值是 0。若 result 没有资料,则返回 false 值。

参考: sybase_fetch_array() sybase_fetch_object() sybase_data_seek() sybase_result()

sybase_field_seek

配置指针到返回值的某字段。

语法: int sybase_field_seek(int result, int field_offset);

返回值: 整数

函数种类: 数据库功能

内容说明: 本函数配置目前的指针到返回值的特定字段中。参数 result 为返回值代码。参数 field_offset 则为指定的字段序数。

参考: sybase_fetch_field()

sybase_free_result

释放返回占用内存。

语法: int sybase_free_result(int result);

返回值: 整数

函数种类: 数据库功能

内容说明: 本函数可以释放目前 Sybase 数据库 query 返回所占用的内存。一般只有在非常担心在内存的使用上可能会不足的情形下才会用本函数。PHP 程序会在结束时自动释放。

sybase_num_fields

取得返回字段的数目。

语法: int sybase_num_fields(int result);

返回值: 整数

函数种类: 数据库功能

篇7:Sybase数据库死锁对策数据库

1 影响S YBAS E数据库性能的主要因素[2]

1.1 硬件性能

高性能的CPU为数据库提供高承载的吞吐能力,确保充分的I/O并行性,以支持大容量的并发事件;足够的内存,以支持大量并发用户所需要的缓冲池;足够大的网络带宽以支持工作负荷。

1.2 操作系统性能及参数配置

1.3 存储结构的设计

优秀的存储结构和合理的存取路径可以使系统开销最小的情况下达到最佳性能,并可提高访问速度,减少I/O竞争。

1.4 S QL语句优化

高效的SQL语句能够成倍地提高应用程序能力,对数据库操作进行跟踪,找到那些最耗资源和时间的操作,并对操作进行分析,找到优化的方法。

1.5 数据库的内存

合理配置可提高数据查询速度,减少系统I/O操作,提高数据分析和统计能力。

2 S YBAS E数据库数据统计及分析优化策略

2.1 S YBAS E系统参数调整[3]

2.1.1 内存

2.1.2 Cpu

2.1.3 网络

2.1.4 其他资源

2.2 数据库的配置的优化

2.2.1 优化master数据库

首先加大master设备空间,初始默认为30M,加大为150M。然后加大master数据库空间,默认数据段和日志段各为5M大小,建议改为数据段100M,日志段50M。

2.2.2 优化tempdb数据库

首先创建tempdb设备,分配给tempdb数据库,默认tempdb数据库数据段和日志段各为2M大小,并创建在master设备上,建议改为数据段200M,日志段50M,创建在tempdb设备上。alter database tempdb ontempdb=200

2.2.3 优化数据库系统属性

在sybase center中选择数据库属性,将属性中options选项中的下列项目选中。

2.3 索引的优化

(1)在SQL语句中order by语句中引用的列,适当建立索引

(2)基数较大的列建立索引

(3)考虑到管理上的开销,应避免在索引中使用多于5个的列。

(4)不要在索引中包含那些经常修改或经常进行插入删除的列,唯一的例外是主关键字和外来关键字。

(5)由于大量数据修改,使得数据页和索引页没有充分使用而导致空间的使用超出估算,这时需要重建索引。

2.4 S QL语句的优化

(1)由于关系表达式的语义级别很高,因此具有查询优化的可能性。当进行大批量的操作时,查询优化可以使得效率成倍提高。查询优化的一般原则有:选择运算应尽可能先做,这样可以使中间结果大大变小,使执行时间降低几个数量级;把投影和选择运算同时进行,如果它们对应同一个关系的话,这样可以避免重复扫描关系。把投影同其前后的双目运算结合起来,没有必要为去掉某些字段而扫描一遍关系。

(2)使用临时表空间,为了加速SQL查询,至少应创建一个表空间供临时段单独使用。

(3)避免不带任何条件SQL语句的使用,没有任何条件的SQL语句在执行过程中要进行全表扫描[4],需要很长时间,因此会大大降低效率

(4)限制动态SQL的使用。

(5)建立临时表表示只插入有用的数据。如果插入很多无用的数据,临时表会很大,占用空间大,统计查询效率低。

(6)避免相关子查询一个字段的标签同时在主查询和where子句中的查询中出现,因为在主查询字段值改变后,子查询重新查询一次。查询的嵌套层次越多,效率越低,因此应尽量减少子查询,子查询中的数据应尽量少[5]。

(7)避免使用‘NOT IN’这样的操作,尽量使用(NOT)EXISTS替代。

2.5 S YBAS E数据库数据统计及分析优化

结合SYBASE数据库统计和分析系统及上述的优化方法,得出对数据库的统计分析和优化方法。

(1)数据库统计与分析系统将比较大的表建立在多节点的表空间上,同时建立索引。

(2)根据不同的需求,建立不同的锁[6]。锁是并行处理的重要机制,能保持数据并发的一致性,即按事务进行处理;系统利用锁来保证数据完整性。虽然,我们避免不了死锁,但在设计时可以充分考虑如何避免长事务,减少排它锁时间,减少在事务中与用户的交互,杜绝让用户控制事务的长短;要避免批量数据同时执行,尤其是耗时并用到相同的数据表。锁的征用:一个表同时只能有一个排它锁,一个用户用时,其它用户在等待。若用户数增加,则Server的性能下降,出现“假死”现象。如何避免死锁呢?从页级锁到行级锁,减少了锁征用;给小表增加无效记录,从页级锁到行级锁没有影响,若在同一页内竞争有影响,可选择合适的聚族索引把数据分配到不同的页面;创建冗余表;保持事务简短;同一批处理应该没有网络交互[7]。

(3)sp_recompile的局限:只在当前数据库中寻找对象并且只重编译本数据库内的触发器和存储过程,对其他数据库内的依赖于被recompile的表的触发器和存储过程无效。重编译这些当前数据库以外的存储过程的唯一方法就是drop并recreate,另一个选择是建立带有with recompile选项的存储过程或在运行存储过程时加上with recompile选项,而且,重启服务器也会生成新的查询计划。

(4)查看表、视图和存储过程、触发器之间的依赖关系,在重建表或更改表之后,需要重编译有关的存储过程,而另一个数据库中的存储过程和触发器不会被自动编译。为手工编译这些存储过程和触发器,需要了解有哪些与表关联的存储过程和触发器。用sp_depends可以查明表、视图和存储过程、触发器之间的依赖关系。

(5)事务日志是结合在一起的一组数据操作,要么全部成功,要么全部放弃。用户的每一次改变会自动存储于syslogs表,以便用于自动恢复操作。Sybase会自动将一定时间内已经提交但未写入磁盘的数据写到设备上,使数据库与事务日志同步。在数据库重启时,恢复机制比较每一个数据库及其事务日志,将已经提交的事务写入数据库,撤销未提交的事务。

(6)数据库在使用一段时间后,可能会发生数据不一致的现象,这时要用dbcc命令进行检查[8]。检查应经常进行,将错误及早发现并消灭。常用的dbcc命令有dbcc checkdb:检查数据库中所有表的一致性;dbcc checktable(table_name):检查指定表的一致性;dbcc tablealloc(titles):对单个表检查分配页,OAM页,更新GAM页;dbcc indexalloc检查索引页分配。在每次备份整个数据库之前运行dbcc checkdb,dbcc checkalloc,dbcc checkcatalog。这些命令很耗时间,所以当机器不忙的时候使用。也可以把备份装载到不同的系统上,然后运行dbcc对备份进行检查。如果不能对所有的表检查,可以根据情况对重要的表运行dbcc checktable,dbcc tablealloc,dbcc indexalloc。

(7)有一类进程称作“搁浅进程”(stranded process),也称作“鬼”进程[3],这类进程可能会出现在SQL Server上而不是客户机上,通常这是由于客户机程序因死机等原因造成的。要确定一个进程是否是搁浅的,首先找到阻塞其它进程的进程号spid,然后执行:select hostname,hostprocess from sysprocesses where spid=(阻塞进程的spid)

3 结论

数据库优化受各种因素制约,需要综合各方面的要求,在基本合理的总体设计的基础上优化,力求最大限度满足用户各方面要求,实现数据库的优化设计。

参考文献

[1]王能斌.数据库系统原理[M].电子工业出版社,2005.

[2]萨师煊.数据库系统概论[M].高等教育出版社,2003.

[3]帕克.莱利,埃默森.沃夫博格,沈鸿.SYBASE系统管理指南[M].北京希望电子出版社,2000.

[4]兰金斯R.SYBASE SQL SERVER 11参考大全[M].宇航出版社,1998.

[5]袁长河.SYBASE SQL SERVER性能优化技术初探[J].计算机系统应用,2000(01):11-12.

[6]唐汉明,翟振兴,兰丽华.深入浅出MySQL数据库开发、优化与管理维护[M].人民邮电出版社,2008.

[7]姚益静.Sybase数据库优化技术和方法[J].铁路计算机应用,2008(04):14-15.

篇8:Sybase数据库死锁对策数据库

当系统使用频繁就会出现插入操作和删除操作同时进行的情况。这个时候插入事务会先将主表A放置独占锁,然后去访问子表B,而同时删除事务会对子表B放置独占锁,然后去访问主表A。插入事务会一直独占着A表,等待访问B表,删除事务也一直独占着B表等待访问A表,于是两个事务相互独占一个表,等待对方释放资源,这样就造成了死锁。

遇到这种情况我听说了三种做法:

1 取消AB两个表之间的外键关系,这样就可以在删除数据的时候就可以先删除主表A,然后删除子表B,让对这两个表操作的事务访问顺序一致,

2 删除A表数据之前,先使用一个事务将B表中相关外键指向另外A表中的另外一个数据(比如在A表中专门建一行数据,主键设置为0,永远不会对这行数据执行删除操作),这样就消除了要被删除的数据在AB两个表中的关系。然后就可以使用删除事务,先删除A表中的数据,再删除B表中的数据,以达到和插入事务表访问一致,避免死锁。

3 在外键关系中,将“删除规则”设置为“层叠”,这样删除事务只需要直接去删除主表A,而不需要对子表B进行操作。因为删除规则设置为层叠以后,删除主表中的数据,子表中所有外键关联的数据也同时删除了。

以上三个解决办法都是同事给出的建议,我也不知道到底该使用什么办法才好。

篇9:Sybase数据库死锁对策数据库

一、用备份数据库恢复:

1、用备份数据库启动

2、翻译出错数据库的日志(可能有多个文件)

3、按顺序执行翻译出的日志文件,read 文件

二、没有备份数据库

现象:

set rowcount 10

select * from table_name时数据down下

用dbvalid检查此表时报错

检查处理方法:

1、删除table_name的发布、视图

2、dbunload -c ”uid=dba;pwd=sql;dbf=d:sybdatadbname.db“ -e table_name -an d:db_newdbname.db”

3、用新数据库启动

篇10:Sybase数据库死锁对策数据库

作者:yaya

感谢:scott 大力支持

准备工作:

1、下载WinRAR3.0压缩工具(假设安装在D盘)

2、检查Sybase BCKServer(sybase备份服务)服务是否启动

3、Task Scheduler(计划任务)服务是否启动

4、创建备份用文件夹,本文以E:backup 为例

5、用记事本编写一个sql文件,文件名为backup.sql,内容如下: use master go dump database cwbase1 to “e:backupback.dat” go exit 并将此文件拷贝至D:sybase文件夹下(假设sybase装在D盘)

操作过程:

一、数据库自动备份

1、点击我的电脑-控制面板-计划任务

2、添加“计划任务”,应用程序选择D:Sybasebinisql.exe(假设sybase装在D盘)

3、选择

每天

序1

4、输入服务器系统管理员密码(进入Windows2000的密码)

5、选择打开高级属性选项

6、如图,在运行里输入isql.exe-Usa-Paaaaaa-id:sybasebackup.sql(-U是指用户,后面紧跟数据库管理员用户名,默认是sa,-P是密码,后面紧跟数据库管理员密码,目前系统默认为空,必须设置上密码,可以通过2.2版本的帐套管理修改数据库管理员密码,本文以aaaaaa为例;-i,是指路径,后面紧跟要执行的sql语句路径)

7、选择日程安排,选择一个不工作的时段启动计划任务。

自动备份功能至此结束,然后我们借用WinRAR自带的RAR工具将备份好的数据压缩并按3 照日期命名保存。

二、自动压缩并按日期命名

1、再添加一个计划任务,运行栏输入 “D:Program FilesWinRARRar.exe” a-ag-df e:backupback e:backupback.dat

2、将该任务定义为每天自动启动,要比数据库自动备份任务延迟30分钟以上。即可实现自动将备份数据库压缩并删除原文件生成以日期命名的文件。

3、定期将该文件夹下的文件刻录成光盘永久保存。

篇11:Sybase数据库死锁对策数据库

武汉协和医院作为国家卫生计生委直属的大型综合性医院,先后被评为国家首批三甲医院、全国百佳医院,医院的信息化的高速发展是必不可少的源动力。医院自从2002年建立计算机管理中心后就设置了专门的系统管理员对HIS进行管理与维护。随着医疗设备的不断发展以及医院规模的不断扩张,已经由原先的单一院区发展为现在多院区齐飞的大规模集团化医院,网络客户端数量也由最开始的100台左右发展到现在的1400台,这对HIS的管理与维护提出了严峻的考验,如何能让HIS每天在24 h无故障的安全且高效运行一直是我们极力想要达到的目标。

1 HIS的特点

为了能更好的维护HIS中Sybase数据库(美国Sybase公司研制的一种关系型数据库系统),需要对HIS的特点有一个全面的、科学的认识。正是这些特点才使得HIS中的Sybase数据库的维护难度加大,对系统管理员的要求变高, 同时对运行的硬件也提出了更高的要求。下面简单介绍一下HIS的特点。

1.1以局域网络应用为支撑环境

医院网络是HIS的基础设施,通过光纤网络可以连接不同院区,以实现不同院区之间HIS的数据互通。近年来由于移动终端的飞速发展,各医院也在大力发展医院的无线网络,以实现HIS在患者床边的操作。

1.2以数据库应用为核心

HIS每天产生的业务数据大部分都需要长期保存与应用。因此,HIS需要大规模和高效率的数据库系统作为其核心,以处理数据和提供应用服务。目前HIS使用较多的是Oracle数据库、SQL Server数据库、DB2数据库、Sybase数据库以及informix数据库等关系型数据库,这些数据库的维护与监控工作是HIS管理与维护的核心,需要每天对其有针对性的记录,才能在出现问题的时候及时的解决问题。

1.3采用C/S结构或C/中间件/S结构

C/S这种两层结构还是目前HIS常用的结构[1]。而C/ 中间件 /S这种三层结构是C/S两层结构的发展,分为表示层、功能层和数据层,其中表示层提供人机界面,用以数据输入和结果输出,功能层完成对应用的逻辑处理,而数据层作为数据库系统主要负责对数据的增、删、改、查操作。 而另一种三层结构是B/S结构,它的表示层以Web方式提供使用,用户可以使用浏览器进行输入输出。三层的结构具有更好的开放性、安全性、扩展性和可维护性,目前已经逐渐被用户所接受。

1.4系统运行的连续性

HIS是医院的业务操作平台,需要每天24 h不间断运行, 其连续性和稳定性不仅关系到医院的业务的正常运作,甚至关系到患者的生命安全,HIS的连续性和稳定性与网络、 数据库以及硬件设备和供电都息息相关。因此,所有的关键节点的设备都必须有备用和冗余,重要系统的数据库都必须要按时进行备份,如此才能在发生故障的时候在最短的时间内得到恢复。有条件最好能建立容灾中心,以便在生产环境发生严重故障时能迅速切换到容灾中心,恢复运作,减小损失,以提高HIS运行的连续性。

1.5数据保密和安全性要求高

HIS的数据涉及到患者个人隐私和医院业务机密,有严格的保密和安全要求。因此,除了强化系统安全防护能力, 防止非法入侵以及数据泄露,还必须建立完善的用户权限制度以及防护监控措施,确保病人和医院的利益。

HIS数据库具有数据的整体共享、长期保存、长期应用和持续发展以及标准化应用等特点,所以对数据库的管理与维护必须是严苛的。

2我院HIS的Sybase数据库高可用性设计介绍

我院于2014年6月更换了 新的HIS服务器、 升级Sybase数据库版本和存储空间,以满足日益膨胀的数据需求。

2.1我院HIS的基本架构与物理硬件配置

我院HIS采用的是IBM System和X3850 X5系列的机 型。CPU为Xeon E7,4颗CPU, 每颗有10个Core, 内存达到256 GB,2台服务器安装Redhat Enterprise Linux 6.4操作系统和Sybase15.7(Sybase最新版本)数据库。2台服务器分别放置在老门诊机房和新门诊的新机房,形成双机备用保护。服务器之间通过核心交换机之间的单模光纤直连进行通信。为了保障数据的安全可靠,采用2台VNX5500机通过EMC的同城双活技术VPLEX组成异地的双活统一存储资源池,每台VNX5500机都配置了40块300 GB、15000转的硬盘,此外还对老门诊的HIS服务器增加了EMC的持续数据保护CDP,将要保护的数据保存到CDP,即使当HIS发生逻辑错误的时候,也可以从独立的CDP保护磁盘空间中恢复数据。我院HIS的整个系统硬件架构,见图1。

2.2我院HIS数据库架构

我院HIS使用的是Sybase 15.7版本的数据库,正式生产库为svrmz,该数据库为日常HIS使用的业务库,所有HIS相关的业务全部在该数据库上运行,此外还有个镜像数据库为svrzy,采用的和正式库完全一致的配置。应用Sybase公司的Replication Server服务的单向复制功能,将正式生产库上所执行的所有操作通过复制队列通道按顺序复制到镜像数据库中。采用单向复制将正式库上的数据单向复制到镜像库的目的是 :首先可以作为正式库的备用数据库,当正式库出现故障的时候可以切换到镜像库上,通过Linux6.4操作系统的HA高可用组件的clusvcadm命令将正式库数据库服务直接切换到镜像库上。这个切换的过程很短 ;此外,还可以将一些与HIS相关,需要提取HIS的数据来处理的外围系统, 如医院感染信息系统、手术室追溯系统等,全均连接到镜像库上,这些应用对实时性要求并不是很高,将其连接到镜像库可以缓解正式库的压力,同时也可以降低其他应用对正式库产生影响的概率,更好的保障HIS稳定性。

3对HIS的管理与维护

武汉协和医院计算机管理中心作为武汉协和医院信息化发展的主要执行者,在医院信息化的道路上已经经历了十多年的风雨,对HIS有大量的投入与足够重视,对它的管理与维护积累了一定的经验。其中对服务器和数据库的监控与维护尤为重要,主要包括以下几个方面 :

3.1对服务器和数据库的监控

HIS的服务器及其所运行的数据库是我们系统管理员每天都需要关注的。操作系统层面的监控,包括CPU的利用率、进程数、I/O等数据。数据库监控软件所监控的内容包括无阻塞进程数据,每天产生的数据量等[2]。为此,我们需要制定完善的系统运行状态监控表,系统管理员每天要按时填写,记录HIS的运行状态。

每个医院的HIS的设计和操作都不尽相同,针对我们医院的HIS的服务器、存储和数据库,需要监控的有如下几个关键点,根据这些关键检查点可以反映Sybase数据库当前的运行情况,帮助系统管理员更好地把握数据库运行状态,并且及时的处理潜在的问题。

(1)检查服务器的最大连接数和在线进程数。这两个参数可以大致反映当前服务器的负载情况,如果连接数太高可能会导致服务器的宕机。

(2)检查数据库设备容量、实际大小、日增量和日志大小。这些参数是数据库的基本信息参数,可以反映数据库的总体情况,是否需要增加数据库设备或者日志设备等[3]。

(3)检查是否有警告日志文件(alert)。查看alert文件对数据库的监控来说十分的重要,它会在第一时间反映数据库的问题,对于有效的预防数据库的故障至关重要。

(4)查看最早进程时间。用isql命令连接到正式库上, 通过查询最早进程时间可以及时发现不完整事务,其中对应的spid命令为最早的进程,如果最早的进程开始时间距离当前时间已经非常长,如2~3 d,则可能该进程有问题, 甚至可能导致日志无法截断。确认该进程后,应该将其终止。

(5)查看数据库同步复制状态。单向复制是连接正式库和镜像库的重要通道,需要按时进行监控。用isql连接到复制服务器上,需要监控的主要有 :1用admin who,sqm来查看复制队列的事务及其运行情况,通过first seg.block和last seg.block比对,来看复制的数据块的情况 ;2用admin who,sqt来监控队列传输的情况,可以看到当前是否有事务在处理以及事务处理的状态 ;3用admin who_is_ down来监控rep agent/DSI线程是否正常,异常情况时会显示哪一个spid被挂起 ;4用admin disk_space来监控复制的分区空间使用情况,默认情况下partition空间使用超过阈值时,系统会将告警信息记录在日志文件中 ;5用admin dump_queue来查看有问题模块的实际处理的事务的语句,可以具体的了解到是什么语句造成问题。

(6)定时查看数据库备份情况。一般备份的工作都会放在计划任务里面每天定时执行,但是还是需要经常去查看备份的基本信息,如备份的起始和结束时间以及备份文件的大小,确保完备和增量备份都顺利地完成,以免实际使用时出现备份文件不完整的情况[4,5]。

(7)日常需要查看的就是CPU和I/O的使用情况,以及有无阻塞进程。这些是最直观的可以反映服务器及数据库当前状态的信息[6]。Sybase数据库提供了Sybase Centre的数据库图形界面软件,可查看到阻塞的进程并将其杀掉[7]。

(8)定期检查数据库的配置[8]。如使用sp_configure检查内存分配、存储过程缓冲、用户连接数以及锁个数等重要的数据库参数的设置,减少系统I/O操作,提高数据分析和统计能力[9]。随着系统的使用以及客户端规模的改变, 应适当调整合适的参数数值,使数据库运行更流畅。

针对这些在Sybase数据库维护中要经常关注的环节, 系统管理员可以更高效的对Sybase数据库进行维护,保障数据库正常运行。

3.2我院HIS故障处理实例

我院HIS系统虽然有多方面的冗余,可是再完善的系统也无法做到百分之百的稳定。本文所介绍的问题为数据库日志容量溢出导致数据库无法进行任何新的操作(因为数据库每做一步操作都需要有日志空间来给它记录日志)。 最终采用在数据库的启动文件里设置一个trace flag标志, 该标志是指在数据库启动时重新扫描日志段的配额页,以重新计算空闲的日志空间,而不是使用在启动时保存的计算值。使用有该标志的启动脚本重新启动后数据库恢复。 也可以进行查询操作,将日志空间清空,为数据库使用。

对本次故障的经验总结有如下几条 :

(1)日志的空间大小以及内容对数据库来说至关重要,使用isql直接连接服务器,用命令sp_spaceused syslogs来查看日志容量的大小,以确保精确地知道剩余多少日志空间,而不是一味的依赖图形化界面来监控 ;用master.. syslogshold来查看最早进程,发现不完整事务,如果发现有驻守时间太久的进程应将其终止[10]。

(2)多关注日志的告警信息,以便更好地把握数据库的状态,尽早发现有可能会出问题的环节。

(3)图形化界面虽然直观,但是有时却不够准确,容易导致对问题不能及时发现,更多的时候还是需要用命令来查看一些重要的信息。

4总结

上一篇:对《劳动合同法》立法倾向的经济学分析下一篇:考研经验交流会于志鹏