sybase 故障解决1 [转]

⊙关于定时备份
⊙有个关于游标的问题,请教各位大虾
⊙有个关于游标的问题,请教各位大虾
⊙新手问题:为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊?
⊙什么是BYPASS RECOVERY mode?
⊙数据库表BCP出来报错
⊙sybase的sa口令丢失怎样恢复?
⊙关于阀值
⊙什么SYBASE安装完后要增加TEMPDB的空间?
⊙怎样利用脚本自动关闭sybase数据库
⊙请教存储过程动态使用表
⊙sybase中的跨库操作
⊙ASE在windows xp/2000上安装的二个注意的问题
⊙关于数据库锁
⊙请问!怎样设置自动清log,和temp的阀值?
⊙Unix下的Sybase配置
⊙login中的项目与用户数据库中user里的项目错位
⊙于tempdb的优化
⊙如何扩展master数据库空间
⊙加锁机制
⊙日志问题普及篇
⊙如何修改Win98开始菜单中的中文乱码
⊙如何更改服务器的字符集为cp936
⊙一旦客户突然退出或系统重启,SQL Server如何回滚事务?
⊙为什么有时候数据库事务日志满了,使用Dump transaction with no-log仍不能截断日志?
⊙即使表上没有建立索引,为什么BCP操作仍记日志?
⊙如何生成bcp命令文件(以pubs2为例)
⊙如何在AIX上后备数据量大于1GB的数据库
⊙如何后备数据量大于2GB的数据库
⊙Unix平台后备pubs2数据库
⊙如何查找数据库启动失败原因
⊙如何在NT、UNIX下启动关闭ASE
⊙SYBASE中如何设置用户口令为空
⊙如何更改SQL Server名称(在UNIX、OPENVMS平台上)
⊙在Windows NT上手动卸载Sybase Server
⊙如何检查数据库中数据的一致性
⊙如何删除坏的用户数据库?(以pubs2为例)
⊙ASE11.5装载或备份数据库报3230错误
⊙如何终止数据库恢复过程
⊙解决数据库被挂起的问题
⊙如何安装ASE的EBF
⊙如何为两个ASE配置SQL Remote
⊙master数据库1105错误的处理方法
⊙如何单独在备份机上启动Sybase ASE12.5
⊙如何恢复master数据库
⊙如何做 rebuild log
⊙如何重建sybsystemprocs系统数据库
⊙如何移植master设备
⊙死锁
⊙如何配置SQL Server来做远程备份?
1) 关于定时备份
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1233&show=390
crontab 中可以这样写:
00 23 * * * /sybase/ASE-12_0/bin/DUMPDB.sh >>/sybase/ASE-12_0/install/DUMPDB.out
放那里都无所谓,一个dumpdb.sh的例子:
#SUN Solaris 8
#!/bin/ksh
export SYBASE=/sybase
export SYBASE_FTS=FTS-12_0
export
PATH=/sybase/ASE-12_0/bin:/sybase/OCS-12_0/bin:$PATH:/sybase/ASE-12_0/install:/usr/sbin
export SYBASE_OCS=OCS-12_0
export SYBASE_ASE=ASE-12_0
export LM_LICENSE_FILE=/sybase/SYSAM-1_0/licenses/license.dat:$LM_LICENSE_FILE
export 
LD_LIBRARY_PATH=/sybase/ASE-12_0/lib:/usr/local/openwin/lib:/sybase/FTS12_0/lib:/sybase/OCS-12_0/lib:/usr/local/openwin/lib:/usr/lib:/sybase/SQLRemote/lib:$LD_LIBRARY_PATH
export SYBASE_SYSAM=SYSAM-1_0
export HOME=$SYBASE 
$SYBASE_OCS/bin/isql -Usa -SSYBASE -P <<!
dump database YOURDBNAME to "/sybdump/dump.01"
                stripe on "/sybdump/dump.02"
                stripe on "/sybdump/dump.03"
                stripe on "/sybdump/dump.04"
                stripe on "/sybdump/dump.05"
go

这里是一个典型的脚本,用于实现full备份! 
#!/usr/bin/sh 
# *************************************************************************
#for full backup after excuted dbcc operation
# *************************************************************************
SHLIB_PATH=/opt/sybase/ASE-12_0/lib:/opt/sybase/FTS-12_0/lib:/opt/sybase/OCS-12_0/lib:/usr/lib:/lib:/usr/lib/Motif1.2:/opt/sybase/SQLRemote/
lib
export SHLIB_PATH 
SYBASE_OCS=OCS-12_0
export SYBASE_OCS 
SYBASE=/opt/sybase
export SYBASE 
ISQL="/opt/sybase/OCS-12_0/bin"
ymd=`date +%y%m%d`
bk_user="unb"
bk_pwd="******"
bk_db="SYB_HP" 
cd /sybase/backup
mkdir $ymd
LOG="/sybase/backup/$ymd"
echo $ymd >$LOG/backup.log
echo "\n11*************************" >>$LOG/backup.log
echo "Check database $bk_db..." >>$LOG/backup.log
d1=`date`
su - sybase -c "isql -SSYB_HP -Usa -P****** <<DBCC >$LOG/dbcc-$ymd.log 2>&1
dbcc traceon(3604)
go
dbcc checkdb($bk_db)
go
dbcc traceoff(3604)
go
DBCC
echo $d1,`date` >>$LOG/backup.log 
echo "\n22*************************" >>$LOG/backup.log
d1=`date`
dump_file="/sybase/backup/$dump-unb-full-$ymd.dat"
echo "Dump database $bk_db to " $dump_file >>$LOG/backup.log
su - sybase -c "isql -SSYB_HP -Usa -P****** <<DUMP >$LOG/dump-$ymd.log 2>&1
dump database $bk_db to "$dump_file"
go
DUMP
echo $d1,`date` >>$LOG/backup.log 
echo "\n33*************************" >>$LOG/backup.log 
请根据自身系统,调试后再使用! 
至于备份日志的脚本与此类似,自己根据sybase的相关语法,稍加变动即可! 
2) 有个关于游标的问题,请教各位大虾 
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=429&show=390
在sybase数据库中用游标操作完表a的记录后,关闭close游标,在free游标。但接着想drop此表a,结果失败,显示的错误信息是"游标在使用"(记得不是很清楚了,大概是这个意思)。
请碰到过这类问题的大虾支持支持。在informix和oracle中释放游标是用free,在sybase也是用free吗?
sybase 中正确操作游标的顺序是:
1、DECLARE CUR_ACCTINFO CURSOR FOR SELECT .....    (定义) 
2、OPEN CUR_ACCTINFO                               (打开)
3、WHILE @@SQLSTATUS = 0                            (判断是否成功)
 BEGIN
4、         FETCH CUR_ACCTINFO INTO  .......     (取数据)
          IF @@SQLSTATUS  <> 0
 begin
                    ......
 end
           ........... 
5、 CLOSE CUR_ACCTINFO               (关闭)
6、 DEALLOCATE  CURSOR CUR_ACCTINFO  (释放) 
3) 在sybase中有没有进行数据类型转换的函数 
  ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1346&show=330
四舍五入用round,如round(123.4567,1)=123.5或round(123.4567,0)=123或round(123.67,0)=124
去尾用floor,如floor(123.4567)=123
进尾用ceiling,如ceiling(123.4567)=124 
4) 新手问题:为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊!?
  ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1335&show=330
 为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊!?
我用NetTerm登陆运行,但只要一退出NetTerm,BACKUP就自己DOWN了
加&运行也不行,怎么办啊?
命令前加nohup 试试 
那是因为你的backup进程是以你的登录用户起动的,所以当该用户退出unix时,
进程也跟着退出操作系统了
5) 什么是BYPASS RECOVERY mode? 
  ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1371&show=300
在客户端出现提示:
Attempt to BEGIN TRANsaction in database "****" failed because database is in BYPASS RECOVERY mode.
请问如何解决? 
select name,status from master..sysdatabases where db_name="你所说的数据库"
看status是否是-32768 ,若是,sysdatabases系统表相应记录的status字段改为0,reboot数据库服务器就可以了。
谢谢各位,问题已解决。中午去SYBASE网站查找到有关这个问题的详细信息,包括问题成因及解决办法: 
Error 3908
Severity 
16 
Error Message 
Attempt to BEGIN TRANsaction in database '%.*s' failed because database is in BYPASS RECOVERY mode. 
Explanation 
Adaptive Server can start various types of transactions such as local (in response to a local command), internal (for the server's own use), external (started by an external client like a TP Monitor) and subordinate (child transactions started by a parent transaction in parallel). 
Bypass recovery starts Adaptive Server without recovering one or more databases. A database in this mode can be accessed even though it is not recovered. You use this mode to allow access to the database for problem analysis, to copy out data, and so on. 
Error 3908 is raised when a transaction is attempted while the database is in bypass recovery. Although certain commands are permissible in this mode, no transactions - regardless of type - can be started when the database is in bypass recovery. 
Error 3908 is raised in the following states: 
State Meaning 
1 Attempted to start a transaction when the database is not available for update. Applies to all possible transaction types. 
2 Attempted to start a subordinate transaction when the database is not available for update. 
Action 
Do not attempt to start a transaction while the database is in bypass recovery. Check if any automated jobs may have submitted a batch job that attempted such a transaction. First restore the database to the original working status it had (prior to bypass status) before attempting any transactions. 
Use the following steps to reset the database status: 
Note Although a status of zero is usually appropriate, it is not the only possible status value you can use. Reset the database to the actual, normal status it had prior to entering bypass recovery status. 
1. Reset the database status to 0:
1> sp_configure "allow updates", 1 
2> go 
1> begin tran 
2> go 
1> use master 
2> go 
1> update sysdatabases set status=0 where name=<database_name> 
2> go 
Check that the above update command affected only one row (if more than one row was affected, issue a rollback transaction.) Then commit the transaction and shut down Adaptive Server as follows: 
1>commit tran 
2>go 
1>shutdown with nowait 
2>go 
2. Restart Adaptive Server. Run dbcc checkdb and dbcc checkalloc on the affected database to make sure there are no errors. 
Version in Which This Error is Raised 
All versions. 
再次谢谢aladdin,freebob,changing。
6) 数据库表BCP出来报错 
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1326&show=300
数据库表BCP出来报错
DB-LIBRARY error
 I/O error while writing bcp data-file
bcp出来的文件正好2GB,实际应该更大。
操作系统SCO OpenServer5.0.4, SYBASE 11.0.3
请问是何原因?谢谢。
当在后备数据量大于2GB的数据库时,可能会遇到以下错误: 
I/Oerror: 
operating system error,server device /backup/data. code 27 messages 
file too large. 
  这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件,这时可以使用Backup Server将一个数据库后备到多个文件中。 
  1>dump database pubs2 to "/usr/sybase/pubs2_dump.1" 
  2>stripe on "/usr/sybase/pubs2_dump.2" 
  3>stripe on "/usr/sybase/pubs2_dump.3" 
  4>go 
  这种方法还可以提高后备及恢复的速度,但注意恢复也必须用相应多的设备。例如: 
  1>load database pubs2 from "/usr/sybase/pubs2_dump.1" 
  2>stripe on "/usr/sybase/pubs2_dump.2" 
  3>stripe on "/usr/sybase/pubs2_dump.3" 
  4>go 
7) sybase的sa口令丢失怎样恢复? 
  ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1239&show=270
在RUN-SERVER文件中加入一行-psa,重起dataserver,在控制台上可以看见新的口令 
::URL::http://www.powerba.com/develop/database/sybase/article/20010505001.htm
 sybase表中如何删掉多条相同的记录? 
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1438&start=0&show=180
sybase表中如何删掉多条相同的记录?
由于表出问题,将没有进行处理的*.txt文件bcp到表中,其中含有大量的重复记录。
请问有没有办法将表中重复的记录删掉呢?
那好办,那你就可以使用下面语句将唯一的记录先插入到临时表中:
select distinct a ,b,c,d ... into tempdb..tempdb_table from tablename
然后清空原表,把临时表中的数据插入正式表中!
试试看 
可以参考这种经典方法:
1---select * into tmp_tab from your_dup_tab where 1=2
2---若表无唯一性索引则建一个唯一性索引(一定能找到一个唯一性的索引建(复合索引))create unique index(列名1,列名2...) on tmp_tab with ignore_dup_key.
3----insert into tmp_tab from your_dup_tab
这样在新表中将自动删出重复记录。但数据量过大请留意日志空间(sp_spaceused syslogs).
很使用的方法.try it!
8)数据和日志分离
sp_logdevice将该库的日志转到这个设备
1)dump tran yourdb with truncate_only
2)alter database yourdb log on newlogdevice=xxx
 sp_helpdb yourdb看是否data/log
