系统集成启动Sybase

在线求助!sybase数据库启动挂起!


这个错误在网上看到过好些解决方法,由于对sybase不熟悉,所以也不敢操作尤其是对一些操作步骤不了解,
希望有做过相关操作的大拿们不吝赐教哈!
下面是截取的部分日志:
00:00000:00001:2012/02/08 17:13:36.17 server  Undo pass: 50532449 records done (84%); 8917500 records left.
00:00000:00001:2012/02/08 17:14:24.80 server  Error: 1105, Severity: 17, State: 3
00:00000:00001:2012/02/08 17:14:24.81 server  Can't allocate space for object 'syslogs' in database 'cmrpii' because 'logsegment' segment is full/has no free extents. If you ran out of space in syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment to increase size of the segment.
00:00000:00001:2012/02/08 17:14:24.83 server  Error: 3475, Severity: 21, State: 7
00:00000:00001:2012/02/08 17:14:24.83 server  There is no space available in SYSLOGS for process 1 to log a record for which space has been reserved. This process will retry at intervals of one minute. The internal error number is -4.
00:00000:00019:2012/02/09 07:33:11.23 kernel  Cannot read, host process disconnected:  1956 spid: 19

网上看到的相关解决方法:
1> sp_configure "allow updates", 1
2> go

1> begin transaction
2> go

1> update master..sysdatabases
2> set status = status & ~256(对这个参数不了解,网上还有设置^256)
3> where name = ""
4> go

1> update master..sysdatabases
2> set status = status | 4112(?)
3> where name = ""
4> go

Check that each of the above update commands affected only one row. If more than one row was affected, issue a rollback transaction. Otherwise, commit the transaction and shut down Adaptive Server:

1> commit transaction
2> go


1> shutdown
2> go

Restart Adaptive Server.

Dump the transaction log with the no_log option and reset the database status:

1> use master
2> go


1> dump tran with no_log
2> go

1> sp_dboption , "no chkpt", false
2> go

1> sp_dboption , single, false
2> go

1> use
2> go

1> checkpoint
2> go

1> sp_configure "allow updates", 0
2> go


还有一个方案:
1>sp_configure 'allow update',1  
2>go  
1>use master  
2>go  
1>sp_helpdb DB_NAME  
2>  
记下此处查询出的数据库选项 (例如:select into/bulkcopy等)  (这步没看明白,到底要看什么选项?)
1>begin tran  
2>go  
1>update sysdatabases set status = -32768(这个参数是什么意思?) where name = 'DB_NAME' (注意:一定要加上数据库名称条件,切记,最好使用事务)  
2>go  
如果显示 (1 row affected),commit,否则 rollback  
1>commit  
2>go  copyright  
1>shutdown with nowait  
2>go  
第3. 重新重复步骤1,启动数据库服务器,注意观察日志中是否显示 在 recovery database DB_NAME 时使用bypass状态,如果正常,这种情况下,数据库服务器应该能够完全启动  
第4. 使用isql连接进入数据库服务器  
isql -Usa -Ppasswd -S server_name  
1>use master  
2>go  
1>dump tran DB_NAME with no_log ( dbcc rebuild_log(DBNAME,1,1) )  
2>go  
1>update sysdatabases set status = 0 where name = 'DB_NAME' (注意:一定要加上数据库名称条件,切记)  
2>go  
1>shutdown with nowait  
2>go  
第5. 重新重复步骤1,启动数据库服务器,注意观察日志中是否显示 recovery database DB_NAME 成功,DB_NAME数据库online  
内容来自ltesting.net

第6. 恢复数据库选项  
使用isql连接进入数据库服务器  
isql -Usa -Ppasswd -S server_name  
1>use master  
2>go  
1>sp_dboption DB_NAME,'select into',true  (??)
2>go  
1>use DB_NAME  
2>go  
1>checkpoint  
2>go  
上述的两个解决方法不知道对不对?


我见处理日志上建议可以ALTER DATABASE or sp_extendsegment to increase size of the segment
不知道怎么操作??

