tempdb
    摘要sybase数据库中,tempdb数据库提供了对临时表的存储和其他临时工作存储需要的空间。假如在一个坏盘中包含了tempdb的一部分使tempdb不能正常使用的时候,你就需要将tempdb数据库的大小减少到它的默认大小,然后再将它扩展到新的设备中。
    关键字tempdb,系统表
How to recover tempdb database
AbstractThe tempdb (temporary) database provides storage for temporary tables and other temporary working storage needs. If you have a corrupted disk that contains portions of tempdb, you should first reduce tempdb to its default size and then extend it onto any new device.
Keywordstempdbsystem tables
引言
    sybase数据库中有一个临时数据库(tempdb),为数据库系统中所有的用户所共享,提供了对临时表的存储和其他临时工作存储所需要的空间,大量的临时数据需要存储在这里。如果tempdb所在的非master设备的某一部分发生故障以后,一旦有数据在这里进行I/O操作(在进行大交易事务的时候,机率比较高),就会造成数据库系统死锁,从而数据库应用不能够正常运行;如果处理不当会造成大量数据丢失、无法恢复;严重时会造成应用系统的崩溃。为此及时发现和正确处理tempdb的故障就显得十分重要。下面就如何解决该故障的方法作一介绍,供大家参考。
一、故障的发生
tempdb所在的非master设备发生故障之后,在unix服务器的屏幕上或Sybase的日志文件中会出现如下报错信息:
0099/12/30 200000.94 kernel sddone:write error on virtual disk 8 block 9477:
0099/12/30 2000:40.50 kernel sddone:I/O error
0099/12/30 2000:51.51 server bufwritedes:write error detected spid=5,ppage=10501,
bvirtpg=134227205,dbid=2
0099/12/30 2000:51.51 server checkpoint process detected hardware error writing logical page ‘10501’,virtual page ‘134227205’,for dbid ‘2’,cache ‘default date cache’,it will sleep until write completes successfully.
根据这段报错信息,我们知道发生错误的地方在设备dbid ‘2’,而dbid ‘2’,在我们的数据库中对应的就是tempdb。这样我们就需要对tempdb所在的设备进行检查,确认该设备中的确有着坏块。如果确认了tempdb所在的非master设备有坏块之后,就需要将tempdb的大小减少到默认的大小,然后再将tempdb扩展到新的设备中,使数据库系统恢复正常。本文中以SCO UNIX 5.0.5操作系统下的Sybase Adaptive Server Enterprise 11.0.32为例,说明具体的操作方法。
二、恢复tempdb数据库的方法
恢复tempdb数据库的方法要分两个部分。首先将tempdb重设到默认大小;其次确认和改变tempdb数据库到新的设备上。
1.重设tempdb到默认大小
1)将数据库以单用户的方式启动,保证其他用户不能访问数据库。如:
    startserver -m
2)以怎样恢复数据sa的身份登录到数据库中。如:
    isql -Usa -Ppassword
3)对master数据库进行备份,预防出错情况下恢复。如:
    dump database master to 'device_name'
    go
4)对数据库中重要的数据进行备份,将需要备份的表的数据以ut的方式导出到文件中。如:
bcp master..sysusages out sysusages.bcp -c -Usa -Ppassword
bcp master..sysdevices out sysdevices.bcp -c -Usa -Ppassword
bcp master..sysdatabases out sysdatabases.bcp -c -Usa -Ppassword
bcp master..syslogins out syslogins.bcp -c -Usa -Ppassword
bcp master..sysconfigures out sysconfigures.bcp -c -Usa -Ppassword
bcp master..syscharsets out syscharsets.bcp -c -Usa -Ppassword
5)重新配置数据库,允许对系统目录可以修改。如:
    use master
    go
    sp_configure 'allow updates',1
    go
6)显示sysusages中属于tempdb的记录,并记下记录的数目。如:
    begin transaction
    go
    select * from sysusages where dbid=db_id('tempdb')
    go
    其中,db_id()函数是用来返回数据库的ID,在这里返回tempdbID
7)设置tempdb的初始空间(例如:2M)到数据段和日志段中。如:
    update sysusages
    set segmap=7 where dbid=db_id('tempdb') and lstart=0
    go
8)将sysusages中的关于tempdb的其他记录全部删除。如:
    delete sysusages where dbid=db_id('tempdb') and lstart!=0
    go
9)确认sysusagestempdb的入口点只有以下一行记录。如:
    select * from sysusages where dbid=db_id('tempdb')
    go
结果:
    dbid segmap lstart size vstart
    --  ------ ---- - ---- ------
    2      7      0      1024  2564
10假如以上信息正确,继续到第11步执行交易,否则回滚交易。如:
    rollback transaction
    go
11)完成交易。如:
    commit transaction
    go
12)重新配置数据库,不允许修改系统目录。如:
    sp_configure 'allow update',0
go
13)马上执行checkpoint,关闭数据库。
  注意:在下一次改变tempdb的大小之前,必须重启动数据库,假如不重启数据库继续运行,那么系统将会报严重错误
    checkpoint
    go
    shutdown
    go
14)重启动数据库
2.确认和改变tempdb到新设备上   
    经过了以上步骤之后,我们已经将tempdb的大小减少到了初始的2M,在我们新增了设备之后,可以通过alter database命令将tempdb扩展到新的设备中。
1)以sa的身份登录到数据库。如:
    isql -Usa -Ppassword
2)确认tempdbmaster设备上有一个存储数据和日志的2MB的段,如:
    sp_helpdb tempdb
    go
3)根据需要将tempdb扩展到新的设备上。如:
    alter database tempdb on device_name = device_size
    go
4)重新备份master数据库。
    dump database master to 'dump_device'
    go
其中dump_device是目标dump设备的名字
结束语
经过了以上的方法,可以解决在一个包含了tempdb一部分的磁盘出现故障,导致tempdb数据库不能正常运行的问题,使sybase数据库能够正常的运行。该方法处理速度快,操作简单,有很好的实际应用效果。(案例:上海铁路局的来舟、合肥等车站的客票系统,经过上述处理之后,都能获得成功,效果良好)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。