3)sp_logdevice yourdb,newlogdevice
 sp_helpdb yourdb
 看是否data only, log only 
这个就是在DATA和LOG在同一设备上时,可以将LOG段分开
9) 关于阀值
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1231&show=180
发告警或者水自动溢出,以保护系统不至于达到危险境界。对于数据库而言,我们使用的存储设备毕竟有限,如果任由数据或日志增长,数据或日志日久天长终将占用所有存储设备,如果到了没有空间的时候,系统将挂起,这样业务将暂停。所以对于一些要求数据库可用性很高的系统,必须保证在可预见的情况下数据段或者日志段不至于没有空间!为做到这一点,传统的数据库一般都需要系统维护人员经常的定期的进行数据库检查,若数据段不够了,转储一部分数据或者增加一些设备,若日志空间不够了,转储日志!但这样系统管理员就有点累了!
为减轻系统管理员的负担,提高系统的自动化程度,sybase提出了用阀值进行自动管理的这样一种模式,只要在开始定义好各段的阀值,以及达到阀值后的处理存储过程,就可以实现自动管理了!
不过,我先前也想这样做,也研究了一阵子,但是后来还是放弃了这种懒惰的办法。因为使用阀值管理可能出现一些意想不到的问题,什么问题现在还没想到,只是sybase不推荐在大系统中这样做!再加上本身系统有omni back备份软件,何必自找麻烦呢!
10) 什么SYBASE安装完后要增加TEMPDB的空间?
 ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1444&show=180
扩展后sp_helpdb tempdb看应改master设备上是data/log的
你use tempdb
sp_dropsegment 'default',tempdb,master
sp_dropsegment system,tempdb,master
sp_dropsegment logsegment,tempdb,master后,
sp_helpdb tempdb
select db_name(dbid),segmap,lstart,size,vstart,pad,unreservedpgs
from sysusages
where dbid=2
贴出来
如果第一行中segmap为0,就ok
你们回答的什么,驴唇不对马嘴(呵呵,开玩笑)
一般情况下数据库装好之后,都要给tempdb增加空间,因为在用户数据库中的很多插入,删除等操作需要用到tempdb数据库作为临时存储空间,所以要增大他的空间,否则可能你的事务不能执行 
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=185&show=120
sybase 临时数据库 
缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等操作,所以tempdb的优化应该受到特别的关注。本篇文章目的在于使你掌握临时数据库的优化策略以及临时表的优化使用。本文中,你将以调整临时库的位置开始,有步骤的完成临时数据库的优化,并在此过程中了解到优化临时数据库和临时表的一些方法和规则。
实验环境的要求:你应具有系统管理员的权限,系统中有auths和article表。
步骤:
第一步:调整临时库的位置
  tempdb数据库缺省放在master设备上,将临时数据库发在分离的设备上是更可取的。
1)  初始化一个用来存放临时数据库的设备
disk init
name="tempdb_dev",
physname="d:\sybase\example\tempdb.dat",
vdevno=13,
size=15360
(注意:如果将tempdb数据库放在多个设备上,需初始化多个数据库设备)
2)将临时数据库扩展到该一个设备上
  alter database tempdb on tempdb_dev=30
3)打开tempdb数据库,从段上删除master设备
sp_dropsegment "default",tempdb,master
sp_dropsegment logsegment,tempdb,master
4)发出如下命令,检查default段中是否不再包含master设备
     select dbid,name,segmap from sysusages,sysdevices
where sysdevices.low<=syusages.size+vstart
and sysdevices.high>=sysusages.size+vstart-1
and dbid=2
and(status=2 or status=3)
说明:若将临时数据库放在多个磁盘设备上,可以更好的利用并行查询特性来提高查询性能。
第二步:将临时数据库与高速缓冲进行绑定。
  由于临时表的创建、使用,临时数据库会频繁地使用数据缓存,所以应为临时数据库创建高速缓存,从而可以使其常驻内存并有助于分散I/O:
1、创建命名高速缓存
sp_cacheconfig “tempdb_cache","10m","mixed"
2、重新启动server
3、捆绑临时数据库到tempdb_cache高速缓存
sp_bindcache “tempdb_cache", tempdb
4、若有大的I/O,配置内存池
第三步:优化临时表
   大多数临时表的使用是简单的,很少需要优化。但需要对临时表进行复杂的访问则
应通过使用多个过程或批处理来把表的创建和索引分开。以下两种技术可以改善临时表的优化
slash;         在临时表上创建索引
1)  临时表必须存在
2)  统计页必须存在(即不能在空表上创建索引)
slash;         把对临时表的复杂的使用分散到多个批处理或过程中,以便为优化器提供信息
下面的这个过程需要进行优化:
create proc base_proc
as
select * into #huge_result from auths
select * from article, #huge_result where article.author_code=
#huge_result.author_code and sex="0"
使用两个过程可以得到更好的性能
1)create proc base_proc
as
select *
into #huge_result
from auths
exec select_proc
2)  create proc select_proc
     as
select *       from article,#huge_result
where  article.author_code=#huge_result.author_code and sex="0"
说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。
结论:通过本实验我们知道,临时数据库经过优化可以极大的提高系统性能。实际工作中,必须考虑具体应用的情况,需长时间经验的积累。

11) 怎样利用脚本自动关闭sybase数据库 
 ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1484&show=180
不知你什么平台,如果是unix,ksh
#!/bin/ksh 
LOGIN="`whoami`"
if [ "${LOGIN}" != "sybase" ]; then
 echo "`basename $0`: You should login as 'sybase'\n"
 exit 0
fi 
echo "\n\n"
{
isql -Usa -P -Syourservername > /dev/null 2>&1 <<ISQL
use master
go
shutdown SYB_BACKUP
go
shutdown
go
ISQL
}
12) 请教存储过程动态使用表 
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1488&show=180
你指动态sql
要12.0版本以上才支持
CREATE PROCEDURE dbo.mytt 
(@c varchar(25))  
AS 
  BEGIN 
declare @cc varchar(25)
select @cc = "select * from " + @c
exec (@cc)
  END
13) sybase中的跨库操作
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1489&show=150
假如本机server为loc_server,远程server为re_server 
在这两个server 各自的interface文件里都必须有定义
sp_configure "allow remote access"是否为1; 
在本机server上:
sp_addserver re_server
sp_addserver loc_server,LOCAL --->这样你select @@servername就有东西
在remote server 上:
sp_addserver loc_server
sp_addserver re_server,LOCAL 
在2个server 上
sp_addremotelogin ...... 
检查这两个参数
number of remote sites 
number of remote connections . 
然后:
如果isql从loc_server 到rs_server
connect to rs_server
disconnect 
rs_server...sp_who在loc_server上执行rs_server 上的sp_who
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1560&start=15&show=90
这里给你提供一篇这方面的资料:
如何实现两个Sybase Adaptive Server之间的数据通信 
 在进行以Sybase作为后台数据库的MIS系统开发时,经常会碰到需要在两个Sybase Adaptive Server之间进行数据通信的问题。要解决这一问题通常由两类方法:其一便是在前台来做;这种方法一般是通过建立多个事务,分别连接到不同的Server,在应用程序中通过编程实现数据的交换。这种方法的缺点在于可维护性差,还有一点是由于需要多个事务肯定也会影响效率。另外一类方法就是利用Sybase 的Transact SQL在后台来做。这类方法把数据的通信工作交给了SQL服务器自己去做。这种方法显而易见的一种有点便是可维护性好,当业务发生变化或服务器设置改变时可以很少修改大部分情况是不用修改应用程序。下面举一个简单的例子来介绍一下如何利用Transact SQL在后台实现SQL服务器之间的数据通信。 
---- 假设有两台操作系统都是Windows NT的Sybase SQL服务器LocalServer、RemoteServer,两者能够相互访问即应是通过网络相连的;在LocalServer和RemoteServer上分别有数据库LS_database和RS_database;在数据库LS_database和RS_database里分别有表LS_table和RS_table。 
---- 假设现在业务规则是当LS_table更新时需要更新RS_table。 
---- 要实现这种业务逻辑首先需要在RemoteServer的RS_database里建立至少一个带参数的存储过程设为pro_upd_rst,用来更新RS_table;其次需要在表LS_table上建立三个触发器:设为update_rst、delete_rst和insert_rst,在这些触发器中调用RS_database中的存储过程。即采用触发器传递参数进行远程存储过程调用(Remote Procedure Calls)的技术来实现。当LS_table发生更新时触发器update_rst、delete_rst和insert_rst中有一个会被触发,通过临时表inserted和deleted能够得到更新的信息,赋给相应变量,传递参数给pro_upd_rst并调用之。 
---- 需要提到的一点是Sybase数据库的缺省安装并没有设置RPC,所以还要对LocalServer进行一些设置工作,这一点比较有必要强调尤其是对于初学者来说。这些设置工作主要有以下几点: 
运行LocalServer接口程序管理器Dsedit添加一个Server,Server Name设置为"RemoteServer"(可以是其他字符串),编辑Server Address,添加网络协议和端口号,通常选择TCP/IP协议,Network Address 设为"RemoteServer,5000",其中RemoteServer(这里指的是该服务器在网络中的机器名)可以用其IP地址来代替。试一试能否Ping通RemoteServer。Ping通后进行下面的工作。 
在LocalServer添加一个远程服务器,可以通过运行LocalServer的Sybase Central,打开LocalServer的"remote servers"文件夹,双击"Add Remote Server",在编辑框内输入一个字符串设为"Remote_Local"(注意区分大小写),在下面的下拉列表框中选择"RemoteServer"(这是第1步中的Server Name),点击下一步后在列表框中选择"sql_server"完成。 
重新设置LocalServer一些与RPC有关的参数,也可以通过Sybase Central。右键点击LocalServer,单击谈出菜单的"configure",在下拉列表框种选择"Component Integration Services",注意下面的两个参数"cis rpc handling" 和 "enable cis",这两个参数的缺省值都是"0",应该把它们都改为"1"。由于"enable cis"是静态参数所以修改后需要重起数据库才能生效。最后最好检查一下RemoteServer的"enable remote access"参数的值是否为"1"(缺省情况应该是"1"否则改为"1"。 
---- 其中第1步可以通过编辑接口文件sql.ini(在Sybase根目录的"ini"子目录下)来代替,打开sql.ini在最后加入如下三行: 
[RemoteServer] master=TCP,RemoteServer,5000 query= TCP,RemoteServer,5000 
        保存并关闭。 
---- 第2、3步可以通过系统存储过程"sp_configure"来代替,在SQL Advantage或isql中执行下列语句: 
sp_addserver Remote_Local,null,RemoteServer 
        go sp_configure "enable cis",1 go sp_configure "cis rpc handling",1 
        go 
---- LocalServer配置号以后应该测试一下,运行SQL Advantage或isql连接LocalServer执行下列语句"exec Remote_Local.master.dbo.sp_help",再次强调一点其中的Remote_Local区分大小写。 
---- 上面所举的只是一个简单的例子,只能在LocalServer上调用RemoteServer上的存储过程,若要在RemoteServer调用上LocalServer上的存储过程则要在RemoteServer进行同样的设置(添加Remote Server、重新配置RemoteServer的参数等),并且要保证LocalServer的"enable remote access"的值为"1"。 
14) ASE在windows xp/2000上安装的二个注意的问题
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1522&show=150
本人近日在Windows xp上安装Sybase ASE12.5开发版作学习之用。遇到了一点麻烦,现将解决办法介绍给大家参考,如有还有类似的问题可联系我:email: learun@hotmail.com 
一、ASE12.4 在XP下中文乱码解决办法: 
  查看注册表,在键:key_local_machine\software\microsoft\windows NT\CurrentVersion\CurrentVerison中,可知当前系统版本为5.1 

  进入Sybase源安装目录,查看run.bat文件,找到一行:set JAVA_HOME=.\shared-1_0\jre1.2.2,