这是当前数据库的服务进程状态
$ ./showserver
USER         PID %CPU %MEM   SZ  RSS    TTY STAT    STIME  TIME COMMAND
sybase    999424  0.5  0.0 20044 6832      - A    16:50:53 20:56 /sybase125/ASE-12_5/bin/dataserver -ssybase -d/sybase125/master.dat -e/sybase125/ASE-12_5/install/sybase.log -c/sybase125/ASE-12_5/sybase.cfg -M/sybase125/ASE-12_5
sybase    950498  0.0  0.0 8956 3332      - A    16:51:07  0:00 /sybase125/ASE-12_5/bin/backupserver -Ssybase_back -e/sybase125/ASE-12_5/install/sybase_back.log -c/sybase125/tapedump.cfg -N25 -C20 -M/sybase125/ASE-12_5/bin/sybmultbuf
不知道还需要其它什么相关信息,需要的话大拿们尽管提哈!在这先拜托各位了哈!
参与17

16同行回答

pomtchpomtch  系统工程师 , 北京交大科技有限公司
可能是日志满了或有表损坏的情况下都需要用这2楼的方法,我经常使用。显示全部
可能是日志满了或有表损坏的情况下都需要用这2楼的方法,我经常使用。收起
软件开发 · 2013-09-25
浏览2429
午夜幽魂午夜幽魂  系统运维工程师 , 计算机有限公司
收下以后留着用,日志满了显示全部
收下以后留着用,日志满了收起
系统集成 · 2012-02-15
浏览2394
zp_ccczp_ccc  高级技术主管 , 国内某金融科技公司
Sybase数据库ASE事务日志的管理技巧详解SYBASE ASE的每一个数据库,无论是系统数据库(master,model, sybsystemprocs, tempdb),还是用户数据库,都有自己的transaction log,每个库都有syslogs表。Log记录用户对数据库修改的操作,所以如果不用命令清除, log会一直增长直至占满空间。...显示全部
Sybase数据库ASE事务日志的管理技巧详解
SYBASE ASE的每一个数据库,无论是系统数据库(master,model, sybsystemprocs, tempdb),还是用户数据库,都有自己的transaction log,每个库都有syslogs表。Log记录用户对数据库修改的操作,所以如果不用命令清除, log会一直增长直至占满空间。清除log可用dump transaction 命令;或者开放数据库选项trunc log on chkpt,数据库会每隔一段间隔自动清除log。管理好数据库log是用户操作数据库必须考虑的一面。

1.        下面就几个方面谈谈log及其管理:

  一、ASE 如何记录及读取日志信息

  我们知道,ASE是先记log的机制。Server Cache Memory中日志页总是先写于数据页:
  Log pages 在commit ,checkpoint,space needed 时写入硬盘。
Data pages 在checkpoint,space needed 时写入硬盘。
系统在recovery 时读每个database 的syslogs 表的信息,回退未完成的事务(transaction)(数据改变到事务前状态);完成已提交的事务(transaction)(数据改变为事务提交后的状态)。在Log中记下checkpoint点。这样保证整个数据库系统的一致性和完整性。

  二、Transaction logs 和checkpoint 进程

  checkpoint 命令的功能是强制所有“脏”页(自上次写入数据库设备后被更新过的页)写入数据库设备。自动的checkpoint 间隔是由ASE 根据系统活动和系统表sysconfigures中的恢复间隔(recovery interval)值计算出的。通过指定系统恢复所需的时间总量,恢复间隔决定了checkpoint 的频率。

  如果数据库开放trunc log on chkpt选项,则ASE在数据库系统执行checkpoint时自动清除log。但用户自己写入执行的checkpoint命令并不清除log,即使trunc log on chkpt选项开放。只有在trunc log on chkpt选项开放时,ASE自动执行checkpoint动作,才能自动清除log 。这个自动的checkpoint动作在ASE中的进程叫做checkpoint进程。当trunc log on chkpt选项开放时,checkpoint进程每隔60秒左右清除log,而不考虑recovery interval设置时间的间隔。
  三、Transaction log 的大小
  没有一个十分严格的和确切的方法来确定一个数据库的log应该给多大空间。对一个新建的数据库来说,log大小为整个数据库大小的20%左右。因为log记录对数据库的修改,如果修改的动作频繁,则log的增长十分迅速。所以说log空间大小依赖于用户是如何使用数据库的。 例如:
update,insert和delete 的频率
每个transaction 中数据的修改量
ASE系统参数recovery interval 值
log是否存到介质上用于数据库恢复
还有其它因素影响log大小,我们应该根据操作估计log大小,并间隔一个周期就对log进行备份和清除。

  四、检测log 的大小

  若log 在自己的设备上,dbcc checktable (syslogs) 有如下信息:
例:***NOTICE:space used on the log segment is 12.87Mbytes,64.35%
   ***NOTICE:space free on the log segment is 7.13Mbytes,35.65%  
根据log剩余空间比例来决定是否使用dump transaction 命令来备份和清除log。

  用快速方法来判断transaction log 满的程度。
1>use database_name
2>go
1>select data_pgs (8,doampg)
2>from sysindexes where id=8
3>go
Note:this query may be off by as many as 16 pages.
在syslogs 表用sp_spaceused 命令。

  五、log 设备

  一般来说,应该将一个数据库的data和log存放在不同的数据库设备上。这样做的好处:
可以单独地备份(back up)transaction log  
防止数据库溢满
可以看到log空间的使用情况。[dbcc checktable (syslogs)]  
可以镜像log设备

  六、log 的清除

  数据库的log是不断增长的,必须在它占满空间之前清除。前面已经讨论过,清除log可以开放数据库选项trunc log on chkpt,使数据库系统每隔一段时间间隔自动清除log,还可以执行命令dump transaction 来清除log.trunc log on chkpt 选项同dump transaction with truncate_only 命令一样,只是清除log而不保留log到备份设备上。所以如果只想清除log而不做备份,可以使用trunc log on chkpt 选项及dump transaction with truncate_only,dump transaction with no_log 命令。若想备份,应做dump transaction database_name to dumpdevice。

  七、管理大的transactions

  有些操作是大批量地修改数据,log增长速度十分快,如:
  大量数据修改
  删除一个表的所有记录
  基于子查询的数据插入
  批量数据拷贝

  下面讲述怎样使用这些transaction 使log 不至溢满:
  大量数据修改    例 :  
  1>update large_tab set col_1=0
  2>go  

  若这个表很大,则此update动作在未完成之前就可能使log满,引起1105错误(log full)而且执行这种大的transaction所产生的exclusive table lock,阻止其他用户在update期间修改这个表,这可能引起死锁。为避免这些情况,我们可以把这个大的transaction分成几个小的transactions,并执行dump transaction 动作。

  上述例子可以分成两个或多个小transactions.  
例如:
1>update large_tab set col1=0
2>where col2<>
3>go
1>dump transaction database_name with truncate_only
2>go
1>update large_tab set col1=0
2>where col2>=x
3>go
1>dump transaction database_name with truncate_only
2>go  

  若这个transaction 需要备份到介质上,则不用with truncate_only 选项。若执 行dump transaction with truncate_only,应该先做dump database 命令。

  删除一个表的所有记录:
  例:
  1>delete table large_tab
  2>go  

  同样,把整个table的记录都删除,要记很多log,我们可以用truncate table命      令代替上述语句完成相同功能。
  1>truncate table large_tab
  2>go  

  这样,表中记录都删除了,而使用truncate table 命令,log只记录空间回收情况,而不是记录删除表中每一行的操作。

  基于子查询的数据插入
  例:
  1>insert new_tab select col1,col2 from large_tab
  2>go  

  同样的方法,对这个大的transaction,我们应该处理为几个小的transactions。
  1>Insert new_tab
  2>select col1,col2 from large_tab where col1<=y
  3>go
  1>dump transaction database_name with truncate_only
  2>go
  1>insert new_tab
  2>select col1,col2 from large_tab where col1>y
  3>go
  1>dump database database_name with truncate_only
  2>go  

  同样,若想保存log到介质上,则dump transaction 后不加with truncate_only 选项。若执行dump transaction with truncate_only,应该先做dump database 动作。

  批量数据拷贝
在使用bcp把数据拷入数据库时,我们可以把这个大的transaction变成几个小的transactions处理,避免log剧增。

  开放trunc log on chkpt 选项
  1>use master
  2>go
  1>sp_dboption database_name,trunc,true
  2>go
  1>use database_name
  2>go
  1>checkpoint
  2>go  
  bcp... -b 100 (on unix)
  bcp... /batch_size=100(on vms)  
  关闭trunc log on chkpt选项,并dump database。

  在这个例子中,一个批执行100行拷贝。也可以将bcp输入文件分成两或多个分开的文件,在每个文件执行后做dump transaction 来避免log 满。

  若bcp使用快速方式(无索引,无triggers),这样操作不记log,换句话说,log 只记载空间分配情况。在这种情况下,要先做dump database(为恢复数据库用)。若log太小,可置trunc log on chkpt 选项,这样在每次checkpoint后清除log。

  八、Threshold 和transaction log 管理

  ASE提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。这方面的详细讨论见NO.5技术支持杂志。log的管理是灵活而复杂的,我们应该在实践中摸索经验,针对每个数据库的不同情况,不同操作,做不同处理。

  2. 如何截断数据库的事务日志?

  事务日志填满数据库中的日志空间后,可能不能使用转储事务日志的办法备份并且清除原来存在的日志,因为转储日志这个动作本身也需要记录日志。
