sybase:sybase问题整理(希望大家追加)




search论坛时发现以前好多不错讨论都没了
所以粗略整理了建议大家在浏览本坛时将不错贴子留下



1)有关定事备份
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1233&show=390
crontab中可以这样写:
0023***/sybase/ASE-12_0/bin/DUMPDB.sh>>/sybase/ASE-12_0//DUMPDB.out

放那里都无所谓个dumpdb.sh例子:
#SUNSolaris8
#!/bin/ksh
exportSYBASE=/sybase
exportSYBASE_FTS=FTS-12_0
exportPATH=/sybase/ASE-12_0/bin:/sybase/OCS-12_0/bin:$PATH:/sybase/ASE-12_0/:/usr/sbin
exportSYBASE_OCS=OCS-12_0
exportSYBASE_ASE=ASE-12_0
exportLM_LICENSE_FILE=/sybase/SYSAM-1_0/licenses/license.dat:$LM_LICENSE_FILE
exportLD_LIBRARY_PATH=/sybase/ASE-12_0/lib:/usr/local/openwin/lib:/sybase/FTS-12_0/lib:/sybase/OCS-12_0/lib:/usr/local/openwin/lib:/usr/lib:/sybase/SQLRemote/lib:$LD_LIBRARY_PATH
exportSYBASE_SYSAM=SYSAM-1_0
exportHOME=$SYBASE
$SYBASE_OCS/bin/isql-Usa-SSYBASE-P<<!
dumpdatabaseYOURDBNAMEto"/sybdump/dump.01"
stripeon"/sybdump/dump.02"
stripeon"/sybdump/dump.03"
stripeon"/sybdump/dump.04"
stripeon"/sybdump/dump.05"
go
!
这里是个典型脚本用于实现full备份!
#!/usr/bin/sh
#*************************************************************************
#forfullbackupafterexcuteddbccoperation
#*************************************************************************
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/Mot1.2:/opt/sybase/SQLRemote/
lib
exportSHLIB_PATH
SYBASE_OCS=OCS-12_0
exportSYBASE_OCS
SYBASE=/opt/sybase
exportSYBASE

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"Checkdatabase$bk_db...">>$LOG/backup.log
d1=`date`
su-sybase-c"isql-SSYB_HP-Usa-P******<<DBCC>$LOG/dbcc-$ymd.log2>&1
dbcctraceon(3604)
go
dbcccheckdb($bk_db)
go
dbcctraceoff(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"Dumpdatabase$bk_dbto"$dump_file>>$LOG/backup.log
su-sybase-c"isql-SSYB_HP-Usa-P******<<DUMP>$LOG/dump-$ymd.log2>&1
dumpdatabase$bk_dbto"$dump_file"
go
DUMP
echo$d1,`date`>>$LOG/backup.log
echo"\\n33*************************">>$LOG/backup.log
请根据自身系统调试后再使用!
至于备份日志脚本和此类似自己根据sybase相关语法稍加变动即可!





2)有个有关游标问题请教各位大虾 
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、DECLARECUR_ACCTINFOCURSORFORSELECT.....(定义)
2、OPENCUR_ACCTINFO(打开)

3、WHILE@@SQLSTATUS=0(判断是否成功)


BEGIN

4、FETCHCUR_ACCTINFOINTO.......(取数据)
IF@@SQLSTATUS<>0
begin
......
end
...........
5、CLOSECUR_ACCTINFO(关闭)
6、DEALLOCATECURSORCUR_ACCTINFO(释放)



3)在sybase中有没有进行数据类型转换 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1346&show=330

4舍 5入用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)新手问题:为什么我SYBASERUN_BACKUP老是自己DOWN啊!?
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1335&show=330
为什么我SYBASERUN_BACKUP老是自己DOWN啊!?
我用NetTerm登陆运行但只要退出NetTermBACKUP就自己DOWN了
加&运行也不行如何办啊?


命令前加nohup试试

那是backup进程是以你登录用户起动,所以当该用户退出unix时,
进程也跟着退出操作系统了

5)什么是BYPASSRECOVERYmode? 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1371&show=300


