SYBASE学习笔记
as
if (@cint=4)
select @outchar='Four' if (@cint=5)
select @outchar='Five' if (@cint=6)
select @outchar='Six' (1 row affected) (return status = 0)
如何检查数据库中数据的一致性
http://www.sybase.com.cn/cn/content/support/exp_jszc_ase_zj_00006.htm
数据库一致性检查(dbcc)提供了一些命令用于检查数据库的逻辑和物理一致性。Dbcc主要有两个功能:
使用checkstorage 或 checktable 及 checkdb 在页一级和行一级检查页链及数据指针。 使用checkstorage, checkalloc, 或 checkverify, tablealloc, 及indexalloc 检查页分配。 在下列情况中需要使用 dbcc 命令:
作为数据库日常维护工作的一部分, 数据库内部结构的完整性决定于sa 或dbo 定期地运行 dbcc 检查。
在系统报错以后, 确定数据库是否有损坏。 在备份数据库之前, 确保备份的完整性。
如果怀疑数据库有损坏时, 例如, 使用某个表时报出表损坏的信息, 可以使用 dbcc 确定数据库中其他表是否也有损坏。 下面是dbcc的简单用法: dbcc checktable (table_name)
检查指定的表, 检查索引和数据页是否正确链接, 索引是否正确排序, 所有指针是否一致, 每页的数据信息是否合理, 页偏移是否合理。 dbcc checkdb (database_name)
对指定数据库的所有表做和checktable 一样的检查。 dbcc checkalloc (database_name,fix|nofix)
检查指定数据库, 是否所有页面被正确分配, 是否被分配的页面没被使用。当使用\选项时,在检查数据库的同时会自动修复有问题的页面。(若数据库数据量很大,则该过程会持续很长时间。)
dbcc tablealloc (table_name,fix|nofix)
检查指定的表, 是否所有页面被正确分配, 是否被分配的页面没被使用。是 checkalloc 的缩小版本, 对指定的表做完整性检查。当使用\选项时,在检查数据表的同时会自动修复数据表中有问题的页面。
关于上述命令的其它选项及详细使用方法和checkstorage, checkverify, indexalloc 的详细使用方法, 请参阅有关命令手册。
举例1: Unix平台检查pubs2数据库的一致性 单用户模式启动Server:
$SYBASE/install startserver -f RUN_server_name -m vi dbcc_db.sql
北京易初电子技术有限公司软件中心 2005-01
- 31 -
SYBASE学习笔记
use master go
sp_dboption pubs2,\go
use pubs2 go
checkpoint go
dbcc checkdb(pubs2) go
dbcc checkalloc(pubs2,fix) go
dbcc checkcatalog(pubs2) go
use master go
sp_dboption pubs2,\go
use pubs2 go
checkpoint go quit go
isql -Usa -Pxxxxxx -SSYBASE
举例2: Unix平台检查pubs2数据库中titles表的一致性 vi dbcc_table.sql use pubs2 go
dbcc checktable(titles) go
dbcc tablealloc(titles) go
isql -Usa -Pxxxxxx -SSYBASE < dbcc_table.sql > dbcc_table.out grep Msg dbcc_table.out
启动时数据库不能回滚解决方法
第1. 使用 install目录下 的 RUN 文件启动数据库服务器(如果服务已经启动,可跳过此步骤)
第2. 使用isql连接进入数据库服务器 isql -Usa -Ppasswd -S server_name 1>sp_configure 'allow update',1
北京易初电子技术有限公司软件中心 2005-01
- 32 -
SYBASE学习笔记
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
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
第6. 恢复数据库选项
使用isql连接进入数据库服务器 isql -Usa -Ppasswd -S server_name 1>use master 2>go
1>sp_dboption DB_NAME,'select into',true 2>go
北京易初电子技术有限公司软件中心 2005-01
- 33 -
SYBASE学习笔记
1>use DB_NAME 2>go
1>checkpoint 2>go
如果有其他选项,依法处理
先试步骤四中的 dump tran with no_log 如果不行就用后面括号中那个命令 dbcc rebuild_log(DBNAME,1,1)
dbcc rebuild_log,如果还不行,只有恢复备份了 如果没有备份,只能在重新做1到3步骤,然后使用bcp将数据库中所有数据备份出来,然后重新创建数据库了。
强行截断日志的方法能够清除系统中日志的错误,让数据库正常online,但也有可能造成数据库中用户表甚至系统表的损坏,
所以建议在数据库正常online后进行全库的DBCC检查(比如dbcc checkdb、 dbcc checkalloc等)以确保正常运行。
解决数据库被挂起的问题
现象:Error 926
Severity Level 14 Error Message Text
Database 'xx' cannot be opened - it has been marked SUSPECT by recover Explanation
(1) 当你使用Transact_SQL命令操作这个数据库的数据时, 出现这个信息, 这是一个严重的错误, 如果你要使用这个数据库的数据, 必须改正这个错误. (2) 启动Backup Server, 后备master数据库(这一步很重要!) 1>dump database master to \ 2>go
(3) 用isql登录到SQL Server, 须用sa帐号 (本文以pubs2数据库为例) 1>sp_configure \ 2>go
1>begin tran 2>go
1>use master 2>go
1>update sysdatabases 2>set status = -32768 3>Where name=\ 4>go
如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go
北京易初电子技术有限公司软件中心 2005-01
- 34 -
SYBASE学习笔记
(4)重新启动SQL Server.
注:SQL Server重新启动之后,当发现数据库本身存在不可恢复的问题时,如数据页损坏等,且没有完好的数据库备份,一定要用bcp...out备份用户数据库数据。此时,以下步骤省略,并按照“如何删除坏的用户数据库”文章删除此数据库。之后重建此数据库,恢复备份。
否则,按以下步骤继续操作: 用sa帐号注册到SQL Server. 1>begin tran 2>go
1>use master 2>go
1>update sysdatabases 2>set status=0
3>Where name=\ 4>go
如果得到(1 row affected),则 1>commit 2>go 否则 1>rollback 2>go
1>sp_configure \ 2>go
(5)重新启动SQL Server.
(6) 如果你的数据库原来有dboption(例如\等), 你需要重新设置这些option.
(7) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照“如何检查数据库中数据一致性”文章) (8) 备份用户数据库 例如:
1>dump database pubs2 to \ 2>go
如何终止数据库恢复过程
http://www.sybase.com.cn/cn/content/support/exp_jszc_ase_zj_00002.htm
当某一正常运行的大事务(例如:update、delete操作)被终止,且重新启动server后,运行该事务的数据库处于恢复状态,通常这种状态会持续很长时间,当在此恢复过程中没有出现任何异常时,建议用户耐心等待恢复过程完成。同时我们提供以下方法来终止此恢复过程,但请用户注意这些操作将带来数据的不一致性。必要时,希望用户用完整、可靠的数据库备份恢复此数据库。
(1) 启动Backup Server, 后备master数据库(这一步很重要!) 1>dump database master to \ 2>go
北京易初电子技术有限公司软件中心 2005-01
- 35 -