然后进入: .\shared-1_0\jre1.2.2\lib目录,将文件font.properties.zh.NT4.0的名称改为font.properties.zh.NT5.1即可。如果源目录在光 
盘上,将jre1.2.2目录、run.bat文件拷到硬盘上,修改run.bat中的JAVA_HOME项,然后运行run.bat. 

 安装后,基于中文的管理工具依然会出现乱吗,按上面的方法更改%sybase%\shared-1_0\jre1.2.2\lib中的font.properties.zh.NT4.0文件 
名。 
 一些windows操作系统的版本号: 
 windows9898
 windows nt4nt4.0
 windwos 2000nt5.0
 windows xpnt5.1 

二、网络地址 
 安装过程中,需要配置sql server和sybase xp server的网络地址。在安装界面上,对网络地址没有什么说明,如果输入错了,也没什么提 
示。它其实与协议类型有关,如果是TCP协议,它的构成为:机器名(或IP地址), 端口号。例如:myserver,9001 。在安装后也可以用 
“Dsedit"来编辑。网络地址很重要,如果错了,服务器无法启动。 
 另:当启动信息中含有:in module 'e:\rel12501\porttree\svr\sql\generic\ksource\strmio\n_winsock.c' 。不必为这句话迷惑,这是 
Sybase程序的硬编码输出,与你的E盘有无此文件无关。 
15) 关于数据库锁
::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1118&show=120
SYBASE 11.9以上的版本提供行级锁。
锁类型选择的确是sybase数据库设计的一个需要重要考虑的问题!见大家讨论的如此火热,特上点干材支持一把,来点关于lock的借介绍性资料! 

所支持的加锁机制 
2.1 全页加锁 
  全页加锁既是一个新术语,它又是由ASE(Adaptive Server Enterprise)在过去所支持的一种加锁类型。这种类型有下列特性: 
对所有可被访问的页面在页面级加锁 
当各种类型的页面以任何方式发生改变时,对这些排它性的页面进行加锁;而且这种加锁机制一直保持到该事务终止; 
当下一个所需的页面已经成功地获得,对那些已经释放的的当前访问页进行共享页面加锁(如果采用了第三层ANSI隔离,则把这种加锁机制保持到该事务终止为止) 
采用页级时间印记(timestamp)以确定是否发生改变,详细信息记录在事务日志中,以便在系统恢复时以向前或向后方式使用。 
  这种加锁方式常常提供性能最高的解决方案,特别是当应用设计时已经考虑了这些特性时更是如此。但是,有一些应用系统,当发生某些活动时,这种对整个页面进行加锁的方式就可能会对系统性能产生有重大意义的影响。对于那些面对诸如文件系统或其它已经支持更细小尺度加锁机制的数据库厂家产品的一般环境而设计的应用系统而言,这种情况尤其如此。 
  此外,还存在一系列问题,它们要围绕着更加困难的条件进行工作。它们通常要采用更加具有Sybase特性的解决方案。对于商用的应用软件制造厂商而言,对他们是一个挑战,因为这将要求他们必须跨越他们所支持的数据库平台,去完成维护其原代码的工作,而这个工作有相当工作量。在这个领域的基本问题如下: 
对已经按照升序值创建的非群聚性索引的最末端叶型页面存在着争议 
对非群聚性索引的表进行插入和查询时可能发生死锁; 
在按照群聚性的索引值进行更新和对非群聚性索引的表进行查询访问之间可能发生死锁; 
在没有作索引的表的最后一行可能发生冲突(尽管对最后的特定地址可以使用分区) ; 
有可能使行数很少的表之间发生潜在的冲突(尽管对特定的地址可以使用填充因子[ fillfactors]和每页最大行数[ max_rows_per_page]这两个参数) 
对每个页面两边进行加锁的需要常常被分割开来; 
如果一个表特别小,以致在一个单一页面中进行驻留,那么对单一行的访问实际上将破坏对整个表的加锁机制。 
2.2 仅对数据加锁 
  仅对数据加锁机制试图去解决本文前一节所关注的主要问题(其他的议题将在其它功能领域中加以解决)。这种加锁方式支持两类不同的工作方式: 数据行加锁和数据页加锁。在这两种情况中,对于它们所支持的加锁方式,都与以前的加锁机制有所不同。仅对数据加锁具有下列特性: 
在索引页面中不会破坏事务加锁。相反,而是采用了一种称之为锁存的机制。锁存是一种类似于旋转锁(spinlocks)的同步方法,它们与事务无关并且只保留很短的周期(一般而言,当一个任务在数据库中物理上改变一小片数据时,这个周期相当于在共享存贮区中在一个2K的页面改变某些字节数据的时间)一旦完成之后,这个任务将直接打开这个锁存。当这种情况还可能临时同其它组块时 ,因为这种锁存不能对服务器任务进行有上下文的切换,也不能涉及死锁,并且只能保持主要的一小段时间,所以它们不能产生有显著意义的争用。 
采用一个RID对单一行进行数据行加锁(行标识[RID----Row ID]是逻辑页号与所在页面上该行号的组合); 
支持固定的行标识 RIDs, 它可以是向前的,允许不进行其RID的改变,就完成数据行的移动。当一行变大超过了它的可用空间时,采用上述结果对非群聚索引不需要进行任何改变。 
不需要进行任何争用就可以在表的尾部进行插入操作,这一功能已经增加进来。. 
支持采用范围加锁、下一个关键字加锁和无限大加锁等方式对逻辑范围值进行加锁 
支持由最顶层操作所导致的页面分割。这些情况直接加以提交,"系统"事务可以导致在更短一点的时间周期里保持分裂的页面处于锁定状态。 
  为了支持这些变化,需要对采用的存贮表结构进行一系列改善。这些改进的主要效果如下: 
群聚索引现在被存贮为象许多人所熟悉的IBM DB2产品所采用的"放置索引"("placement indexes.")方式。这种结构类似于非群聚性的索引,需要类似的空间总量。这种修正的结构导致了在数据初始存贮时可以按照顺序跨数据页进行存储,但是当发生插入时,它们就要尽可能紧密存放以便在正确的逻辑页面中不存在页面分割。此外,在数据页中的数据顺序在新行增加时是不进行维护整理的。这种索引的应用使每个群聚化的索引周游增加了一次I/O操作。 
行位移表已经增加到索引页和数据页中。这种增加和新的行索引行存贮格式具有使每个索引页面所存贮的索引条目个数减少的潜在能力。 
固定行标识(RIDS)。当一行移动时,对于分配新行位置的向前地址被放在用于驻留该行的位置上。当这种移动需要改变非群聚性索引时,对该行的访问需要增加一次I/O操作以得到'向前'的位置。 
一般而言,索引将更小和更短,这是因为如下原因: 
从每个叶级页面中采用双重键限制机制来限制双重键(Duplicate key)例如,如果值"绿"("GREEN")在下列行标识(RIDs)值等于123-1,234-2,和345-3的行中, 就分别存贮值“绿”("GREEN"),123-1,234-2,345-3,而不是存贮值"绿"("GREEN,")三次。在每个索引页中每个值只存贮一次。 
在非群聚性索引树的非叶型结点中将后缀实行压缩(例如,如果键值是"GREEN"和"HAMILTON",而在这两个值之间发生分裂,那么就在非页级索引页面中存储"G"和"H"
2.3 数据页和数据行加锁 
  只对数据加锁机制支持两种方式:数据页加锁和数据行加锁。这些与它们的工作方式和所提供的功能相类似。这两种方式仅在对数据访问产生阻碍作用时,在加锁的尺度上有所区别。在数据页加锁方式下再采用数据行加锁方式具有两种作用(一种起正向作用,另一种起反向作用)。首先,较小尺度加锁机制的使用可能导致减少争用与冲突,然而当大量数据发生变化时,就有可能对加锁产生大量阻碍的情况发生。 
2.4 特定使用的加锁类型 
  除非对配置参数加以特定,对所有的表都予置了隐含的全页面加锁机制。 
sp_configure 'lock scheme', [allpages | datapages | datarows] 
  当数据库从原先版本的服务器中转储出来重新加载时,所有的表都被定义为全页面加锁的表。当建立一个新表时,可以不使用这个缺省值,可采用如下的句法格式: 
create table <tablename>… lock [allpages | datapages | datarows] 
  为了在使用的一个表中改变加锁类型,可以采用如下的句法格式: 
alter table <tablename> lock [allpages | datapages | datarows] 
  在一个现存的表中改变加锁方式,将引起下列三种行动后果发生: 
首先,如果一张表从全页加锁转变为仅对数据加锁,或者从仅对数据加锁转变为全页加锁,在这两种类型之间就要对表进行选择以允许进行存贮格式改变。如果这是一个分区表,就要同时假定必要的并行级别和工作线程已经配置好的情况下,才能执行。 
其次, 对表中的群聚性索引必须重新创建。因为我们能保证数据,所以如果从全页加锁方式转换为只对数据加锁时,这种重新创建可以通过"with sorted_data"来完成。然而,当从仅对数据加锁机制转换为全页加锁方式时,就要进行并行的索引创建操作。(请注意:如果这是一个分区表时,那么并行等级和工作线程的数目必须加以配置才能允许进行这种改变,否则这种迁移将会失败) 
最后,非群聚性的索引将被重建,如果服务器已经为并行处理所加以配置,当进行本步骤时将加以采用。 
  由于这些活动同潜在的工作量有关,从全页加锁机制改变为仅对数据加锁或从仅对数据加锁改变为全页加锁机制都可能是耗费时间的活动。为了标注这一点,有以下一些选择: 
如果可能的话,应该配置使用并行方式。这至少对执行非群聚性索引的哈斯(杂凑,即hashed)创建方法是必须的,但是如果可能的话,采用分区表和分区扫描将使系统得到更大的改进。 
在选择进入和创建群聚性的索引之后,该任务将被设置检查点(checkpointed )所以,如果有充分的硬件资源,通过允许在任何一个时间点上,检查点任务可以具有多于10个(系统缺省值)的异步I/O请求,利用dbcc进行调谐将能够带来有益的效果。('maxwritedes', number) 
进一步作为降低使用检查点成本的一种方法,在相关的高速缓冲池(cache pool)、大数据量的I/O操作中,采用对高淘汰程度进行标记的方法,并允许清洁程序(好象家庭主妇一样)保持特别活跃的状态,将为那些检查点需要从高速缓冲池中刷新较"脏"的页面的而增加的I/O操作次数,并因此花费了在检查点上的时间,都能够大大减少作出贡献。 
如果预先进行了配置,则可以对并行的选择进入可以使用预先分配的盘区。所以,通过将sp_configure number of pre-allocated extents设置为16也将对系统性能有明显的积极的效果。 
  备注:在仅对数据加锁类型之间进行改变不需要对数据进行备份, 而且执行起来只需很短的一段时间。 
[以上为摘自sybase公司站点上的资料] 
据我个人使用经验,我觉得对于并行性较高的应用要充分考虑使用行级锁,这样对于提高并发性能至关重要!当然,事务都存在利弊两方面,使用行级锁,也会带来一些相应的弊端,比如使用的锁越多,占用的内存也越多,在使用行级锁的表上频繁的进行数据删除、插入操作久而久之会造成数据库碎片的大量生成,数据库性能会下降,这就需要定时进行reorg操作,但该操作比较耗时,且影响业务!
16) 请问!怎样设置自动清log,和temp的阀值?
  ::URL::http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1507&show=120

一般我们可以为某段设置多个阀值,但只需在达到最后机会阀值时作些空间清理的操作.
第一步,在你的数据库中设置阀值,并指定达到阀值后的处理过程: 
查看当前数据库某段的最后机会阀值:
sp_helpthreshold "default"
或者察看其他段的信息。
修改某段的最后机会阀值:
sp_modifythreshold 数据库名,段名,自由空间名,[新过程名[,新自由空间名[,新段名]]]
sp_modifythreshold mydb,"default",200,NULL,175
将最后机会阀值由200页调整到175页。
具体其他操作,可以参考相关手册! 
第二步,编写阀值处理过程:
create procedure sp_thresholdaction 
               @dbname varchar(30),
               @segmentname varchar(30),
        @space_left int,
    @status int
as
       declare @SpaceLeft varchar(20),
               @Status varchar(20)
       select @SpaceLeft=str(@space_left,6,0)
       select @Status=str(@status,6,0)
       print "Log is dumpped('%1!' for '%2!',SpaceLeft:'%3!',Status:'%4)',
       and is dumped.",@segmentname,@dbname,@SpaceLeft,@Status
       dump transaction tempdb to with truncate_only