在客户端出现提示:
AttempttoBEGINTRANsactionindatabase"****"failedbecausedatabaseisinBYPASSRECOVERYmode.
请问如何解决?



selectname,statusfrommaster..sysdatabaseswheredb_name="你所说数据库"
看status是否是-32768,若是,sysdatabases系统表相应记录status字段改为0reboot数据库服务器就可以了

谢谢各位问题已解决中午去SYBASE网站WebSite查找到有关这个问题详细信息包括问题成因及解决办法:
Error3908
Severity
16
ErrorMessage

AttempttoBEGINTRANsactionindatabase\'%.*s\'failedbecausedatabaseisinBYPASSRECOVERYmode.
Explanation
AdaptiveServercanstartvarioustypesoftransactionssuchaslocal(inresponoalocalcommand),ernal(fortheserver\'sownuse),external(startedbyanexternalclientlikeaTPMonitor)andsubordinate(childtransactionsstartedbyaparenttransactioninparallel).
BypassrecoverystartsAdaptiveServerwithoutrecoveringoneormoredatabases.Adatabasehismodecanbeaccessedeventhoughitisnotrecovered.Youuhismodetoallowaccesstothedatabaseforproblemanalysis,tocopyoutdata,andsoon.
Error3908israisedwhenatransactionisattemptedwhilethedatabaseisinbypassrecovery.Althoughcertaincommandsarepermissiblehismode,notransactions-regardlessoftype-canbestartedwhenthedatabaseisinbypassrecovery.
Error3908israisedhefollowingstates:



StateMeaning
1Attemptedtostartatransactionwhenthedatabaseisnotavailableforupdate.Appliestoallpossibletransactiontypes.
2Attemptedtostartasubordinatetransactionwhenthedatabaseisnotavailableforupdate.
Action
Donotattempttostartatransactionwhilethedatabaseisinbypassrecovery.Checkanyautomatedjobsmayhavesubmittedabatchjobthatattemptedsuchatransaction.Firstrestorethedatabaotheoriginalworkingstatusithad(priortobypassstatus)beforeattemptinganytransactions.


Uhefollowingstepstorethedatabasestatus:
NoteAlthoughastatusofzeroisusuallyappropriate,itisnottheonlypossiblestatusvalueyoucanuse.Rethedatabaotheactual,normalstatusithadpriortoenteringbypassrecoverystatus.

1.Rethedatabasestatusto0:
1>sp_configure"allowupdates",1
2>go
1>begran
2>go
1>usemaster
2>go
1>updatesysdatabasesstatus=0wherename=<database_name>
2>go
Checkthattheaboveupdatecommandaffectedonlyonerow(morethanonerowwasaffected,issuearollbacktransaction.)ThencommitthetransactionandshutdownAdaptiveServerasfollows:
1>committran
2>go
1>shutdownwithnowait
2>go
2.RestartAdaptiveServer.Rundbcccheckdbanddbcccheckallocontheaffecteddatabaomakesuretherearenoerrors.
VersioninWhichThisErrorisRaised
Allversions.
再次谢谢aladdinfreebobchanging
6)数据库表BCP出来报错 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1326&show=300
数据库表BCP出来报错
DB-LIBRARYerror
I/Oerrorwhilewritingbcpdata-file
bcp出来文件正好2GB实际应该更大
操作系统SCOOpenServer5.0.4,SYBASE11.0.3
请问是何原因?谢谢
当在后备数据量大于2GB数据库时可能会遇到以下:
I/Oerror:
operatingsystemerror,serverdevice/backup/data.code27messages
filetoolarge.
  这是由于后备文件大小超出了操作系统用户最大文件限制而有些操作系统不支持大于2GB文件这时可以使用BackupServer将个数据库后备到多个文件中
  1>dumpdatabasepubs2to"/usr/sybase/pubs2_dump.1"
  2>stripeon"/usr/sybase/pubs2_dump.2"
  3>stripeon"/usr/sybase/pubs2_dump.3"
  4>go
  这种思路方法还可以提高后备及恢复速度但注意恢复也必须用相应多设备例如:
  1>loaddatabasepubs2from"/usr/sybase/pubs2_dump.1"
  2>stripeon"/usr/sybase/pubs2_dump.2"
  3>stripeon"/usr/sybase/pubs2_dump.3"
  4>go

