搜索: 
首页 > 新闻
Sybase ASE数据库不能恢复处理
[ 发布时间 :2007-05-14  ]

.数据库不能恢复

数据库不能恢复或是恢复很慢,通常都是由于系统down机,或是在事务很忙时由于某种原因(如日志满)重新启动了数据库。如何处理数据库不能恢复的问题,如何加快数据库的恢复,如何删除不能恢复的数据库,下面就一些例子进行分析。

l        系统down机,数据库被标记为suspect

Database 'xx' cannot be opened - it has been marked SUSPECT by recover

Explanation

 

(1) ISQL 登录到ASE, 须 用SA 帐号

1>sp_configure "allow updates", 1

2>go

1>update master..sysdatabases

2>set status =-32768

3>Where name="database_name" database_name是你 的 数 据库 名

4>go

1>shutdown with nowait

2>go

(2)这 时 重 新 启动SQL Server, SA 帐 号 注册 到SQL Server.

1>update master..sysdatabases

2>set status=0

3>Where name="database_name" database_name 是 你 的 数据库

4>go

(3)重新启动Sybase

    注意:在做update时,一定要注意加上where 条件

l        当某一正常运行的大事务(例如:updatedelete操作)被终止,且重新启动server后,运行该事务的数据库处于恢复状态,通常这种状态会持续很长时间,当在此恢复过程中没有出现任何异常时,建议用户耐心等待恢复过程完成。同时我们提供以下方法来终止此恢复过程,但请用户注意这些操作将带来数据的不一致性。必要时,希望用户用完整、可靠的数据库备份恢复此数据库。

   (1) 启动Backup Server, 后备master数据库

  1>dump database master to "/usr/sybase/master.dup"
  2>go

   (2) isql登录到SQL Server, 须用sa帐号 (本文以pubs2数据库为例)

  1>sp_configure "allow updates", 1
  
2>go
  
1>begin tran
  
2>go
  
1> use master
  
2> go
  
1>update sysdatabases
  
2>set status = -32768
  
3>Where name="pubs2"
  4>go

    如果得到(1 row affected),

  1>commit
  2>go

  否则

  1>rollback
  2>go

   (3)这时重新启动SQL Server, 再用sa帐号登录到SQL Server.

  
1>dump tran pubs2 with no_log
  
2>go
  
1>begin tran
  
2>go
  
1> use master
  
2> go
  
1>update sysdatabases
  
2>set status=0
  
3>Where name="pubs2"
  4>go

    如果得到(1 row affected),

  1>commit
  2>go

    否则

  1>rollback
  2>go

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

   (4) 如果你的数据库原来有dboption(例如"select into","trunc log on chkpt"), 你需要重新设置这些option..

   (5) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照"如何检查数据库中数据一致性"文章)

   (6) 后备用户数据库

例如:
  1>dump database pubs2 to "/usr/sybase/pubs2.dup"
  
2>go

 

l        如果数据库始终不能恢复,但用户有备份,这时需要删除不能恢复的数据库。

如何删除坏的用户数据库(pubs2为例)

  当使用drop database无法删除数据库时,使用本文所示方法可以删除。

   (1)使用isqlsa注册SQL server

   (2)设置允许修改系统表

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

   (3)把 要删除的用户数据库置为"suspect"状态

  1>use master
  
2>go
  
1>begin tran
  
2>go
  
1>update sysdatabases set status=256
  
2>where name="pubs2"
  3>go

    如果得到(1 row affected),

  1>commit
  2>go

    否则

  1>rollback
  2>go

   (4)重启server,并用isqlsa注册。

   (5)删除数据库

  1>dbcc dbrepair(pubs2,dropdb)
  2>go

   (6)恢复允许修改系统表

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

  

问题现象:用户通过dblibrary  调用存储过程,完成insert 操作,insert 效率很差,1000条数据需要3分钟以上。如果使用isql 进行插入操作则insert 效率很好,当insert 每行的实际插入字节长度较小的使用,效率很好,insert 每行的实际插入字节长度达到400byte 左右时,性能有很大的下降。

 

解决办法:

 

调用 dblibrary 中设置网络包大小的函数

 

 DBSETLPACKET(login, 1024)

LOGINREC      *login;

short         packet_size;

 

insert 速度恢复正常。

 

 

分析:

 

 该问题没有被及时发现主要是混淆了ASE的两个参数概念:

 

default network packet size 该参数我们通常叫做“默认网络包大小”。但实际上这个作用只是在ASE启动的时候,在内存池中为用户可以使用的默认网络包分配内存,并不指当用户申请连接的时候系统默认使用的网络包的大小,换句话说在用户连接时不指定网络包的大小,无论default network packet size如何调整,系统都将使用512 byte 作为一个网络包的大小。该参数的大小对占用内存的影响不仅和该参数本身有关,而且和系统所配置的用户连接数有关 number of user connetion,内存占用与 default network packet size * number of user connection 成正比。

 

 

Max network packet  size : 指定用户可以使用的最大网络包 。该参数的调整对于内存的影响很小。该参数必须大于等于 default network packet size

 

测试:针对于 default network packet size max network packet size isql –A

参数设置做了如下测试,供参考。

(1)  Default network packet size 1024  Max network packet size =1024 Isql –A  =2048