这时候,可以首先使用dump transaction database_name with truncate_only命令,该命令只是截断/清除事务日志,并不生成实际的备份。
如果不能奏效,可以使用dump transaction database_name with no_log命令。该命令也是仅仅清除既有的事务日志,不生成实际的备份文件,且该命令本身不记日志。
如果该命令还不能奏效,应当使用alter database命令为此数据库的日志分配额外的空间,随后执行dump transaction。

   3. 使用dump transaction with no_log的危险性

  在命令参考手册中的dump transaction with no_log条目下,有一条警告信息告诉你,你应该把这条命令作为没有其它办法时的最后一招才使用它。但是“最后一招”究竟是什么意思呢?当你使用这条命令时会怎样呢?那你应使用哪条命令来代替它呢?最后,若这条命令如此有问题,为什么Sybase却要提供它呢?

  Sybase技术支持建议你定期的dump你的transaction log。你必须根据你的数据库中记入日志的活动量的大小以及你的数据库的大小来决定dump的方式。有些地方按月dump transaction;有些地方每夜dump transaction。

  若你从未做过dump transaction,transaction log将最终会满。 SQLServer使用log(日志)是出于恢复目的的。 当log满时,服务器将停止事物的继续进行,因为服务器将不能将这些事物写进日志,而服务器不能运行大多数的dump tran命令,因为ASE也需在日志中记录这些命令。

  这就是为什么当其它dump tran命令不能执行时no_log可执行的原因。但是想一下dump transaction with no_log被设计执行的环境,将不做并发性检查。

  若你在对数据库的修改发生时使用dump transaction with no_log,你就会冒整个数据库崩溃的风险。在多数情况下,它们被反映成813或605错误。为了在数据库被修改时,删除transaction log中的不活跃部分可使用dump transaction with truncate_only。这条命令写进transaction log时,并且它还做必要的并发性检查。这两条命令都有与其相关的警告,在命令参考手册中会看到这些警告。请确保在使用其中任一条命令以前,你已理解这些警告和指示。 Sybase提供dump transaction with no_log来处理某些非常紧迫的情况。为了尽量确保你的数据库的一致性,你应将其作为“最后一招”。
  4. 为什么数据库事务日志满了,使用dump tran with no_log仍不能截断日志?
  有两种情况,可能出现这个问题。一是应用系统给ASE发送了一个用户自定义事务,一直未提交,这个最早活跃事务阻碍系统截断日志。二是客户端向ASE发送了一个修改数量大的事务,清日志时,该事务还正在执行之中,此事务所涉及的日志只能等到事务结束后,才能被截掉。

  对于第一种情况,只要督促用户退出应用或者提交事务,系统管理员便可清掉日志。因为给ASE发送Dump transaction with no-log或者with truncate-only,它截掉事务日志的非活跃部分。所谓非活跃部分是指服务器检查点之间的所有已提交或回退的事务。而从最早的未提交的事务到最近的日志记录之间的事务日志记录被称为活跃的。从此可以看明,打开的事务能致使日志上涨,因为在最早活跃事务之后的日志不能被截除。

  对于第二种情况,道理也同上。只是在处理它时,需慎重从事。如果这个大事务已运行较长时间,应尽量想法扩大数据库日志空间,保证该事务正常结束。若该事务被强行回滚,ASE需要做大量的处理工作,往往是正向执行时间的几倍,系统恢复时间长,可能会影响正常使用的时间。收起
互联网服务 · 2012-02-10
浏览2483
yangyijun230yangyijun230  系统工程师 , 江苏准成
回复 2# zp_ccc     灰常灰常感谢版主的支援,问题终于解决了!也非常感谢大家的关注!谢谢!不过还有一个疑问,现在我的这个库的状态是abort tran on log full不知道是不是安全的或者说是正常数据库应该的状态的??        ---------------...显示全部
回复 2# zp_ccc


    灰常灰常感谢版主的支援,问题终于解决了!