7)sybasesa口令丢失怎样恢复? 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1239&show=270
在RUN-SERVER文件中加入行-psa重起dataserver在控制台上可以看见新口令
http://www.powerba.com/develop/database/sybase/article/20010505001.htm

\" border=0>sybase表中如何删掉多条相同记录? 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1438&start=0&show=180
sybase表中如何删掉多条相同记录?
由于表出问题将没有进行处理*.txt文件bcp到表中其中含有大量重复记录
请问有没有办法将表中重复记录删掉呢?

那好办那你就可以使用下面语句将唯记录先插入到临时表中:
selectdistincta,b,c,d...otempdb..tempdb_tablefromtablename
然后清空原表把临时表中数据插入正式表中!
试试看

可以参考这种经典思路方法:
1---select*otmp_tabfromyour_dup_tabwhere1=2
2---若表无唯性索引则建个唯性索引(定能找到个唯索引建(复合索引))createuniqueindex(列名1列名2...)ontmp_tabwithignore_dup_key.
3----insertotmp_tabfromyour_dup_tab
这样在新表中将自动删出重复记录但数据量过大请留意日志空间(sp_spaceusedsyslogs).
很使用思路方法.tryit!

9)有关阀值
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1231&show=180
发告警或者水自动溢出以保护系统不至于达到危险境界对于数据库而言我们使用存储设备毕竟有限如果任由数据或日志增长数据或日志日久天长终将占用所有存储设备如果到了没有空间时候系统将挂起这样业务将暂停所以对于些要求数据库可用性很高系统必须保证在可预见情况下数据段或者日志段不至于没有空间!为做到这传统数据库般都需要系统维护人员经常定期进行数据库检查若数据段不够了转储部分数据或者增加些设备若日志空间不够了转储日志!但这样系统管理员就有点累了!


为减轻系统管理员负担提高系统自动化程度sybase提出了用阀值进行自动管理这样种模式只要在开始定义好各段阀值以及达到阀值后处理存储过程就可以实现自动管理了!
不过我先前也想这样做也研究了阵子但是后来还是放弃了这种懒惰办法使用阀值管理可能出现些意想不到问题什么问题现在还没想到只是sybase不推荐在大系统中这样做!再加上本身系统有omniback备份软件Software何必自找麻烦呢!

10)什么SYBASE安装完后要增加TEMPDB空间?
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1444&show=180
扩展后sp_helpdbtempdb看应改master设备上是data/log
你uempdb
sp_dropsegment\'default\',tempdb,master
sp_dropsegmentsystem,tempdb,master
sp_dropsegmentlogsegment,tempdb,master

sp_helpdbtempdb
selectdb_name(dbid),segmap,lstart,size,vstart,pad,unreservedpgs
fromsysusages
wheredbid=2
贴出来
如果第行中segmap为0,就ok


你们回答什么驴唇不对马嘴(呵呵开玩笑)
般情况下数据库装好的后都要给tempdb增加空间在用户数据库中很多插入删除等操作需要用到tempdb数据库作为临时存储空间所以要增大他空间否则可能你事务不能执行

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)个用来存放临时数据库设备
diskinit
name="tempdb_dev",
physname="d:\\sybase\\example\\tempdb.dat",
vdevno=13,
size=15360
(注意:如果将tempdb数据库放在多个设备上化多个数据库设备)
2)将临时数据库扩展到该个设备上
alterdatabaempdbontempdb_dev=30
3)打开tempdb数据库从段上删除master设备
sp_dropsegment"default",tempdb,master
sp_dropsegmentlogsegment,tempdb,master
4)发出如下命令检查default段中是否不再包含master设备
selectdbid,name,segmapfromsysusages,sysdevices
wheresysdevices.low<=syusages.size+vstart
andsysdevices.high>=sysusages.size+vstart-1
anddbid=2
and(status=2orstatus=3)
介绍说明:若将临时数据库放在多个磁盘设备上可以更好利用并行查询特性来提高查询性能
第 2步:将临时数据库和高速缓冲进行绑定
  由于临时表创建、使用临时数据库会频繁地使用数据缓存Cache所以应为临时数据库创建高速缓存Cache从而可以使其常驻内存并有助于分散I/O:
1、创建命名高速缓存Cache
sp_cacheconfig“tempdb_cache","10m","mixed"
2、重新启动server
3、捆绑临时数据库到tempdb_cache高速缓存Cache
sp_bindcache“tempdb_cache",tempdb
4、若有大I/O配置内存池
第 3步:优化临时表
大多数临时表使用是简单很少需要优化但需要对临时表进行复杂访问则
应通过使用多个过程或批处理来把表创建和索引分开以下两种技术可以改善临时表优化
slash;在临时表上创建索引
1)临时表必须存在
2)统计页必须存在(即不能在空表上创建索引)
slash;把对临时表复杂使用分散到多个批处理或过程中以便为优化器提供信息
下面这个过程需要进行优化:
createprocbase_proc
as
select*o#huge_resultfromauths
select*fromarticle,#huge_resultwherearticle.author_code=
#huge_result.author_codeandsex="0"
使用两个过程可以得到更好性能
1)createprocbase_proc
as
select*
o#huge_result
fromauths
execselect_proc
2)createprocselect_proc
as
select*fromarticle,#huge_result
wherearticle.author_code=#huge_result.author_codeandsex="0"
介绍说明:在同个存储过程或批处理中创建并使用个表时查询优化器无法决定这个表大小
结论:通过本实验我们知道临时数据库经过优化可以极大提高系统性能实际工作中必须考虑具体应用情况需长时间经验积累

11)怎样利用脚本自动关闭sybase数据库 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1484&show=180
不知你什么平台如果是unix,ksh
#!/bin/ksh
LOGIN="`whoami`"
["${LOGIN}"!="sybase"];then
echo"`basename$0`:Youshouldloginas\'sybase\'\\n"


exit0
fi
echo"\\n\\n"
{
isql-Usa-P-Syourservername>/dev/null2>&1<<ISQL
usemaster
go
shutdownSYB_BACKUP
go
shutdown
go
ISQL
}

12)请教存储过程动态使用表 
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1488&show=180
你指动态sql
要12.0版本以上才支持
CREATEPROCEDUREdbo.mytt
(@cvarchar(25))
AS
BEGIN
declare@ccvarchar(25)
select@cc="select*from"+@c
exec(@cc)
END

13)sybase中跨库操作
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1489&show=150
假如本机server为loc_server,远程server为re_server
在这两个server各自erface文件里都必须有定义
sp_configure"allowremoteaccess"是否为1;