return 

不过,我还是不建议用最后机会阀值来进行自动维护。 
17)Unix下的Sybase配置
use master
execsp_configure 'allow updates', 1
reconfigure with override
go
--配置SYBASE数据库参数是否可修改
execsp_configure "MAX online engines",2
reconfigure with override
go
--最大的并行CPU数
execsp_configure "total memory",85000
reconfigure with override
go
--配置SYBASE数据库使用物理内存的最大值,一般为50%-70%物理内存,单位为SYBASE数据块的大小,一般为2K
execsp_configure "procedure cache percent",25
reconfigure with override
go
--存储过程占用的CACH的百分比,如果存在很大而且使用频繁的存储过程,建议将此值设大一点
execsp_configure "number of locks",10000
reconfigure with override
go
--SYBASE数据库中LOCK的数量,考虑对数据库中所有记录的并发数量。

execsp_configure "number of device",50
reconfigure with override
go
--SYBASE中设备的数量,注意SYBASE中设备的概念
execsp_configure "number of open databases",50               
reconfigure with override
go
--并发打开数据库的数量。
execsp_configure "number of user connections",200
reconfigure with override
go
--并发用户连接数
execsp_configure "number of open objects ",1000
reconfigure with override
go
--并发打开数据库单元的数量,其中包括所有的如游标、存储过程、表
execsp_configure "number of open indexes",1000
reconfigure with override
go

execsp_configure "max parallel degree ",1
reconfigure with override
go
--并行等级,设不设无所谓
execsp_configure "page lock promotion HWM",500
reconfigure with override
go

execsp_configure "page lock promotion LWM",500
reconfigure with override
go                     

execsp_configure "page lock promotion PCT",100
reconfigure with override
go 

execsp_configure 'number of sort buffers', 5000
reconfigure with override
go
--使用索引时可占用的内存数
execsp_configure 'allow updates', 0
reconfigure with override
go
18)
我重装了sybase系统,恢复了用户数据库,发现login中的项目与用户数据库中user里的项目错位了,比如:原来login中aaa对应用户数据库中的aaa用户,现在login中aaa对应用户数据库中的bbb用户。解决办法:
     1、先根据用户数据库中user的项目建好login中项目。
     2、允许更新系统表。
     3、修改用户数据库中sysusers的suid为master中syslogins的suid。(我是手工做的,如果有规律的话可以用sql语句完成。)
19)于tempdb的优化 
缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等操作,所以tempdb的优化应该受到特别的关注。 
  第一步:将临时数据库与高速缓冲进行绑定。
  由于临时表的创建、使用,临时数据库会频繁地使用数据缓存,所以应为临时数据库创建高速缓存,从而可以使其常驻内存并有助于分散I/O:
  1、创建命名高速缓存
    sp_cacheconfig “tempdb_cache”,”10m”,”mixed”
  2、重新启动server
  3、捆绑临时数据库到tempdb_cache高速缓存
    sp_bindcache “tempdb_cache”, tempdb
  4、若有大的I/O,配置内存池
  第二步:优化临时表
  大多数临时表的使用是简单的,很少需要优化。但需要对临时表进行复杂的访问则、
  应通过使用多个过程或批处理来把表的创建和索引分开。以下两种技术可以改善临时表的优化
  1、在临时表上创建索引
    1)临时表必须存在
    2)统计页必须存在(即不能在空表上创建索引)
  2、把对临时表的复杂的使用分散到多个批处理或过程中,以便为优化器提供信息
    下面的这个过程需要进行优化:
     create proc base_proc
     as
     select * into #huge_result from auths
     select * from article, #huge_result where article.author_code=
     #huge_result.author_code and sex=”0”
  使用两个过程可以得到更好的性能
  1)
    create proc base_proc 
    as
    select *
    into #huge_result
    from auths
    exec select_proc
  2) 
    create proc select_proc 
    as
    select * from article,#huge_result
    where article.author_code=#huge_result.author_code and sex=”0”
  说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。
20)如何扩展master数据库空间
master数据库只能扩展在master设备上.那么当master设备已经没有足够的空间可使用时,请按以下步骤操作:
(此操作过程是以UNIX操作系统为例.SYBASE安装路径为/sybase) 
  1.备份master数据库
   启动backup server,进入isql环境执行:
    1>dump database master to '/sybase/master.dump'
    2>go
   hut down SQL/ASE Server
    1>shutdown
    2>go
  2.创建新的足够大的master设备
   $buildmaster -d<master_device> -ssize(size以2K为单位)
   例:$buildmaster-d/sybase/data/master.dat -s102400
  3.修改RUN_servername文件
   编辑RUN_server_name文件,-d参数指向新建的设备名。 
  4.单用户模式重启server
   $startserver -f RUN_servername -m
  5.执行installmaster脚本
  6.由备份文件装载master数据库
   1>load database master from '/sybase/master.dump'
   2>go
  7.修改sysdevices信息
   sp_configure 'allow updates', 1
    go
    begin tran
    go
   update sysdevices set high = 102399 , phyname = 'e:\sybase\data\master_test.dat' where name = 'master'
    go
    (102399=200*512-1 master设备大小为200M)
    commit tran
    go
  8.扩展master数据库
   1>alter database master on master设备名称=size(此值以M为单位)
   2>go
   例:alter database master on master=10
     将master数据库在master设备上扩展10M

21)加锁机制
全页加锁
  全页加锁既是一个新术语,它又是由ASE(Adaptive Server Enterprise)在过去所支持的一种加锁类型。这种类型有下列特性:
对所有可被访问的页面在页面级加锁 
当各种类型的页面以任何方式发生改变时,对这些排它性的页面进行加锁;而且这种加锁机制一直保持到该事务终止; 
当下一个所需的页面已经成功地获得,对那些已经释放的的当前访问页进行共享页面加锁(如果采用了第三层ANSI隔离,则把这种加锁机制保持到该事务终止为止) 
采用页级时间印记(timestamp)以确定是否发生改变,详细信息记录在事务日志中,以便在系统恢复时以向前或向后方式使用。 
  这种加锁方式常常提供性能最高的解决方案,特别是当应用设计时已经考虑了这些特性时更是如此。但是,有一些应用系统,当发生某些活动时,这种对整个页面进行加锁的方式就可能会对系统性能产生有重大意义的影响。对于那些面对诸如文件系统或其它已经支持更细小尺度加锁机制的数据库厂家产品的一般环境而设计的应用系统而言,这种情况尤其如此。
  此外,还存在一系列问题,它们要围绕着更加困难的条件进行工作。它们通常要采用更加具有Sybase特性的解决方案。对于商用的应用软件制造厂商而言,对他们是一个挑战,因为这将要求他们必须跨越他们所支持的数据库平台,去完成维护其原代码的工作,而这个工作有相当工作量。在这个领域的基本问题如下:
对已经按照升序值创建的非群聚性索引的最末端叶型页面存在着争议 
对非群聚性索引的表进行插入和查询时可能发生死锁; 
在按照群聚性的索引值进行更新和对非群聚性索引的表进行查询访问之间可能发生死锁; 
在没有作索引的表的最后一行可能发生冲突(尽管对最后的特定地址可以使用分区) ; 
有可能使行数很少的表之间发生潜在的冲突(尽管对特定的地址可以使用填充因子[ fillfactors]和每页最大行数[ max_rows_per_page]这两个参数) 
对每个页面两边进行加锁的需要常常被分割开来; 
如果一个表特别小,以致在一个单一页面中进行驻留,那么对单一行的访问实际上将破坏对整个表的加锁机制。 
仅对数据加锁
  仅对数据加锁机制试图去解决本文前一节所关注的主要问题(其他的议题将在其它功能领域中加以解决)。这种加锁方式支持两类不同的工作方式: 数据行加锁和数据页加锁。在这两种情况中,对于它们所支持的加锁方式,都与以前的加锁机制有所不同。仅对数据加锁具有下列特性:
在索引页面中不会破坏事务加锁。相反,而是采用了一种称之为锁存的机制。锁存是一种类似于旋转锁(spinlocks)的同步方法,它们与事务无关并且只保留很短的周期(一般而言,当一个任务在数据库中物理上改变一小片数据时,这个周期相当于在共享存贮区中在一个2K的页面改变某些字节数据的时间)一旦完成之后,这个任务将直接打开这个锁存。当这种情况还可能临时同其它组块时 ,因为这种锁存不能对服务器任务进行有上下文的切换,也不能涉及死锁,并且只能保持主要的一小段时间,所以它们不能产生有显著意义的争用。 
采用一个RID对单一行进行数据行加锁(行标识[RID----Row ID]是逻辑页号与所在页面上该行号的组合); 
支持固定的行标识 RIDs, 它可以是向前的,允许不进行其RID的改变,就完成数据行的移动。当一行变大超过了它的可用空间时,采用上述结果对非群聚索引不需要进行任何改变。 
不需要进行任何争用就可以在表的尾部进行插入操作,这一功能已经增加进来。. 
支持采用范围加锁、下一个关键字加锁和无限大加锁等方式对逻辑范围值进行加锁 
支持由最顶层操作所导致的页面分割。这些情况直接加以提交,"系统"事务可以导致在更短一点的时间周期里保持分裂的页面处于锁定状态。 
  为了支持这些变化,需要对采用的存贮表结构进行一系列改善。这些改进的主要效果如下:
群聚索引现在被存贮为象许多人所熟悉的IBM DB2产品所采用的“放置索引”("placement indexes.”)方式。这种结构类似于非群聚性的索引,需要类似的空间总量。这种修正的结构导致了在数据初始存贮时可以按照顺序跨数据页进行存储,但是当发生插入时,它们就要尽可能紧密存放以便在正确的逻辑页面中不存在页面分割。此外,在数据页中的数据顺序在新行增加时是不进行维护整理的。这种索引的应用使每个群聚化的索引周游增加了一次I/O操作。 
行位移表已经增加到索引页和数据页中。这种增加和新的行索引行存贮格式具有使每个索引页面所存贮的索引条目个数减少的潜在能力。 
固定行标识(RIDS)。当一行移动时,对于分配新行位置的向前地址被放在用于驻留该行的位置上。当这种移动需要改变非群聚性索引时,对该行的访问需要增加一次I/O操作以得到‘向前’的位置。 
一般而言,索引将更小和更短,这是因为如下原因: 
从每个叶级页面中采用双重键限制机制来限制双重键(Duplicate key)例如,如果值“绿”("GREEN”)在下列行标识(RIDs)值等于123-1,234-2,和345-3的行中, 就分别存贮值“绿”("GREEN”),123-1,234-2,345-3,而不是存贮值“绿”("GREEN,”)三次。在每个索引页中每个值只存贮一次。 
在非群聚性索引树的非叶型结点中将后缀实行压缩(例如,如果键值是"GREEN”和"HAMILTON”,而在这两个值之间发生分裂,那么就在非页级索引页面中存储"G”和"H”)。
 数据页和数据行加锁
  只对数据加锁机制支持两种方式:数据页加锁和数据行加锁。这些与它们的工作方式和所提供的功能相类似。这两种方式仅在对数据访问产生阻碍作用时,在加锁的尺度上有所区别。在数据页加锁方式下再采用数据行加锁方式具有两种作用(一种起正向作用,另一种起反向作用)。首先,较小尺度加锁机制的使用可能导致减少争用与冲突,然而当大量数据发生变化时,就有可能对加锁产生大量阻碍的情况发生。
 特定使用的加锁类型
  除非对配置参数加以特定,对所有的表都予置了隐含的全页面加锁机制。
sp_configure ‘lock scheme’, [allpages | datapages | datarows]
  当数据库从原先版本的服务器中转储出来重新加载时,所有的表都被定义为全页面加锁的表。当建立一个新表时,可以不使用这个缺省值,可采用如下的句法格式:
create table <tablename>… lock [allpages | datapages | datarows]
  为了在使用的一个表中改变加锁类型,可以采用如下的句法格式:
alter table <tablename> lock [allpages | datapages | datarows]
  在一个现存的表中改变加锁方式,将引起下列三种行动后果发生:
首先,如果一张表从全页加锁转变为仅对数据加锁,或者从仅对数据加锁转变为全页加锁,在这两种类型之间就要对表进行选择以允许进行存贮格式改变。如果这是一个分区表,就要同时假定必要的并行级别和工作线程已经配置好的情况下,才能执行。 
其次, 对表中的群聚性索引必须重新创建。因为我们能保证数据,所以如果从全页加锁方式转换为只对数据加锁时,这种重新创建可以通过"with sorted_data"来完成。然而,当从仅对数据加锁机制转换为全页加锁方式时,就要进行并行的索引创建操作。(请注意:如果这是一个分区表时,那么并行等级和工作线程的数目必须加以配置才能允许进行这种改变,否则这种迁移将会失败) 
最后,非群聚性的索引将被重建,如果服务器已经为并行处理所加以配置,当进行本步骤时将加以采用。 
  由于这些活动同潜在的工作量有关,从全页加锁机制改变为仅对数据加锁或从仅对数据加锁改变为全页加锁机制都可能是耗费时间的活动。为了标注这一点,有以下一些选择:
如果可能的话,应该配置使用并行方式。这至少对执行非群聚性索引的哈斯(杂凑,即hashed)创建方法是必须的,但是如果可能的话,采用分区表和分区扫描将使系统得到更大的改进。 
在选择进入和创建群聚性的索引之后,该任务将被设置检查点(checkpointed )所以,如果有充分的硬件资源,通过允许在任何一个时间点上,检查点任务可以具有多于10个(系统缺省值)的异步I/O请求,利用dbcc进行调谐将能够带来有益的效果。(‘maxwritedes’, number) 
进一步作为降低使用检查点成本的一种方法,在相关的高速缓冲池(cache pool)、大数据量的I/O操作中,采用对高淘汰程度进行标记的方法,并允许清洁程序(好象家庭主妇一样)保持特别活跃的状态,将为那些检查点需要从高速缓冲池中刷新较“脏”的页面的而增加的I/O操作次数,并因此花费了在检查点上的时间,都能够大大减少作出贡献。 
如果预先进行了配置,则可以对并行的选择进入可以使用预先分配的盘区。所以,通过将sp_configure number of pre-allocated extents设置为16也将对系统性能有明显的积极的效果。 
  备注:在仅对数据加锁类型之间进行改变不需要对数据进行备份, 而且执行起来只需很短的一段时间。 
[以上为摘自sybase公司站点上的资料] 
据我个人使用经验,我觉得对于并行性较高的应用要充分考虑使用行级锁,这样对于提高并发性能至关重要!当然,事务都存在利弊两方面,使用行级锁,也会带来一些相应的弊端,比如使用的锁越多,占用的内存也越多,在使用行级锁的表上频繁的进行数据删除、插入操作久而久之会造成数据库碎片的大量生成,数据库性能会下降,这就需要定时进行reorg操作,但该操作比较耗时,且影响业务!
22)日志问题普及篇
以下资料源于sybase.com.cn
 SSYBASE SQL Server 的每一个数据库,无论是系统数据库(master,model, sybsystemprocs, tempdb),还是用户数据库,都有自己的transaction log,每个库都有syslogs表。Log记录用户对数据库修改的操作,所以如果不用命令清除, log会一直增长直至占满空间。清除log可用dump transaction 命令;或者开放数据库选项trunc log on chkpt,数据库会每隔一段间隔自动清除log。管理好数据库log是用户操作数据库必须考虑的一面。 
  下面就几个方面谈谈log及其管理: 
  一、SQL Server 如何记录及读取日志信息 
  我们知道,SQL Server是先记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 间隔是由SQL Server 根据系统活动和系统表sysconfigures中的恢复间隔(recovery interval)值计算出的。通过指定系统恢复所需的时间总量,恢复间隔决定了checkpoint 的频率。 
  如果数据库开放trunc log on chkpt选项,则SQL Server在数据库系统执行checkpoint时自动清除log。但用户自己写入执行的checkpoint命令并不清除log,即使trunc log on chkpt选项开放。只有在trunc log on chkpt选项开放时,SQL Server自动执行checkpoint动作,才能自动清除log 。这个自动的checkpoint动作在SQL Server中的进程叫做checkpoint进程。当trunc log on chkpt选项开放时,checkpoint进程每隔0秒左右清除log,而不考虑recovery interval设置时间的间隔。 
  三、Transaction log 的大小 
  没有一个十分严格的和确切的方法来确定一个数据库的log应该给多大空间。对一个新建的数据库来说,log大小为整个数据库大小的20%左右。因为log记录对数据库的修改,如果修改的动作频繁,则log的增长十分迅速。所以说log空间大小依赖于用户是如何使用数据库的。 
  例如: 
update,insert和delete 的频率 
每个transaction 中数据的修改量 
SQL Server系统参数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,doa mpg) 
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 loc,阻止其他用户在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 管理 
  SQL Server提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。
在使用Sybase数据库管理系统(SQL Server)开发企业应用系统时,或者开发好的数据库应用系统投入实际运行后,由于用户不断地增加或者修改数据库中的数据,用户数据库的自由存储空间会日益减少。特别是数据库日志,增长速度很快。一旦自由空间用尽,SQL Server在缺省情况下挂起所有数据操纵事务,客户端应用程序停止执行。这样有可能会影响企业日常业务处理流程。Sybase SQL Server System10提供自动监视数据库自由存贮空间的机制——阈值管理,当数据库使用剩余空间低于一定值时,通过执行一个自定义的存储过程,来控制自由空间。在空间用完之前,采取相应措施,这样有利于业务处理顺利进行。如果能充分利用SQL Server的阈值管理功能,用户能使一些数据库管理工作自动化,规程化。所以,在此我们将SQL Server这一重要功能介绍给读者。 
  SQL Server的阈值管理允许用户为数据库的某个段上的自由空间设置阈值和定义相应的存储过程。当该段上的自由空间低于所置阈值时,SQL Server自动运行相应存储过程。与阈值相对应的存储过程由用户定义,SQL Server不提供。一般来说,数据库管理员可通过这些存储过程来完成一些日常管理事务,例如: 
备份数据库,清理日志和删除旧数据 
备份数据库日志 
扩展数据库空间 
拷贝出表中的内容,清理日志,等等。 
(一)段(Segment) 
  SQL Server的阈值管理是基于段(Segment)的,因此,让我们先回顾一下段的概念。每个数据库创建时,它有三个缺值段:(1)System段;(2)default段;(3) logsegment段。以后,还可以为该数据库增加用户自定义段。将来所有的数据库对象都建立在这些段上,要么是系统定义的段,要么是用户定义的段。数据库的系统表存放在System段上。在没有指明段时,建立的对象存放在default段上。数据库的事务日志放在logsegment段上,该段是通过使用建立数据库( Create database )命令的log on 选项来定义的。 
(二)最后机会阈值(Last_chance Threshold) 
  缺省情况下,SQLServer监测日志段的自由空间,当自由空间量低于事务日志能成功转储的需要时,SQL Server运行sp_ thresholdaction过程。此自由空间量称为最后机会阈值( Last_chance threshold ),它由SQL Server计算得来,并且用户不能改变。 
sp_thresholdaction必须由用户编写,SQL Server不提供。另外,如果最后机会阈值越出,那么在日志空间释放前,SQL Server一直挂起所有事务。但可以使用sp_dboption对某一数据库来改变这一行为。设置abort tran on log full选项为true,可使得最后机会越出时,SQL Server撤回所有还未被注册的事务。 
(三)阈值管理 
  系统缺省建立最后机会阈值,由用户编写缺省阈值处理存储过程( sp_thresholdaction ),来控制自由空间。除此之外,还可以使用以下存储过程管理阈值: 
sp_addthreshold 建立一个阈值 
sp_dropthreshold 删除一个阈值 
sp_helpthreshold 显示阈值有关的信息 
sp_dboption 改变阈值的“挂起或取消”行为和取消阈值管理 
sp_helpsegment 显示某个段上空间大小和自由空间大小的信息 
(四)增加阈值(sp_addthreshold) 
  它用于创建阈值( threshold )来监测数据库段中空间的使用。如果段中自由空间低于指定值,SQL Server运行有关的存储过程。增加阈值的命令语法为:
sp_addthreshold database, segment, free_pages, procedure  
  其中: 
database——要添加阈值的数据库名。必须是当前数据库名称。 
segment——其自由空间被监测的段。当指定“default“ 段时要用引号。 
free_pages——阈值所指的自由空间页数。当段中自由空间低于该标准时,SQL Server运行有关存储过程。 
procedure——当segment中的自由空间低于free_pages时,SQL server 执行该存储过程。该过程可以放置在当前SQL Server或Open server的任意数据库中。但是,超出阈值时,不能执行远程SQL Server上的存储过程。 
  例如:sp_addthreshold pubs2, logsegment, 200, dump_transaction 
  其中,存储过程定义为: 
create procedure dump_transaction 
@ dbname varchar (30), 
@ segmentname varchar (30), 
@ space_left int, 
@ status int 
as 
dump transaction @dbname to "/dev/rmtx"  
  那么,当日志段上可用空间小于200页时,SQL Server运行存储过程dump_transaction,将pubs2 数据库的日志转储到另一台设置上。 
  sp_addthreshold不检查存储过程存在已否。但当阈值越出时,如果存储过程不存在,SQL Server把错误信息送到错误日志( errorlog )中。系统允许每个数据库有256个阈值,而同一段上二个阈值之间的最小空间为128页。其存储过程可以是系统存储过程,也可是在其它数据库里的存储过程,或者Open Server远过程调用。 
(五)删除阈值(sp_dropthreshold) 
  它删除某个段的自由空间阈值,但是不能删除日志段的最后机会阈植。删除阈值的命令语法为: 
sp_dropthreshold database_name,segment_name,free_pages  
  其中三个参数分别为:阈值所属数据库名,阈值所监测的自由空间的段名,和自由空间页。例如: 
sp_dropthreshold pubs2, logsegment, 200 
删除pubs2库中logsegment段的阈值200。 
(六)显示阈值(sp_helpthreshold) 
  它报告当前数据库上与所有阈值有关的段,自由空间值,状态以及存储过程或报告某一特定段的所有阈值。显示阈值的语法为: 
sp_helpthreshold [segment_name]  
  其中segment_name是当前数据库上一个段的名字。 
  例如: 
sp_helpthreshold logsegment 显示在日志段上的所有阈值 
sp_helpthreshold 显示当前数据库上所有段上的全部阈值 
(七)sp_dboption的新选择 
  abort xact when log is full  
  当日志段的最后机会阈值被超越时,试图往该日志段上记日志的用户进程将被挂起还是被撤回?缺省情况下系统挂起所有进程。但是可以使用sp_aboption改变它。执行sp_dboption salesdb,"abort xact when log is full",true 命令后,一旦日志满了,则数据库修改事务将会被回滚。 
  disable free space acctg 
  这个选择取消数据库中的阈值管理,但不影响最后机会阈值。执行:sp_dboption saledb, "disable free space acctg",true 它取消对非日志段上自由空间的统计。取消后,对系统有以下影响: 
SQL Server仅计算日志段上的自由空间 
日志段上的阈值继续处于活动状态 
在数据段上,系统表不改变,并且sp_spaceused得到的值是该选择被取消时刻的值 
数据库段上的阈值失效 
恢复加快 
(八)阈值的触发过程 
  频繁的插入和删除可能会使数据库段中的空间波动,阈值可能被多次超越,SQL Server使用系统变量@@thresh_hysteresis,避免连续触发阈值存储过程。它的值由SQL Server设定。在system 10.0中,@@thresh_hysteresis是64页。 
  如图所示: 
  因此,增加一个阈值,它必须与下一个最近的阈值相距至少2*@@thresh_hysteresis页。 
  一个阈值被触发,需要以下几个条件成立: 