也非常感谢大家的关注!谢谢!

不过还有一个疑问,现在我的这个库的状态是abort tran on log full
不知道是不是安全的或者说是正常数据库应该的状态的??


        ------------------------------------------------------------------------------------------------------
cmrpii                      22000.0 MB sa                            4
         Jun 14, 2004  
         abort tran on log full                                                                                 
master                        400.0 MB sa                            1
         Jun 11, 2004  
         no options set                                                                                         
model                          16.0 MB sa                            3
         Jun 11, 2004  
         select into/bulkcopy/pllsort, allow nulls by default                                                   
sybsystemdb                    48.0 MB sa                        31513
         Jun 11, 2004  
         no options set                                                                                         
sybsystemprocs                200.0 MB sa                        31514
         Jun 11, 2004  
         trunc log on chkpt                                                                                    
tempdb                       1264.0 MB sa                            2
         Feb 09, 2012  
         select into/bulkcopy/pllsort, trunc log on chkpt, ddl in tran, allow nulls by de
         fault收起
系统集成 · 2012-02-09
浏览2614
热心冰块热心冰块  项目经理 , 浪潮INSPUR
回复  pandc     我的用户数据库: Can't allocate space for object 'syslogs' in database 'cmrpii' b ...yangyijun230 发表于 2012-2-9 11:09 官方的方法在必要的时候是需要变通的显示全部
回复  pandc


    我的用户数据库: Can't allocate space for object 'syslogs' in database 'cmrpii' b ...
yangyijun230 发表于 2012-2-9 11:09


官方的方法在必要的时候是需要变通的收起
系统集成 · 2012-02-09
浏览2397
热心冰块热心冰块  项目经理 , 浪潮INSPUR
回复  pandc     这个处理过程应该是master库日志满的步骤吧!?yangyijun230 发表于 2012-2-9 11:07 仅供参考显示全部
回复  pandc


    这个处理过程应该是master库日志满的步骤吧!?
yangyijun230 发表于 2012-2-9 11:07


仅供参考收起
系统集成 · 2012-02-09
浏览2593
yangyijun230yangyijun230  系统工程师 , 江苏准成
回复 9# pandc     我的用户数据库: Can't allocate space for object 'syslogs' in database 'cmrpii' because 'logsegment' segment is full/has no free extents. If you ran out of space in syslogs, dump the transaction log.显示全部
回复 9# pandc


    我的用户数据库: Can't allocate space for object 'syslogs' in database 'cmrpii' because 'logsegment' segment is full/has no free extents. If you ran out of space in syslogs, dump the transaction log.收起
系统集成 · 2012-02-09
浏览2868
yangyijun230yangyijun230  系统工程师 , 江苏准成
回复 9# pandc     这个处理过程应该是master库日志满的步骤吧!?:o显示全部
回复 9# pandc


    这个处理过程应该是master库日志满的步骤吧!?:o收起
系统集成 · 2012-02-09
浏览2781
热心冰块热心冰块  项目经理 , 浪潮INSPUR
查了官方手册,针对日志中Error: 1105方法如下:1.在RUN_servername的文件里添加标识:-T3607(编辑RUN_servername文件,在文件末尾添加以上标识)2.启动ASE(直接运行文件RUN_servername,且该窗口在执行以下操作时不要关闭)3.截断日志1>dump tran  master with no_log2>go4....显示全部
查了官方手册,针对日志中Error: 1105方法如下:
1.在RUN_servername的文件里添加标识:-T3607(编辑RUN_servername文件,在文件末尾添加以上标识)
2.启动ASE(直接运行文件RUN_servername,且该窗口在执行以下操作时不要关闭)
3.截断日志
1>dump tran  master with no_log
2>go
4.停止ASE服务
1>shutdown
2>go
5.删除RUN_servername文件末尾的标识:-T3607
6.重启ASE收起
系统集成 · 2012-02-09
浏览2820
hubb-1hubb-1  软件开发工程师 , 中联
修复一下就可以了!显示全部
修复一下就可以了!收起
互联网服务 · 2012-02-09
浏览2764

提问者

yangyijun230
系统工程师江苏准成
擅长领域: 虚拟化云计算PowerVM

相关问题

相关资料

问题状态

  • 发布时间:2012-02-09
  • 关注会员:1 人
  • 问题浏览:17964
  • 最近回答:2013-09-25
  • X社区推广