在本机server上:
sp_addserverre_server
sp_addserverloc_server,LOCAL--->这样你select@@servername就有东西
在remoteserver上:
sp_addserverloc_server
sp_addserverre_server,LOCAL
在2个server上
sp_addremotelogin......
检查这两个参数
numberofremotesites
numberofremoteconnections.
然后:
如果isql从loc_server到rs_server
connecttors_server
disconnect
rs_server...sp_who在loc_server上执行rs_server上sp_who
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1560&start=15&show=90
这里给你提供篇这方面资料:
如何实现两个SybaseAdaptiveServer的间数据通信
在进行以Sybase作为后台数据库MIS系统开发时经常会碰到需要在两个SybaseAdaptiveServer的间进行数据通信问题要解决这问题通常由两类思路方法:其便是在前台来做;这种思路方法般是通过建立多个事务分别连接到区别Server在应用中通过编程实现数据交换这种思路方法缺点在于可维护性差还有点是由于需要多个事务肯定也会影响效率另外类思路方法就是利用SybaseTransactSQL在后台来做这类思路方法把数据通信工作交给了SQL服务器自己去做这种思路方法显而易见种有点便是可维护性好当业务发生变化或服务器设置改变时可以很少修改大部分情况是不用修改应用下面举个简单例子来介绍下如何利用TransactSQL在后台实现SQL服务器的间数据通信
----假设有两台操作系统都是WindowsNTSybaseSQL服务器LocalServer、RemoteServer两者能够相互访问即应是通过网络相连;在LocalServer和RemoteServer上分别有数据库LS_database和RS_database;在数据库LS_database和RS_database里分别有表LS_table和RS_table
----假设现在业务规则是当LS_table更新时需要更新RS_table
----要实现这种业务逻辑首先需要在RemoteServerRS_database里建立至少个带参数存储过程设为pro_upd_rst用来更新RS_table;其次需要在表LS_table上建立 3个触发器:设为update_rst、delete_rst和insert_rst在这些触发器中RS_database中存储过程即采用触发器传递参数进行远程存储过程(RemoteProcedureCalls)技术来实现当LS_table发生更新时触发器update_rst、delete_rst和insert_rst中有个会被触发通过临时表inserted和deleted能够得到更新信息赋给相应变量传递参数给pro_upd_rst并
----需要提到点是Sybase数据库缺省安装并没有设置RPC所以还要对LocalServer进行些设置工作点比较有必要强调尤其是对于初学者来说这些设置工作主要有以下几点:
运行LocalServer接口管理器Dsedit添加个ServerServerName设置为"RemoteServer"(可以是其他串)编辑ServerAddress添加网络协议和端口号通常选择TCP/IP协议NetworkAddress设为"RemoteServer,5000"其中RemoteServer(这里指是该服务器在网络中机器名)可以用其IP地址来代替试能否Ping通RemoteServerPing通后进行下面工作
在LocalServer添加个远程服务器可以通过运行LocalServerSybaseCentral打开LocalServer"remoteservers"文件夹双击"AddRemoteServer"在编辑框内输入串设为"Remote_Local"(注意区分大小写)在下面下拉列表框中选择"RemoteServer"(这是第1步中ServerName)点击下步后在列表框中选择"sql_server"完成
重新设置LocalServer些和RPC有关参数也可以通过SybaseCentral右键点击LocalServer单击谈出菜单"configure"在下拉列表框种选择"ComponentIntegrationServices"注意下面两个参数"cisrpchandling"和"enablecis"这两个参数缺省值都是"0"应该把它们都改为"1"由于"enablecis"是静态参数所以修改后需要重起数据库才能生效最后最好检查下RemoteServer"enableremoteaccess"参数值是否为"1"(缺省情况应该是"1"\" border=0>否则改为"1"


----其中第1步可以通过编辑接口文件sql.ini(在Sybase根目录"ini"子目录下)来代替打开sql.ini在最后加入如下 3行:
[RemoteServer]master=TCP,RemoteServer,5000query=TCP,RemoteServer,5000
保存并关闭
----第2、3步可以通过系统存储过程"sp_configure"来代替在SQLAdvantage或isql中执行下列语句:
sp_addserverRemote_Local,null,RemoteServer
gosp_configure"enablecis",1gosp_configure"cisrpchandling",1
go
----LocalServer配置号以后应该测试运行SQLAdvantage或isql连接LocalServer执行下列语句"execRemote_Local.master.dbo.sp_help"再次强调点其中Remote_Local区分大小写
----上面所举只是个简单例子只能在LocalServer上RemoteServer上存储过程若要在RemoteServer上LocalServer上存储过程则要在RemoteServer进行同样设置(添加RemoteServer、重新配置RemoteServer参数等)并且要保证LocalServer"enableremoteaccess"值为"1"



14)ASE在windowsxp/2000上安装 2个注意问题
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1522&show=150
本人近日在Windowsxp上安装SybaseASE12.5开发版作学习的用遇到了点麻烦现将解决办法介绍给大家参考如有还有类似问题可联系我:email:[email protected]
、ASE12.4在XP下中文乱码解决办法:
查看注册表在键:key_local_machine\\software\\microsoft\\windowsNT\\CurrentVersion\\CurrentVerison中可知当前系统版本为5.1

进入Sybase源安装目录查看run.bat文件找到行: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
windowsnt4nt4.0
windwos2000nt5.0
windowsxpnt5.1

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

所支持加锁机制
2.1全页加锁
  全页加锁既是个新术语它又是由ASE(AdaptiveServerEnterprise)在过去所支持种加锁类型这种类型有下列特性:
对所有可被访问页面在页面级加锁
当各种类型页面以任何方式发生改变时对这些排它性页面进行加锁;而且这种加锁机制直保持到该事务终止;
当下个所需页面已经成功地获得对那些已经释放当前访问页进行共享页面加锁(如果采用了第 3层ANSI隔离则把这种加锁机制保持到该事务终止为止)
采用页级时间印记(timestamp)以确定是否发生改变详细信息记录在事务日志中以便在系统恢复时以向前或向后方式使用
  这种加锁方式常常提供性能最高解决方案特别是当应用设计时已经考虑了这些特性时更是如此但是些应用系统当发生某些活动时这种对整个页面进行加锁方式就可能会对系统性能产生有重大意义影响对于那些面对诸如文件系统或其它已经支持更细小尺度加锁机制数据库厂家产品般环境而设计应用系统而言这种情况尤其如此
  此外还存在系列问题它们要围绕着更加困难条件进行工作它们通常要采用更加具有Sybase特性解决方案对于商用应用软件Software制造厂商而言对他们是个挑战这将要求他们必须跨越他们所支持数据库平台去完成维护其原代码工作而这个工作有相当工作量在这个领域基本问题如下:
对已经按照升序值创建非群聚性索引最末端叶型页面存在着争议
对非群聚性索引表进行插入和查询时可能发生死锁;
在按照群聚性索引值进行更新和对非群聚性索引表进行查询访问的间可能发生死锁;
在没有作索引最后行可能发生冲突(尽管对最后特定地址可以使用分区);
有可能使行数很少表的间发生潜在冲突(尽管对特定地址可以使用填充因子[fillfactors]和每页最大行数[max_rows_per_page]这两个参数)


对每个页面两边进行加锁需要常常被分割开来;
如果个表特别小以致在个单页面中进行驻留那么对单访问实际上将破坏对整个表加锁机制
2.2仅对数据加锁
  仅对数据加锁机制试图去解决本文前节所关注主要问题(其他议题将在其它功能领域中加以解决)这种加锁方式支持两类区别工作方式:数据行加锁和数据页加锁在这两种情况中对于它们所支持加锁方式都和以前加锁机制有所区别仅对数据加锁具有下列特性:
在索引页面中不会破坏事务加锁相反而是采用了种称的为锁存机制锁存是种类似于旋转锁(spinlocks)同步思路方法它们和事务无关并且只保留很短周期(般而言个任务在数据库中物理上改变小片数据时这个周期相当于在共享存贮区中在个2K页面改变某些字节数据时间)旦完成的后这个任务将直接打开这个锁存当这种情况还可能临时同其它组块时这种锁存不能对服务器任务进行有上下文切换也不能涉及死锁并且只能保持主要小段时间所以它们不能产生有显著意义争用
采用个RID对单行进行数据行加锁(行标识[RID----RowID]是逻辑页号和所在页面上该行号组合);
支持固定行标识RIDs,它可以是向前允许不进行其RID改变就完成数据行移动行变大超过了它可用空间时采用上述结果对非群聚索引不需要进行任何改变
不需要进行任何争用就可以在表尾部进行插入操作功能已经增加进来.
支持采用范围加锁、下个关键字加锁和无限大加锁等方式对逻辑范围值进行加锁
支持由最顶层操作所导致页面分割这些情况直接加以提交"系统"事务可以导致在更短时间周期里保持分裂页面处于锁定状态
  为了支持这些变化需要对采用存贮表结构进行系列改善这些改进主要效果如下:
群聚索引现在被存贮为象许多人所熟悉IBMDB2产品所采用"放置索引"("placementindexes.")方式这种结构类似于非群聚性索引需要类似空间总量这种修正结构导致了在数据存贮时可以按照顺序跨数据页进行存储但是当发生插入时它们就要尽可能紧密存放以便在正确逻辑页面中不存在页面分割此外在数据页中数据顺序在新行增加时是不进行维护整理这种索引应用使每个群聚化索引周游增加了次I/O操作
行位移表已经增加到索引页和数据页中这种增加和新行索引行存贮格式具有使每个索引页面所存贮索引条目个数减少潜在能力
固定行标识(RIDS)行移动时对于分配新行位置向前地址被放在用于驻留该行位置上当这种移动需要改变非群聚性索引时对该行访问需要增加次I/O操作以得到\'向前\'位置
般而言索引将更小和更短这是如下原因:
从每个叶级页面中采用双重键限制机制来限制双重键(Duplicatekey)例如如果值"绿"("GREEN")在下列行标识(RIDs)值等于123-1234-2和345-3行中,就分别存贮值“绿”("GREEN")123-1234-2345-3而不是存贮值"绿"("GREEN,") 3次在每个索引页中每个值只存贮
在非群聚性索引树非叶型结点中将后缀实行压缩(例如如果键值是"GREEN"和"HAMILTON"而在这两个值的间发生分裂那么就在非页级索引页面中存储"G"和"H"\" border=0>
2.3数据页和数据行加锁
  只对数据加锁机制支持两种方式:数据页加锁和数据行加锁这些和它们工作方式和所提供功能相类似这两种方式仅在对数据访问产生阻碍作用时在加锁尺度上有所区别在数据页加锁方式下再采用数据行加锁方式具有两种作用(种起正向作用种起反向作用)首先较小尺度加锁机制使用可能导致减少争用和冲突然而当大量数据发生变化时就有可能对加锁产生大量阻碍情况发生
2.4特定使用加锁类型
  除非对配置参数加以特定对所有表都予置了隐含全页面加锁机制
sp_configure\'lockscheme\',[allpages|datapages|datarows]
  当数据库从原先版本服务器中转储出来重新加载时所有表都被定义为全页面加锁当建立个新表时可以不使用这个缺省值可采用如下句法格式:
createtable<tablename>…lock[allpages|datapages|datarows]
  为了在使用个表中改变加锁类型可以采用如下句法格式:
altertable<tablename>lock[allpages|datapages|datarows]
  在个现存表中改变加锁方式将引起下列 3种行动后果发生:
首先如果张表从全页加锁转变为仅对数据加锁或者从仅对数据加锁转变为全页加锁在这两种类型的间就要对表进行选择以允许进行存贮格式改变如果这是个分区表就要同时假定必要并行级别和工作线程已经配置好情况下才能执行
其次,对表中群聚性索引必须重新创建我们能保证数据所以如果从全页加锁方式转换为只对数据加锁时这种重新创建可以通过"withsorted_data"来完成然而当从仅对数据加锁机制转换为全页加锁方式时就要进行并行索引创建操作(请注意:如果这是个分区表时那么并行等级和工作线程数目必须加以配置才能允许进行这种改变否则这种迁移将会失败)
最后非群聚性索引将被重建如果服务器已经为并行处理所加以配置当进行本步骤时将加以采用
  由于这些活动同潜在工作量有关从全页加锁机制改变为仅对数据加锁或从仅对数据加锁改变为全页加锁机制都可能是耗费时间活动为了标注这有以下些选择:
如果可能应该配置使用并行方式这至少对执行非群聚性索引哈斯(杂凑即hashed)创建思路方法是必须但是如果可能采用分区表和分区扫描将使系统得到更大改进


在选择进入和创建群聚性索引的后该任务将被设置检查点(checkpoed)所以如果有充分硬件资源通过允许在任何个时间点上检查点任务可以具有多于10个(系统缺省值)异步I/O请求利用dbcc进行调谐将能够带来有益效果(\'maxwritedes\',number)
步作为降低使用检查点成本种思路方法在相关高速缓冲池(cachepool)、大数据量I/O操作中采用对高淘汰程度进行标记思路方法并允许清洁(好象家庭主妇样)保持特别活跃状态将为那些检查点需要从高速缓冲池中刷新较"脏"页面而增加I/O操作次数并因此花费了在检查点上时间都能够大大减少作出贡献
如果预先进行了配置则可以对并行选择进入可以使用预先分配盘区所以通过将sp_configurenumberofpre-allocatedextents设置为16也将对系统性能有明显积极效果
  备注:在仅对数据加锁类型的间进行改变不需要对数据进行备份而且执行起来只需很短段时间
[以上为摘自sybase公司站点上资料]
据我个人使用经验我觉得对于并行性较高应用要充分考虑使用行级锁这样对于提高并发性能至关重要!当然事务都存在利弊两方面使用行级锁也会带来些相应弊端比如使用锁越多占用内存也越多在使用行级锁表上频繁进行数据删除、插入操作久而久的会造成数据库碎片大量生成数据库性能会下降这就需要定时进行reorg操作但该操作比较耗时且影响业务!
16)请问!怎样设置自动清log,和temp阀值?
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1507&show=120

般我们可以为某段设置多个阀值但只需在达到最后机会阀值时作些空间清理操作.
在你数据库中设置阀值并指定达到阀值后处理过程:
查看当前数据库某段最后机会阀值:
sp_helpthreshold"default"
或者察看其他段信息
修改某段最后机会阀值:
sp_modythreshold数据库名,段名,自由空间名,[新过程名[,新自由空间名[,新段名]]]
sp_modythresholdmydb,"default",200,NULL,175
将最后机会阀值由200页调整到175页
具体其他操作可以参考相关手册!
第 2步编写阀值处理过程:
createproceduresp_thresholdaction
@dbnamevarchar(30),
@segmentnamevarchar(30),
@space_left,
@status
as
declare@SpaceLeftvarchar(20),
@Statusvarchar(20)
select@SpaceLeft=str(@space_left,6,0)
select@Status=str(@status,6,0)
pr"Logisdumpped(\'%1!\'for\'%2!\',SpaceLeft:\'%3!\',Status:\'%4)\',
andisdumped.",@segmentname,@dbname,@SpaceLeft,@Status
dumptransactiontempdbtowithtruncate_only


不过我还是不建议用最后机会阀值来进行自动维护


17)