必须到达阈值 
阈值处于活动状态(即它被建立后或者自由空间达到阈值减于@@thresh_hysteresis) 
只有自由空间减少阈值才触发,如果自由空间增加,它永远不触发 
23)如何修改Win98开始菜单中的中文乱码
当Open Client125安装在Windows 98上时,在开始菜单中的Sybase应用程序名称会出现乱码,请按以下步骤纠正:
  在c:\windows\start menu\programs\sybase目录下更改以下文件名:
  Dsedit瀹炵敤绋嬪簭——Dsedit实用程序
  cscfg瀹炵敤绋嬪簭——Ocscfg实用程序
  鍗歌浇——卸载 
  在c:\windows\start menu\programs\sybase\ODBC driver目录下更改以下文件名: 
  ODBC绠$悊绋嬪簭——ODBC管理程序 
  ODBC椹卞姩绋嬪簭甯姪——ODBC驱动程序帮助 
  在c:\windows\start menu\programs\sybase\OLE DB Provider目录下更改以下文件名: 
  OLE DB鎻愪緵绋嬪簭甯姪——OLE DB提供程序帮助 
  閰嶇疆绠$悊绋嬪簭——配置管理程序 
  閰嶇疆绠$悊甯姪——配置管理帮助
24)如何更改服务器的字符集为cp936
(这里SYBASE的安装路径为c:\sybase) 
1.c:\>cd \sybase\charsets\cp936 
2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936 
3.在SQL环境中 
1>select name,id from syscharsets 
2>go 
找到name为cp936对应的id(假设为117) 
.1>sp_configure "default character set id,117 
2>go 
5.重启server两次 
(注:第一次启动后,server会自动宕掉,需要第二次重启后才能使用)
25)一旦客户突然退出或系统重启,SQL Server如何回滚事务?
当客户端退出注册或者突然死机,SQL Server应回滚客户端送来的,但未提交的事务。对于Unix和VMS客户端,其操作系统会通知SQL Server它的连接已丢失, SQL Server然后回退未提交的数据库事务。而对于PC客户端,如果TCP IP Keepalive 被设置成允许状态,它定期地检查网络端口是否存活,一旦网络连接断开,SQL Server就被通知到,它便回退未提交事务。但是,如果Keepalive被关闭,SQL Server将等待客户端的联络。服务器线索便无期限地处于发送或者接收睡眠状态。那么,未提交事务直到下次重新启动服务器时,才能被回退。
26)为什么有时候数据库事务日志满了,使用Dump transaction with no-log仍不能截断日志?
有两种情况,可能出现这个问题。一是应用系统给SQL Server发送了一个用户自定义事务,一直未提交,这个最早活跃事务阻碍系统截断日志。二是客户端向SQL Server发送了一个修改数量大的事务,清日志时,该事务还正在执行之中,此事务所涉及的日志只能等到事务结束后,才能被截掉。
  对于第一种情况,只要督促用户退出应用或者提交事务,系统管理员便可清掉日志。因为给SQL Server发送Dump transaction with no-log或者with truncate-only,它截掉事务日志的非活跃部分。所谓非活跃部分是指服务器检查点之间的所有已提交或回退的事务。而从最早的未提交的事务到最近的日志记录之间的事务日志记录被称为活跃的。从此可以看明,打开的事务能致使日志上涨,因为在最早活跃事务之后的日志不能被截除。
  对于第二种情况,道理也同上。只是在处理它时,需慎重从事。如果这个大事务已运行较长时间,应尽量想法扩大数据库日志空间,保证该事务正常结束。若该事务被强行回滚,SQL Server需要做大量的处理工作,往往是正向执行时间的几倍,系统恢复时间长,可能会影响正常使用的时间。
27)即使表上没有建立索引,为什么BCP操作仍记日志?
虽然表上没有索引,服务器执行快速BCP,BCP往表里加载数据仍有可能使日志表溢出,这是因为BCP需要记录页面空间分配日志。如果表上没有索引,并且数据库选项“select into/bulk copy”被置成true, 服务器就不给新加载的记录记日志。
  另外,如果表上有索引和触发器,那么BCP是慢速的。
28)如何生成bcp命令文件(以pubs2为例)
本文适应于isql 11.*, 可通过isql -v得到版本
编辑一个文本文件select.sql,内容如下: 
            set nocount on
            use pubs2
            go
            select "bcp pubs2.." + name + " out " + name + ".bcp -Usa -P -c "
            from sysobjects where type="U"
            go
如果是unix, 执行: 
            isql  -Usa   -P  -b -i select.sql  -o bcpout
            chmod  +x   bcpout
如果是Windows, 执行: 
            isql  -Usa   -P  -b -i select.sql  -o bcpout.bat 
将select.sql中的out换为in, 重复以上步骤即可得到bcp in的命令文件
29)如何在AIX上后备数据量大于1GB的数据库
当在AIX上后备数据量大于1GB的数据库时,可能会遇到以下错误:
I/Oerror: 
operating system error,server device /backup/data. code 27 messages 
file too large. 
  这是由于后备文件的大小超出了操作系统的用户最大文件限制。可通过操作系统管理工具(SMIT), 增大用户最大文件限制。
Smit/user/max file size
30)如何后备数据量大于2GB的数据库
当在后备数据量大于2GB的数据库时,可能会遇到以下错误:
I/Oerror: 
operating system error,server device /backup/data. code 27 messages 
file too large. 
  这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件,这时可以使用Backup Server将一个数据库后备到多个文件中。
  1>dump database pubs2 to "/usr/sybase/pubs2_dump.1"
  2>stripe on "/usr/sybase/pubs2_dump.2"
  3>stripe on "/usr/sybase/pubs2_dump.3"
  4>go
  这种方法还可以提高后备及恢复的速度,但注意恢复也必须用相应多的设备。例如:
  1>load database pubs2 from "/usr/sybase/pubs2_dump.1"
  2>stripe on "/usr/sybase/pubs2_dump.2"
  3>stripe on "/usr/sybase/pubs2_dump.3"
  4>go
31)Unix平台后备pubs2数据库
启动ASE和BACKUP SERVER 
isql -Usa -Pxxxxxx -SSYBASE
dump database pubs2 to "/sybase/dump/pubs2_db.990705"
go
dump transaction pubs2 to "/dev/nrct0" capacity=1500000,file="pubs2_log.990705" with init(capacity取值为磁带容量的70%左右)
go
32)如何查找数据库启动失败原因
在实际环境中,数据库Server无法启动的原因很多,本文仅列出了几种常见的情况,供您参考。
  首先,应检查Server的日志文件。不同版本缺省的日志文件如下(其中<server_name>为Sybase Server的名称:
  UNIX:
11.0*: $SYBASE/install/errorlog 
11.5* 或 11.9*: $SYBASE/install/<server_name>.log 
12.0*: $SYBASE_ASE/install/<server_name>.log 
  NT:
11.0* 11.5* 或 11.9*: $SYBASE\install\errorlog 
12.0*: $SYBASE\ASE-12_0\install\errorlog 
  CASE 1:
basis_dlock: file '/sybase/master.dat' already in use by a SQL Server
kernel kdconfig: unable to read primary master device
kernel kiconfig: read of config block failed
检查server是否已经启动( showserver, ps -u sybase 或NT service  
  CASE 2:
dopen: open '/sybase/master.dat' failed, permission denied
kernel kdconfig: unable to read primary master device
kernel kiconfig: read of config block failed
检查master设备文件的所有者及权限 
    CASE 3:
ninit: All master network listeners have failed. Shutting down
检查network ip 及 port配置 ( netstat -a  
    CASE 4:
kernel:kscsinit: connectivity library error. Operation: cs_ctx_alloc().
检查操作系统参数是否已经修改并重新启动操作系统 (参见安装手册) 
若操作系统异常宕机,ASE未启动而$SYBASE/<server_name>.krg已经存在, 删除该文件
33)如何在NT、UNIX下启动关闭ASE
一:启动ASE Server
  UNIX:
以sybase用户登录 
11.x 版本: cd $SYBASE/install
12.x 版本: cd $SYBASE_ASE/install 
startserver -f RUN_SYBASE (启动SQL SERVER) 
startserver -f RUN_SYBASE_back (启动BACK SERVER) 
startserver -f RUN_SYBASE_mon (启动MONITOR SERVER) 
  NT:
通过 Sybase Central 
通过 Control Panal
Control Panal/Service/Sybase SQLServer -> Start (启动SQL SERVER)
Control Panal/Service/Sybase BCKServer -> Start (启动BACK SERVER)
Control Panal/Service/Sybase MONServer -> Start (启动MONITOR SERVER) 
  二:关闭ASE Server
  UNIX:
以sybase用户登录 
isql -Usa -P
shutdown SYB_BACKUP
go
shutdown
go 
isql -Usa -P -SSYBASE_mon
sms_shutdown
go 
  NT:
通过 Sybase Central 
通过 Control Panal
Control Panal/Service/Sybase SQLServer -> Stop (停止SQL SERVER)
Control Panal/Service/Sybase BCKServer -> Stop (停止BACK SERVER)
Control Panal/Service/Sybase MONServer -> Stop (停止MONITOR SERVER)
34)SYBASE中如何设置用户口令为空
使用sa登录Server:
isql -Usa -Psa_password -Sserver_name 
记录当前版本号(以当前版本号12000为例): 
sp_configure "upgrade version" 
go 
修改当前值为492: 
sp_configure "upgrade version",492 
go 
将某用户口令设置为NULL(以sa为例,当前口令为"123456"): 
sp_password '123456',NULL,sa 
go 
重新设置当前版本号: 
sp_configure "upgrade version",12000 
go
35)如何更改SQL Server名称(在UNIX、OPENVMS平台上)
在SYBASE产品中没有特定的函数或者存储过程用来更改SQL Server/ASE Server的名称,因此,只能手工修改某些参数或者配置来完成此任务。
  需要修改interfaces文件;更改RUN_server_name文件名,并修改其内容,例如:-s(UNIX)、/SERVER(OpenVMS)后面所跟的参数(server 名称);更改配置文件名;更改errorlog文件名(如果需要);如果server名称加在了表sysservers中,需要更改'srvname'、'srvnetname'列,可使用sp_dropserver、sp_addserver存储过程来实现。
  在OpenVMS系统中还要修改RUN_server_name文件中DSLISTEN的逻辑名称,以及在使用startserver过程中/SERVER后面所跟的参数。然后,重启SQL/ASE Server。确认DSQUERY、DSLISTEN环境变量已经更改为所需内容。
  另外,如果SQL/ASE Server是被设置为远程服务器,还要修改与此server相关的系统表sysservers中的字段以及interfaces文件。
  理论上例如配置文件、RUN脚本、errorlog文件不需要指定server 名称(但是通常习惯指定server名称)。在RUN startup脚本中要指定server名称。
  您可以根据以下提纲完成此项任务:
如果server名称加在了表sysservers中,用sp_dropserver删除。 
Shut down server 
编辑 interfaces文件 
更改RUN_server_name文件名,并修改其内容,-s(UNIX)、/SERVER(OpenVMS)后面所跟的参数(server 名称) 
更改errorlog文件名(如果需要) 
修改DSQUERY、DSLISTEN环境变量(如果需要) 
更改配置文件名(server_name.cfg、server_name.bak、server_name.nnn),在SYBASE安装路径下 
Start server 
使用sp_addserver重新添加server(如果需要) 
如果server是作为远程server使用的,还需要删除并重新添加。
36)在Windows NT上手动卸载Sybase Server
关闭 Adaptive Server. 
将Adaptive Server在Windows NT Services中由自动改为手动 
重新启动 Windows NT server 
运运行regedt32修改注册表, 删除以下内容:
\\HKEY_LOCAL_MACHINE\SOFTWARE\SYBASE\Server\<server_name>
\\HKEY_LOCAL_MACHINE\SOFTWARE\SYBASE\Server\<server_name>_BS
\\HKEY_LOCAL_MACHINE\SOFTWARE\SYBASE\Server\<server_name>_HS
\\HKEY_LOCAL_MACHINE\SOFTWARE\SYBASE\Server\<server_name>_MS 
到注册表的如下结构下:
\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
删除DSLISTEN, DSQUERY, SYBASE, 并修改 LIB, INCLUDE, PATH删除SYBASE有关目录 
删除如下注册键值:
\\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 
SYBSQL_<server_name> 
SYBXPS_<server_name>_XP 
SYBBCK_<server_name>_BS 
SYBMON_<server_name>_MS 
SYBHIS_<server_name>_HS 
重新启动 Windows NT server 
使用 Start | Control Panel | Settings | Services 确认SYBASE已经卸载 
删除SYBASE Server所用数据库设备文件及SYBASE系统文件
37)如何检查数据库中数据的一致性
数据库一致性检查(dbcc)提供了一些命令用于检查数据库的逻辑和物理一致性。Dbcc主要有两个功能:
使用checkstorage 或 checktable 及 checkdb 在页一级和行一级检查页链及数据指针。 
使用checkstorage, checkalloc, 或 checkverify, tablealloc, 及indexalloc 检查页分配。 
  在下列情况中需要使用 dbcc 命令:
作为数据库日常维护工作的一部分, 数据库内部结构的完整性决定于sa 或dbo 定期地运行 dbcc 检查。 
在系统报错以后, 确定数据库是否有损坏。 
在备份数据库之前, 确保备份的完整性。 
如果怀疑数据库有损坏时, 例如, 使用某个表时报出表损坏的信息, 可以使用 确定数据库中其他表是否也有损坏。 
  下面是dbcc的简单用法:
dbcc checktable (table_name)
检查指定的表, 检查索引和数据页是否正确链接, 索引是否正确排序, 所有指针是否一致, 每页的数据信息是否合理, 页偏移是否合理。 
dbcc checkdb (database_name)
对指定数据库的所有表做和checktable 一样的检查。 
dbcc checkalloc (database_name,fix|nofix)
检查指定数据库, 是否所有页面被正确分配, 是否被分配的页面没被使用。当使用"fix"选项时,在检查数据库的同时会自动修复有问题的页面。(若数据库数据量很大,则该过程会持续很长时间。) 
dbcc tablealloc (table_name,fix|nofix)
检查指定的表, 是否所有页面被正确分配, 是否被分配的页面没被使用。是 checkalloc 的缩小版本, 对指定的表做完整性检查。当使用"fix"选项时,在检查数据表的同时会自动修复数据表中有问题的页面。 
  关于上述命令的其它选项及详细使用方法和checkstorage, checkverify, indexalloc 的详细使用方法, 请参阅有关命令手册。
  举例1: Unix平台检查pubs2数据库的一致性
单用户模式启动Server:
$SYBASE/install startserver -f RUN_server_name -m 
vi dbcc_db.sql
use master
go
sp_dboption pubs2,"single user",true
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,"single user",false
go
use pubs2
go
checkpoint
go
quit
go 
isql -Usa -Pxxxxxx -SSYBASE <dbcc_db.sql >dbcc_db.out 
grep Msg dbcc_db.out 
  举例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
38)如何删除坏的用户数据库?(以pubs2为例)
当使用drop database无法删除数据库时,使用本文所示方法可以删除。
   (1)使用isql以sa注册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,并用isql以sa注册。
   (5)删除数据库
  1>dbcc dbrepair(pubs2,dropdb)
  2>go
   (6)恢复允许修改系统表
  1>sp_configure "allow updates",0
  2>go
   (7)结束
39)ASE11.5装载或备份数据库报3230错误
用sp_dropdevice或sybase central删除逻辑设备后,不重启服务器,不回收虚拟设备号,重用它建立设备,新建数据库。这时dump&load数据库会出3230错误。这是ASE11.5的BUG,过去不重新启动服务器,老的虚拟设备号不能使用,现在服务器不提示错误。但dump&load数据库会出现3230错误。
  解决办法是重启服务器,3230错便会消失。
40)如何终止数据库恢复过程
当某一正常运行的大事务(例如:update、delete操作)被终止,且重新启动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) 重新启动server
   (5) 如果你的数据库原来有dboption(例如"select into","trunc log on chkpt"等), 你需要重新设置这些option.. 
   (6) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照"如何检查数据库中数据一致性"文章)
   (7) 后备用户数据库
  例如:
  1>dump database pubs2 to "/usr/sybase/pubs2.dup"
  2>go
41)解决数据库被挂起的问题
现象: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 "/usr/sybase/master.dup"
  2>go
   (3) 用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
  (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="pubs2" 
  4>go 
   如果得到(1 row affected),则
  1>commit
  2>go
   否则
  1>rollback
  2>go
  1>sp_configure "allow updates" ,0
  2>go 
   (5)重新启动SQL Server.
   (6) 如果你的数据库原来有dboption(例如"select into","trunc log on chkpt"等), 你需要重新设置这些option.
   (7) 当数据库已经恢复可使用状态后,运行dbcc命令检查数据库的一致性(参照“如何检查数据库中数据一致性”文章)
   (8) 备份用户数据库
   例如:
  1>dump database pubs2 to "/usr/sybase/pubs2.dup"
  2>go
42)如何安装ASE的EBF
    步骤: 
  UNIX 平台 
  1、 备份所有数据库 
  2、 shut down ASE server
  3、 备份$SYBASE路径 
  4、 拷贝.tar文件到$SYBASE路径 
  如果提供的是.tgz文件: 
    使用winzip将 .tgz文件转换成.tar文件 
    使用ftp binary 模式将.tar文件传到$SYBASE 
  5、 解开.tar文件 
  cd $SYBASE
  tar -xvf .tar文件名(例如:tar -xvf EBF9216.tar) 
  6、 运行脚本 
  启动server: 
    isql -Usa -P<sa password> -S <server name> -iinstallmaster绝对路径 -o<output file>
  NT平台 
  1、 备份所有数据库 
  2、 shut down ASE server 
  3、 备份$SYBASE路径
  4、 使用winzip将 .tgz文件或.tar文件解开到自建目录下 
  5、 将自建目录下所有文件拷贝到$SYBASE路径 6、 运行脚本 
  启动server: 
    isql -Usa -P<sa password> -S <server name> -iinstallmaster绝对路径 -o<output file>
43)如何为两个ASE配置SQL Remote
本例为2个ASE之间的表同步设置: 
  A机为原数据库服务器 
  B机为备份数据库服务器 
  配置的准备工作: 
  A机 建立2个logins: remote1 remote2 
  建立1个user: remote1 
  B机 建立2个logins: remote1 remote2 
  建立1个user: remote2 
  配置: 
  A机: 
  1.SQL Remote Utilities: 
  2.Remote Table: 将所要同步的用户表绑定 
  3.Add Publication: 起个发布名 如: pub1 
  4.Remote User: remote2 
  第四步完成后,到第三步选pub1,打开pub1 的 Properies , 
  在Subscriptions 栏目中选择Subscribe For.. , 
  在Subscribe for user中选择表后,点Subscribe确定 
  在回到pub1 的 Properties中 , 点确定 
  再次进入pub1 的 Properties中,点选remote1后,去选Advanced 
  进入Advanced Remote Actions, 选 Start Now 
  5.Message Types: 选file 指定目录:c:\sybase\data\pub1 
  在外层Set Publisher: 指定remote1 
  B机: 
  1.SQL Remote Utilities: 
  2.Remote Table: 将所要同步的用户表绑定 
  3.Add Publication: 起个发布名 如: pub2 
  4.Remote User: remote1 
  第四步完成后,到第三步选pub2,打开pub2 的 Properies , 
  在Subscriptions 栏目中选择Subscribe For.. , 
  在Subscribe for user中选择表后,点Subscribe确定 
  在回到pub2 的 Properties中 , 点确定 
  再次进入pub2 的 Properties中,点选remote2后,去选Advanced 
  进入Advanced Remote Actions, 选 Start Now 
  5.Message Types: 选file 指定目录:c:\sybase\data\pub2 
  在外层Set Publisher: 指定remote2 
  执行同步的命令: 
  1.发布:
  ssremote -c "eng=A机的Server_Name;dbn=Database_name;uid=sa;pwd=password;" 
  2.接收:
  ssremote -c "eng=B机的Server_Name;dbn=Database_name;uid=sa;pwd=password;" 
44)master数据库1105错误的处理方法
[ERROR] 
Can't allocate space for object 'syslogs' in database 'master' because the 'system' segment is full.  
If you ran out of space in syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment  
to increase the size of the segment. 
[WORKAROUND] 
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
45)如何单独在备份机上启动Sybase ASE12.5
一. 如何单独在备份机上启动Sybase ASE12.5 
  1. 停止HACMP的服务进程
  2. 在备机上将卷组激活
   # varyonvg datavg
  3. 修改standby地址为主机的service地址
   # smitty tcpip à en2 
   修改10.61.2.102à10.61.1.100 
  4. 登录到sybase用户 
   # su - Sybase 
   $ 
  5. 编辑interfaces文件 
   将sdcp_bak_srv 改为sdcp_pri_srv 
  6. 启动ASE 
   $ cd /sybase/ASE-12_5/install
   $ startserver –f RUN_sybase_bak
  7. 执行如下命令
   $isql –Usa –P –Ssybase_bak 
    1> dbcc takeover
    2> go 
二. 恢复到正常状态
  1. 行如下命令
   $isql –Usa –P –Ssybase_bak
    1> dbcc ha_admin(‘’,rollback_failover)
    2> go
  2. 停止sybase_bak
   $isql –Usa –P –Ssybase_bak
    1> shutdown
    2> go
  3. 将interfaces文件中的地址改回为原来的sdcp_bak_srv
  4. 退回到root用户
  5. 将地址10.61.1.100修改回10.61.2.102
  6. 中断对卷组datavg的激活
   # varyoffvg datavg
7. 启动HACMP
46)如何恢复master数据库
ASE can't setup and has no valid dump of master
1、编辑RUN_servername
在命令行最后加入:-T3607
2、单用户模式启动ASE
$cd install
$startserver -f RUN_servername -m
3、bcp out系统表
$bcp master..sysdevices out /directory.spec/devs -Usa -P -c
$bcp master..sysdatabases out /directory.spec/dbs -Usa -P -c
$bcp master..sysusages out /directory.spec/usages -Usa -P -c
$bcp master..syslogins out /directory.spec/logins -Usa -P -c
$bcp master..sysconfigures out /directory.spec/configures -Usa -P -c
$bcp master..syscharsets out /directory.spec/charsets -Usa -P -c
4、shutdownASE
5、创建新master设备
$buildmaster -d<path_to_new_master_device> -s<new_master_device_size>
(new_master_device_size以2K为单位)
6、编辑RUN_servername
将指定master设备指定为新创建的master设备,并删除在第1步中增加的参数。
7、删除/directory.spec/dbs、/directory.spec/usages文件中有关master、tempdb、model的内容。
8、单用户模式启动ASE
$cd install
$startserver -f RUN_servername -m
9、 bcp in系统表
$ bcp master..sysdevices in /directory.spec/devs -Usa -P -b 1 -c
$bcp master..sysdatabases in /directory.spec/dbs -Usa -P -b 1 -c
$bcp master..sysusages in /directory.spec/usages -Usa -P -b 1 -c
$bcp master..syslogins in /directory.spec/logins -Usa -P -b 1 -c
$bcp master..sysconfigures in /directory.spec/configures -Usa -P -b 1 -c
$bcp master..syscharsets in /directory.spec/charsets -Usa -P -b 1 -c
10、重启ASE
11、执行installmaster脚本
$isql -Usa -P < $SYBASE/scripts/installmaster
47)如何做 rebuild log
注意:这个过程可能会引起数据的不一致性。
(1)赋予sa用户sybase_ts_role的角色
isql -Usa -P
1>sp_role "grant","sybase_ts_role",sa
2>go
1>quit
(2)将数据库置为"bypass recovery"状态
isql -Usa -P
1>sp_configure "allow updates",1
2>go
1>use master
2>go
1>update sysdatabases set status=-32768
2>where name="database_name"
3>go
1>shutdown with nowait
2>go
(3)rebuild数据库日志
重启Server
isql -Usa -P
1>use master
2>go
1>dbcc rebuild_log(database_name,1,1)
2>go
1>shutdown with nowait
2>go
(4)重启SQL server
1>use master
2>go
1>update sysdatabases set status=0 where name="database_name"
2>go
1>sp_configure "allow updates",0
2>go
1>shutdown with nowait
2>go
(5)在重启SQL server之后,如果数据库恢复正常,rebuild log工作将会成功完成,否则要恢复数据库备份,使用dump database或bcp命令。
48)如何重建sybsystemprocs系统数据库
依照以下步骤可以实现移动sybsystemprocs系统数据库以及设备的任务。同时这个过程也可以用来扩建sybsystemprocs系统数据库。
  以下过程中所提到的语法结构,可以参看SYBASE相关资料。
  SYBASE提醒您,在修改系统表时,SQL Server要以单用户模式运行,同时要以"sa"用户登录。