qjhadm 回复于:2002-12-25 13:35:20个字:真不错!

lljj 回复于:2002-12-25 14:20:42精华!+收藏!

jazy 回复于:2002-12-25 14:20:48谢谢FreeBob兄!
该贴将置为精华并置顶
我也发现论坛些帖子会定期删除!
所以我们要收集些自资料作为精华这样就不至于被删了!
希望大家起努力!
些已经正确解决经验贴到该贴中!
如果是新问题请在新贴中贴出!
谢谢合作!

greathb 回复于:2002-12-25 14:29:41freebob真是好样

jazy 回复于:2002-12-25 16:46:2917〉sybase相关产品中文显示问题:
问:
安装SybaseASE12.5时如果是中文显示方框乱码安装使用java制作可能和什么有关我不太懂?
答:安装前将安装文件中此路径下:shared-1_0\\jre1.2.2\\lib\\font.properties.zh.NT4.0->改为\\shared-1_0\\jre1.2.2\\lib\\font.properties.zh.NT5.0
下!
正版12.5没有出现这个问题估计你SYBASE12.5没有打包JRE吧!
[color=#9400D3]补充介绍说明:类似情况在安装 ASEIQ 和 sybase 客户端时视区别操作系统和机器都可能存在这个问题出现这种情况就得考虑打补丁或修改jre名字
[/color]


xzwxh 回复于:2002-12-31 23:16:38zhichi

菜虾 回复于:2003-01-04 03:47:15绝对珍藏

learningunix 回复于:2003-01-05 16:02:55不错我想问下有没有有关在solaris下面安装sybase详细资料

procrus 回复于:2003-01-06 04:38:40安装起来很简单吧注意共享内存给几个环境变量就可以了

chenlin 回复于:2003-01-07 12:34:29不错精华所在

sarge119 回复于:2003-01-08 09:18:34谢谢受益非浅

\" border=0>

learningunix 回复于:2003-01-08 20:36:59那位老兄有详细在solaris下面安装sybase资料谢谢!

luomo 回复于:2003-01-24 13:12:41用powerDesigner9.5倒表结构存储过程时重是出错有成功过吗?
传授传授你们经验谢谢!

Tags:  sybaseiq sybasease sybase数据库 sybase

延伸阅读

最新评论

发表评论