保留驻留在sybsystemprocs系统数据库中自定义的存储过程脚本。 
单用户模式启动SQL Server,执行:
1> sp_configure "allow updates",1
2> go
1> reconfigure with override(10.0版本以上,省略此步)
2> go 
删除sybsystemprocs系统数据库:
1> use master
2> go
1> drop database sybsystemprocs
2> go
在重建sybsystemprocs系统数据库之前,不要创建任何其他数据库。 
删除sysdevices系统表中有关sybsystemprocs系统数据库的信息:
1> begin tran
2> delete from sysdevices where name="sysprocsdev"
我们假定sysprocsdev是默认的sybsystemprocs系统数据库设备名。
3> select * from sysdevices
确定删除是否正确有效,如果正确,执行:
4> commit tran
否则,执行:
4>rollback 
重启SQL Server. 
创建sybsystemprocs系统数据库设备:
1> disk init name="sysprocsdev",physname="physical_path",vdevno=4,size=25600
2> go
其中size是以页为单位(512页=1M)。
sybsystemprocs系统数据库设备的vdevno应该是4,SQL Server在单用户模式下4不能被重新利用,所以如果以上语句执行时出现问题,请重启SQL Server。 
sybsystemprocs系统数据库:
1> create database sybsystemprocs on sysorocsdev=50
2> go
在sysdatabases系统表中,sybsystemprocs系统数据库的dbid=4,如果在重建
sybsystemprocs系统数据库之前,没有创建任何其他数据库。 
以多用户模式启动SQL Server,并执行:
1> sp_configure "allow updates",0
2> go
3> reconfigure with override(10.0版本以上,省略此步)
4> go 
运行installmaster脚本:
%isql -Usa -Psa_password -Sserver_name -n -iinstallmaster -o< output_file
installmaster脚本在$SYBASE/scripts路径下。 
重建sybsystemprocs系统数据库中的用户自定义存储过程 。
49)如何移植master设备
以下步骤说明了如何将master设备移植到不同的磁盘上。在执行此项任务的同时,请参看SYBASE的相关文档(Technical Documents#1324 entitled "Segment Remapping with Load database When Moving a Database")。请注意,在执行buildmaster之前,要停止SQL Server的应用。
  成功的关键在于,新建的sysusages系统表中每一行内容与旧的sysusages系统表内容相符。
对master库做dbcc检查,并后备master库。 
执行select * from table_name命令,并保留其输出内容。其中,table_name包括:sysdevices、sysusages、sysdatabases。同样,可以使用bcp命令来实现。 
执行sp_configure命令,并保留其输出内容。 
拷贝$SYBASE/server_name.cfg文件,以做保留。 
Shut down SQL/ASE Server。 
执行以下命令,创建一个新的master设备:
UNIX:buildmaster -d<master_device> -ssize
VMS:buildmaster /disk=<master_device> /size=size
(size以页为单位,1页=2K) 
编辑RUN_server_name文件,-d(UNIX)或/device(VMS)参数指向新建的设
备名。 
单用户模式启动SQL/ASE Server:
UNIX:startserver -f RUN_sever_name -m
VMS:startserver /server=server_name /masterrecover 
执行select * from sysdevices命令,并保留其输出内容。 
确认新建的sysusages系统表中每一行内容与旧的sysusages系统表内容相符,而且在配置好Server之后,没有做过alter database,那么系统表sysusages的内容是正确的。如果做过alter database,则要按原来的顺序执行这些脚本,如果没有脚本,就要到保存的sysusages系统表的信息中找到alter database的参数。 
Shutdown SQL/ASE Server,并用单用户模式启动Server,查看sysusages系统表内容是否正确。 
如果所配置的Backup Server名称不是SYB_BACKUP,则要执行:
1> sp_configure "allow updates",1
2> go
1> update sysservers set srvnetname="name in interfaces file" 
where srvname="SYB_BACKUP"
2> go 
装载master库。如果新master设备的大小与旧设备大小不同,则Server会Shut down。请注意新的系统表将会被重写,而且你需要调整Sysdevices系统表中master设备的大小。请执行以下两步: 
用单用户模式启动Server. 
如果新设备大小与旧设备大小不同,请执行:
1> sp_configure "allow updates",1
2> go
1> update sysdevices set high=nnnn where name="master"
2> go
其中nnnn是以页(2K)为单位的master设备的大小,此值可以从保留的sysdevices系统表的信息中找到。如果所建的设备比旧设备大,请执行:1)创建一个与master设备差不多大的数据库,这样做的目的是重新初始化分配页,使得整个master设备可用。2)删除这个数据库。 
重启Server。 
后备master数据库。 
  注意:
在装载master库之前要确定SQL Server此时的字符集和语言模块与后备master库时的字符集和语言模块相同。 
在执行此任务之前和完成以后使用sp_helpsort查看字符集与语言模块是否相同。
50)死锁
 发生死锁的原因
  以前,由于采用通过服务器访问或变更数据的技术,就存在可能发生死锁的情况。对于常常是更多地由ASE的处理特性所引起的死锁, 而不是由不恰当的事务设计所引起的死锁,就给数据库管理员(DBA)带来了特别的麻烦。通过几种增强方式,ASE 11.9.2将这些系统所引起的死锁问题得到了解决。
  随着锁存技术的引入,对于其它用户而言,索引页只是在很短的周期内不能被使用,永远不会延续到数据库事务中。所以锁存技术的特性将那些在索引页中发生死锁的情形都排除掉了。这一点对在使用仅仅是数据表时,可以使用并发技术的情况具有巨大的效果。
  此外,为了进一步处理针对数据可能发生的死锁,已经认识到可以对释放共享锁的时间点加以改变,这样一来,就能够使对以前发生死锁的数据行的并发访问保持一致。在处理一个连接(join)时,以前的处理方式是将在外部表中加锁的行一直保持到检索到内部行时为止。然而在大多数情况下,一旦检索到数据就不再需要对进行访问的行继续加锁。随着引入固定的行标识(RIDs),这就意味着,外部表的扫描从这一行扫描到下一行,一旦所需要的信息已经被检索到之后,在所连接的外部表中,对行的加锁就可以释放了。这个功能被称之为“带有加锁方式的读提交”("read committed with lock”),并可用如下的命令加以配置:
sp_configure ‘read committed with lock’,0|1
 客户情形
  为了证实上述情形,建立了一个实际的客户环境,以便按照一系列它们所提供的测试进行,用于验证他们所认为的最坏的并发情况下以确保不发生死锁。
  在这类“最坏情况”测试中的应用负载如下:
在一台应用服务器上执行项分开的流式任务,它们包括如下任务: 
大量的插入 
在一个单一逻辑事务中进行5000条SQL语句的更新操
SQR报告 
用户执行OLTP工作(插入、更新和联机查询) 
使用复杂查询的报告。向下钻取的报告: 
访问一定数量的表(典型为6或7) 
引用至少包含两个子查询的SQL语句; 
在光标定义中采用截然不同的光标(cursors),以引起工作表的使用。 
 可能发生的死锁
  采用较早版本的服务器产品,进行上述的应用实验,可能发生死锁,其主要原因如下:
插入与非群聚性的索引访问
  如果插入一行,服务器就会采用群聚性的索引以访问存贮该行所在的页面,并在一种排它性的页面加锁方式下执行插入操作。接着服务器就对表的每个非群聚性索引进行访问,在一种排它性的页面级加锁方式下,在其末端(叶级)结构中插入相应的条目。如果第二个用户也通过非群聚性的索引访问该表,他们可以按照非群聚性索引保持对该叶级页面实施共享加锁,与此同时,这些非群聚性的索引也由这个排它性的页面加锁所阻碍并用在插入操作中。这种对由第二个用户对非群聚性索引的叶级结构所进行的加锁方式,可能阻碍插入尝试并为第一个用户增加一个条目,从而可能引起死锁。
更新的范围
  在这个商业应用的设计中,开始首先在一张表中采用零值与一个标识符两部分组成的键值插入所有的新行。在一个单一的逻辑事务中对所有的行使用相同的标识符来进行并发更新。这些更新采用唯一键值去代替零值,就引发了索引行移动到索引的叶级结构的最后。当多个用户并发执行这个任务时,第一个用户就锁定进行处理的页面和索引所在的叶级结构的末端。这将阻碍用户试图对第二个按行范围所进行的工作。当第一个用户到达所确定的页面边缘,即该范围即将终止,下一批所组块并妨碍的页面范围即将开始之时,就可能发生死锁。
按照不同顺序访问表
  即使访问行是不同的,对表按照任何不一致的顺序进行访问,也会意味着可能发生死锁。这是因为一个用户所访问的行可能在另一个用户访问的同一个以不同顺序排列的页面中。对于应用系统而言,当然这种设计明显是很差的,但是却还令人惊奇地普遍存在。
连接与更新
  正如在 5.1节所叙述的有关“采用加锁机制的读提交”段的内容,当处理连接,同时对外部表的加锁方式会一直保持到内部行被检索到为止,这种情况就会发生。如果第二个用户在访问所连接的外部表中的行之前,先访问了所连接的内部表的行,这种操作可能受阻,因为加锁的顺序被连接所破坏,从而也会引起死锁。
问题的解决方案
  采用Adaptive Server Enterprise 11.9.2的产品, 应用对索引页的锁存技术以代替传统的加锁方式,以及更小尺度的按行加锁方式,导致了前三种死锁类型不再发生。采用“按照加锁进行读提交”可以处理第四种死锁情况。
  作为进一步的测试,在前面所述及的最坏情况实验中,同时还进行了增加额外负载的运行实验。这类实验包括一个拥有7000条SQL语句的单一事务,和从Microsoft Excel电子数据表中卸载数据(加入ASE服务器)。这两个版本的测试已经进行了多次,从未发生过死锁。
一类新的死锁以及如何解决
  就在Adaptive Server Enterprise产品的设计中进行修正以防止死锁和增加并发性的同时,也发生了一种情形,可能发生死锁,而这种情况在过去是不可能发生的。
  当一次更新操作必须访问整个表时(例如此时不支持索引),可能会发生一种改变。在它们已经被确认为符合要求之后,将只对个别行加锁(以前是对一张表加锁)。当访问小表的时候,对于因为性能的原因而建立的任何索引,一般而言都不会很多。如果一个用户扫描这些小表之一,并对一行加以限定,这将随之带来一个排他性的行加锁。如果第二个用户也访问同一张表,这种扫描就会因为第一个用户的排他性行加锁所阻碍。如果第一个用户试图更新同一张表中的另一行,这种扫描也会被第二个用户所阻碍,所以引起死锁。
  为了解决这一问题,已经采用了一种称之为“并发优化”的优化程序。这个方法指明了如果在一张表中需要进行存取行的页面数小于某个固定的数字(其缺省值为16),那么将不再考虑使用任何一个索引,而宁可对表进行直接扫描。这就意味着对于很小的表,利用索引而不是用全表扫描方式直接访问某些可能会产生直接影响的行,存在引起死锁的可能性。在考虑扫描一张表之前,需要确定在一张表中能有多少页,可采用如下的命令在页级结构中加以配置:
sp_chgattribute <tablename>, “concurrency_opt_threshold”, <value>
  为了提高性能,也需要仅仅对表中的少数行添加索引的建立。与以前一般都忽略了索引不同,现在利用索引是为了提供最大的并发性并避免死锁的发生。
51)如何配置SQL Server来做远程备份?
在本地机器上:
  1.修改interfaces文件,添加远程机器上Backup Server的条目(Backup Server的名称,地址,端口号)
   ——份服务器名称不能使用别名
   ——UNIX平台使用dscp实用工具添加
   ——Windows平台使用dsedit实用工具添加
  2.在sysservers系统表中添加远程Backup Server名
   1>sp_addserver SYB_BACKUP,null,BACKUP_SERVER_NAME
   2>go
  3.使用sp_helpserver查看至少存在以下3个条目:
   ——本地ASE名称
   ——本地Backup Server名称
   ——远程Backup Server名称
  4.在本地机器上实现远程备份:
   1>dump database DATABASE_NAME to "remote_machine_path/..." at REMOTE_BACKUP_SERVER_NAME
   2> go
   在本地机器上恢复备份:
   1>load database DATABASE_NAME from "remote_machine_path/..." at REMOTE_BACKUP_SERVER_NAME
   2> go
  注:
  1.如果要实现远程的双向备份,请在远程机器上做与本地机器相同的配置.
  2.本地的Backup Server的名称要求与远程的Backup Server的名称不一样.