IT168技术频道 Sybase数据库技术中心a
来源:百度文库 编辑:神马文学网 时间:2024/04/30 16:07:44
=========================================================== Sybase12.5各个版本的新功能 =========================================================== sybase 12.5各个版本的新功能
根据sybase的ppt整理
ASE12.5.0.3新功能
一、性能监测系统表
一组新的系统性能监测系统表,利用这些系统表中的信息对分析ASE服务器的性能非常方便。这些性能监测系统表也是DB-XRAY的工作基础。
MDA表,安装和配置文档中都有,这个很有用的。
二、多个临时库
能够让你在系统临
数据库tempdb外创建用户临时数据库。使用多个临时数据库的主要目的是减轻对系统临时数据库中系统表和日志表的争用。
三、外部文件系统
能够让你通过SQL语言访问外部文件系统,通过创建代理表将数据表映射到外部文件系统的文件目录或文件。
访问文件目录
访问文件
这个要licenses
四、Java和XML在DB中的应用
Adaptive Server内部提供了一个Java运行环境,这样就可在ASE中运行java代码。数据库服务器ASE就提供了一个新的方法来管理和存储数据及应用逻辑。
在ASE中可用下面三种方法使用java功能:
将java类用作SQL数据类型
在数据库中调用java方法
在数据库中存储和查询XML
五、新增强的功能和新函数
disk resize
sampling : update statistics
可变页大小
large column size
migrate utility
ALS(asynchronous log service)
服务器动态参数配置
函数
year(date_expression) :表达式中年的部分
month(date_expression) :表达式中月份的部分
day(date_expression) :表达式中天的部分
str_replace(string_expression1, string_expression2,
string_expression3) :使用string_expression3值替换 string_expression1中的string_expression2 字符串。
left(character_expression, integer_expression) :返回字符串的左边指定字符个数的字符串。
len(string_expression) :返回字符串的字符(character)数,注意不是字节数,而且不包含空隔。
square(numeric_expression) :返回平方数
newid([optionflag]) :产生一个32位或36位(包括破折号)的可读随机字符串。
六、SQL debugger
ASE12.5提供一个命令行方式的debug工具sqldbgr,使用它可对存贮过程和触发器进行debug跟踪。
ASE 12.5.1新功能
一、动态数据缓存
ASE 12.5.1能够动态改变数据缓存,而不需要象以前版本一样重新启动ASE服务器。使用动态sp_cacheconfig功能,能够立即释放内存并供从重新分配。利用sp_cacheconfig的动态功能,能够完成下面任务:
创建新的数据缓存
扩大已有数据缓存的空间
改变数据缓存的类型
二、数据库空间自动增长
ASE 12.5.1提供数据库空间和数据库设备自动增长的功能,当数据库空间不够时,数据库首先扩大空间;当数据库设备空间不够时,数据库设备再扩大空间。数据库空间自动增长是通过sp_dbextend存贮过程来设置的。
三、数据库装载和卸载
装载和卸载数据库的目的是为了将数据库从一个ASE服务器移到另一个ASE服务器。这样我们就可使用ASE外部命令拷贝数据库,如UNIX命令dd或ftp 。使用这种办法拷贝数据库,不需要ASE服务器down机。
卸载和装载数据库有三个步骤:
使用unmount命令卸载数据库
拷贝相关文件
使用mount命令装载数据库
使用online database命令使目标ASE服务器中数据库在线
四、SQL派生表
SQL派生表(SQL derived table)是由嵌套select语句产生的。
五、新增date和time数据类型
ASE 12.5.1增加了两个新的数据类型来表示时间和日期:date和time
对应于这两个数据类型增加了两个函数:
current_date() : 返回当前日期
current_time() :返回当前时间
六、任务调度器
任务调度器(job scheduler)组件
一个ASE内部任务 : JS Task
一个外部进程 : JS Agent
sybmgmtdb数据库和存贮过程
预定义的模板(template)
七、与MS SQL Server扩展功能的进一步兼容
ASE 12.5.1与MS SQL Server扩展功能更加兼容,这样便于将MS SQL Server上的应用移植到Sybase ASE 上 。
ASE 12.5.2 新功能
一、语句缓存(statement cache)
语句缓存能够让ASE保存已经执行的SQL语句文本,这样ASE服务器在接收到新的SQL语句时,就可以与缓存中的SQL语句进行比较,如果发现匹配的SQL语句,ASE就可使用以前的执行计划。
二、数据备份(dump database)加密
三、对linux系统大内存的支持
在IA32的Linux使用PAE技术后可支持64G的内存
在 ASE 12.5.2前版本, 最多只能支持 2.7G内存
个人感觉这个ppt讲的非常好,特此择了一些,具体用法自己查吧。
Sybase 发表于:2006.08.04 16:01 ::分类: ( Sybase数据库管理技术 ) ::阅读:(4035次) :: 评论 (4) =========================================================== sybase数据库中分离日志与数据文件 ===========================================================
详细步骤,已测试成功
1、备份数据库,包括 master 和你要分离数据与日志的应用库,最好是备份所有数据库;
2、检查数据库的日志是否有单独的存放设备,如有,则直接到第5步;
3、如没有单独的日志设备,则增加一个设备:disk init .....;
4、alter database db_name log on new_log_device=xxx;
5、sp_logdevice dbname,new_logdev (移动日志设备);
6、sp_dropsegment logsegment, db_name, device_name (如果数据库有多个设备既放数据又放日志,则要相应的运行几次;
7、创建一个临时表,然后往里面插入足够的数据,然后截断日志;
use db_name go create table t1 (id int) go declare @loop int select @loop = 1 while(@loop<500) begin insert t1 values(@loop) select @loop = @loop + 1 end go dump tran db_name with truncate_only go
8、到此,数据与日志的分离已经完成,使用sp_helpdb db_name或sp_helplog查看是否已分离。
增加和删除 segment 并不移动当前的已分配空间。日志至少有一个扩充(extend)位于以前的 segment 上(还记得吗,为对象分配存贮单元时,实际是以 extend 为单位的。)。如果当前 extend 被填满,需要再为日志分配时,ASE会在新的 segment 上分配(segment 约束它不得不这么做)。此时,截断日志就可以回收以前分配的 extend 了。最后,还是要备份所有数据库.
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(28343次) :: 评论 (62) =========================================================== SYBASE内存和缓冲区管理 ===========================================================
为SQLSERVER提供的可用内存越多,SQLSERVER就有越多的资源使用于缓冲区,即可减少服务器从磁盘读取数据以获取静态信息或编译过程计划的次数。调整SQLSERVER所占内存可通过在服务器配置文件中设置totalmemory参数进行,该参数的值指定了SQLSERVER在启动时所需的内存总量,如若该值为10000页,则SQLSERVER在启动时就将试图获得10000*2K=19.5M的内存,若不能满足则启动失败。
注意,若操作系统在进程的整个生命周期中支持动态内存分配,则可在SQLSERVER启动后为其分配额外的内存。
SQLSERVER启动时将内存分配给SQLSERVER可执行代码,SQLSERVER使用的静态内存,用户可配置参数占用的内存及不驻留在缓存上的数据结构,剩余的内存分配给两种SQLSERVER缓冲区即:数据缓冲区和过程缓冲区。两缓冲区的大小对整个系统的性能影响很大,在一个开发系统上可能要增加过多端程缓冲区的专用内存,而在一生产系统上则需减少过程缓冲区大小以便获得更大的数据缓冲区。
1.确定缓冲区大小
在totalmemory配置的总空间中,首先要除去可爱执行代码所占空间,其大小因平台和版本不同而异,可使用sp_configure查询executablecodesize参数的值得知,一般为3-4MB;其次需除去内部结构所占空间,内部结构分成内核结构和服务器结构,亦可将此部分内存看成静态开销和用户配置参数占用两个部分,前者大小不受用户可配置参数的影响,一般为2-3MB,而后者即用户可配置参数的大小则取决于配置参数的类型及其值的大小,包括numberofuserconnections, numberofopendatabases,numberofdevices,numberofopenobjects,numberoflocks等,要得到这些用户配置参数使用内存大小的精确估计,可调用不带选项的sp_configure以显示所有参数和每个参数使用的内存量,其和即是用户配置参数所占用内存。
除去上述占用,剩余内存将以procedurecachepercent配置参数的值按比例分配给过程缓冲区和数据缓冲区,例若值为20,即表示剩余内存的20%分配给过程缓冲区而80%分配给数据缓冲区。
确定缓冲区大小的另一种方法是检查SQLSERVE启动时写入SQLSERVER错误日志的内存信息,其中准确地说明了分配给过程缓冲区和数据缓冲区的数据量,以及多少个过程或其他编译对象能同时驻留在缓冲区中,如相关信息为:
server:Numberofprocbuffersassocated:556
server:Numberofblocksleftforprocheaders:629
server:Memoryallocatedforthedefaultdatacache:4144kb
前两行为过程缓冲区信息,过程缓冲区总大小是分配给过程缓冲区的内存(第一行)及分配给过程头(即存放编译对象如存储过程的地方,根据被存储对象的大小,可能需要一个或多个过程头) 的内存(第二行)之和,可存储在过程缓冲区中的编译对象受到此二者中较小者的限制。上述信息中,第一行指明了分配给过程缓冲区的缓冲区数量为556,每个缓冲区大小为76B,故过程缓冲区大小即为42256B,合21页;第二行则指明了分配给过程头的空间为629页,由此可以得出,过程缓冲区总大小为629+21=650页,合1.27M。
信息中第三行则指明了分配给默认数据库缓冲区的空间大小。此外,若配置了命名缓冲区,则相关信息还将包含每个命名缓冲区的信息,再加上这些命名缓冲区所占内存大小即得到总的数据缓冲区大小。欲知数据缓冲区大小还可通过sp_helpcache过程得到每个缓冲区和捆绑到这些缓冲区中的对象以及与不同缓冲区大小相关的开销的详细信息。
2.缓冲区管理
数据缓冲区保存SQLSERVER当前使用和最近使用过的数据页,索引页和日志页.初装SQLSERVER时,会产生一个默认的数据缓冲区.SQLSERVER允许系统管理员把数据缓冲区分成独立的命名数据缓冲区,然后可把数据库或数据库对象捆绑到这些命名缓冲区上,以对缓冲区空间进行更合理的组织,控制数据库,表和索引在内存的驻留.另外,系统管理员还可在缓冲区内创建缓冲池,用于执行大块的磁盘I/O,改善数据查询性能,减少磁盘I/O.有关数据库缓冲区的指令有:
sp_cacheconfig创建或删除命名缓冲区,改变缓冲区的大小或类型
sp_poolconfig创建或删除I/O缓冲池,并改变其大小
sp_bindeache将数据库或数据库对象捆绑到缓冲区
sp_unbindcache从一个缓冲区中取消对指定对象或数据库的捆绑
sp_unbindcache_all从一个缓冲区中取消所有对象的捆绑
sp_helpcache报告有关数据缓冲区的小结信息,并显示捆绑于缓冲区的数据库和对象
sp_cachestrategy报告有关为表,索引设置的缓冲区策略,禁止或重新允许先提或MRU策略
sp_logiosize为日志改变默认的I/O大小
sp_spaceused估计表和索引大小或有关数据库使用的空间量的信息
sp_estspace估计表和索引的大小,给出表包含的行的数目
sp_help报告表将捆绑于哪个缓冲区
sp_helpindex报告索引将捆绑于哪个缓冲区
sp_helpdb报告数据库将捆绑于哪个缓冲区
setshowplanon报告有关用于查询的I/O大小和缓冲区的应用策略
setstatisticsioon报告为查询进行的读操作数量
setprefetchon/off允许或禁止某个会话的预先提取
(1)查询数据库缓冲区的信息
查看默认数据缓冲区的大小,可使用指令sp_cacheconfig"defaultdatacache",显示结果如下,由两部分构成,上部分报告每个缓冲区中的内存池配置信息并总计了所有配置缓冲区的大小;下部分提供了每个缓冲区中的其他详细信息。
第一部分输出各列含义为:cachename为缓冲区名;status指示该缓冲区是否激活(值为pend/act时表示该缓冲区刚建立,重启后将被激活;值为active时表示该缓冲区目前正处于激活状态;值为pend/del时表示该缓冲区处于激活状态,但在服务器重启后将被删除);type 指示缓冲区是否可以存储数据("mixed")和日志页("logonly"),只有默认缓冲区才会有"default"类型,且默认的数据缓冲区类型不能改变,其他类型缓冲区也不能改为"default"; configvalue显示下次SQLSERVER重启后缓冲区的大小,在此情况下,默认缓冲区不能显式配置,故信息中其大小为0;runvalue显示SQLSERVER目前使用的大小,对于默认数据缓冲区,该值将作为未显示配置到其他缓冲区中的所有数据缓冲区空间。
第二部分输出各列含义为:IOsize显示缓冲池中的缓存大小,所有缓冲池缺省都分配2K空间(有效空间大小为2K,4K,8K,16K);washsize指示缓冲池的刷洗区大小;configsize和runsize显示配置大小和目前使用的大小,该两值在2K的缓冲池中是不同的(因为不能显式配置其大小),而对于其他缓冲池,若试图在缓冲池间移动空间而一些空间又不能被释放时, 上述两值也不同。
CacheNameStatusTypeConfigvalueRunvalue--------------------------------------------------------- defaultdatacacheActiveDefault0.00MB59.36MB------------------------------- Total0.00MB59.36MB================================Cache:defaultdatacache,status:Active,Type:DefaultConfigSize:0.00MB,Runsize:59.36MBIOSizeWashSizeConfigSizeRunSize----------------------------------- 2KB512KB0.00MB59.36MB
(2)配置数据缓冲区
配置数据缓冲区有两种途径:一是使用过程sp_cacheconfig和sp_poolconfig进行交互式配置,二是编辑配置文件中的totalmemory参数后重启使之生效。
A.交互式配置
创建命名缓冲区(新创建的命名缓冲区从缺省缓冲区defaultdatacache中分配空间) ,每次执行sp_cacheconfig或sp_poolconfig时,SQLSERVER都将新的缓冲区或缓冲池信息写入配置文件中并将文件的旧版本拷贝到一个备份文件中,给出备份文件名的信息被送至错误日志。
创建一个新的名为pubs_cache的10M缓冲区指令如下,大小单位除M外,还可为P页,K,G, (默认为K).该指令将改变系统表并将新值写入配置文件但暂不激活缓冲区,要使其生效须重启SQLSERVER.
sp_cacheconfigpubs_cache,"10M"
在重启SQLSERVER使新值生效前,可先用sp_cacheconfig"pubs_cache"查看配置信息。如下,其中的status列值为pend/act说明该缓冲区的配置是挂起的,要待重启后生效,故Configvalue(配置的值)和Runvalue(正在使用的值)不同。
CacheNameStatusTypeConfigvalueRunvalue -------------------------------------------- pubs_cachepend/actmixed10.00MB00.00MB ------------------------------- Total10.00MB00.00MB
重启后再允许不带缓冲区名参数的sp_cacheconfig,则信息改变如下,可见pubs_cache 已被激活,默认缓冲区从其空间中分出了10M给该缓冲区.可利用sp_cacheconfig过程设置默认数据缓冲区的最小值,该部分空间将被锁定给默认数据缓冲区.例如设置默认数据缓冲区大小最少不低于25M则指令为sp_cacheconfig"defaultdatacache""25M"。
CacheNameStatusTypeConfigvalueRunvalue --------------------------------------------------------- defaultdatacacheActiveDefault0.00MB49.28MBpubs_cacheActivemixed10.00MB10.00MB------------------------------- Total10.00MB59.28MB================================Cache:defaultdatacache,status:Active,Type:DefaultConfigSize:0.00MB,Runsize:49.28MB IOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB512KB0.00MB49.28MB===============================Cache:pubs_cache,status:Active,Type:mixedConfigSize:10.00MB,Runsize:10.00MBIOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB512KB0.00MB10.00MB
若要保留一个只用于事务日志的缓冲区的类型,可以将缓冲区的类型设为"logonly", 如创建"logonly"类型的pubs_log缓冲区为sp_cacheconfigpubs_log,"7M","logonly", 下示为该缓冲区在重启前的状态。
CacheNameStatusTypeConfigvalueRunvalue --------------------------------------------------------- pubs_cachepend/actlogonly7.00MB0.00MB ------------------------------- Total7.00MB0.00MB
创建命名缓冲区后一般都须将某些对象捆绑到该缓冲区上。若建立命名缓冲区后未将任何对象捆绑到该命名缓冲区上,则该命名缓冲区所占内存将被浪费,因为任何未指定缓冲区的对象都将缺省使用默认数据缓冲区defaultdatacache.
将数据缓冲区划分为缓冲池建立数据缓冲区后,可将其划分成缓冲池,各不同的缓冲池具有不同的I/O大小,当SQLSERVER进行大I/O操作时,可将许多页一次读入缓冲区中,故可提高I/O效率.这些页总是被当作一个单元进行处理,它们共存于缓冲区中,作为一个单元被写到磁盘中。
缓冲池的页大小可为2K,4K,8K,16K,缓冲池的总大小不能低于512K.所有关于缓冲池的配置都是动态的,无需重启SQLSERVER即可生效.SQLSERVER内2K页缓冲池的个数必须保持一个合理的值,否则将会影响SQLSERVER性能,因为某些命令只能使用2K的I/O块如diskinit及某些dbcc命令。
在pubs_cache数据缓冲区中创建一个每页16K,总空间为7MB的缓冲池,指令如下.通常,创建命名数据缓冲区时,其空间总是被默认划分为每页2K的缓冲池,创建其它页大小的缓冲池时,该2K页缓冲池空间被部分分配给新缓冲池.下例中2K页大小的缓冲池原共有10M空间,分配给7M给16K页的新缓冲池后,2K页缓冲池还剩3M空间。
sp_poolconfigpubs_cache,"7M","16K">;go>;sp_cacheconfigpubs_cacheCacheNameStatusTypeConfigvalueRunvalue--------------------------------------------pubs_cacheActivemixed10.00MB10.00MB------------------------------- Total10.00MB10.00MB===============================Cache:pubs_cache,status:Active,Type:mixedConfigSize:10.00MB,Runsize:10.00MBIOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB512KB0.00MB3.00MB16KB1424KB7.00MB7.00MB
在默认数据缓冲区中也可创建缓冲池,如创建16K缓冲池,空间大小为8M,则指令为:
sp_poolconfig"defaultdatacache","8M","16K".
若要为一个数据库的事务日志创建缓冲区,应配置缓冲区中大部分空间来匹配日志I/O的大小.默认值为4K,若没有4K的可用缓冲池,SQLSERVER就为日志使用2K的I/O.
日志I/O的大小可通过系统过程sp_logiosize来改变,每个数据库的日志I/O大小会在SQLSERVER启动后的错误日志中报告,也可通过使用数据库和执行不带参数的过程sp_logiosize来检查一个数据库的日志I/O大小.如为pubs_log缓冲区配置4K页大小的缓冲池指令为sp_poolconfigpubs_log,"3M","4K",也可在默认数据缓冲区中创建一个4K页缓冲池,以供未被捆绑至其它缓冲区的任何数据库的事务日志来使用:sp_poolconfig"defaultdatacache","2.5M","4K".
此外,可修改缓冲池大小,如从16K页I/O的缓冲池中取出1M空间增加到4K页I/O缓冲池中:sp_poolconifgpub_cache,"1M","4K","16K"
缓冲区悃绑操作
系统管理员把数据缓冲区分成独立的命名数据缓冲区后,可将数据库对象捆绑到这些缓冲区上,以控制数据库,表和索引在内存的驻留.若建立命名缓冲区后未将任何对象捆绑到该命名缓冲区上,则该命名缓冲区所占内存将被浪费,因为任何未指定缓冲区的对象都将缺省使用默认数据缓冲区defaultdatacache.为了将任何系统表, 包括事务日志syslogs捆绑至缓冲区中,数据库须处于单用户模式.对象被捆绑后立即生效而无需重启SQLSERVER.注意,进行捆绑或删除捆绑操作时,SQLSERVER需锁定相应对象,故相应对象上的其它操作可能有延迟.此外,可不删除现有的捆绑而重新捆绑对象.另外,当被捆绑对象上有脏的读活动或有打开的游标时,捆绑或删除捆绑的操作将不能进行。
1>;sp_dboptionpubs2,single,true置pubs2库为单用户状态 2>;usepubs2 3>;checkpoint 4>;go准备进行数据库对象的捆绑。注意,捆绑对象须在对象所在的库中进行。 >;sp_bindcachepubs_cache,pubs2,titles 将pubs2库中的表titles捆绑至缓冲区pubs_cache. >;sp_bindcachepubs_cache,pubs2,titles.titleind 在titles上捆绑索引,并将pubs2库中的表titles捆绑至缓冲区pubs_cache. >;sp_bindcachepubs_cache,pubs2,"hj.sale_east" 将pubs2库中用户hj的表sale_east捆绑至缓冲区pubs_cache. >;sp_bindcachepubs_log,pubs2,syslogs 将pubs2库的事务日志syslogs捆绑至缓冲区pubs_log. >;sp_bindcachepubs_cache,pubs2,au_pix,"textonly" 表的text和image列存储在一个单独的数据结构中,若将此表捆绑至缓冲区,需加"text"参数. 1>;sp_dboptionpubs3,single,true置pubs3库为单用户状态 2>;usepubs3 3>;checkpoiot 4>;usemaster 5>;go准备进行数据库的捆绑,注意,捆绑数据库须在master库中进行。 >;sp_bindcachetempdb_cache,tempdb
将数据库tempdb捆绑至缓冲区tempdb_cache。注意,被捆绑到日志缓冲区上的对象只能是syslogs表。可通过sp_helpcache过程查询所有或指定缓冲区及其中被捆绑对象的捆绑信息.如下例示,其中status列报告缓冲区的捆绑是("V")否("I")有效.若数据库或对象被捆绑至缓冲池而该缓冲区已被删除,则捆绑信息仍保留在系统表中但缓冲区捆绑被标记无效,所有无效的捆绑对象均使用默认的数据库缓冲区.若随后用与被删除的缓冲区相同的名字创建了另一个缓冲区,则当该缓冲区通过重启SQLSERVER而被激活时,上述捆绑又将变为有效。
删除缓冲区捆绑可用两个过程:sp_unbindcache用于删除缓冲区中对一个实体的捆绑; sp_unbindcache_all则用于删除缓冲区中对所有对象的捆绑,但若捆绑至缓冲区的数据库超过8个,或数据库的对象超过8个,就不能使用p_unbindcache_all,此情况下,必须使用sp_unbindcache删除单个的数据库或对象,使捆绑的数据库不超过8个.此外,当删除缓冲区对一个对象的捆绑时,内存中所有当前的页都被从缓冲区中清除.
>;sp_unbindcachepubs2 删除对数据库pubs2的捆绑 >;sp_unbindcachepubs2,titles 删除对pubs2库中对titles表的捆绑 >;sp_unbindcachepubs2,titles,titleidind 铲除对pubs2库中titles表上titleidind索引的捆绑. >;改变命名数据缓冲区大小
可通过sp_cacheconfig指定一个新的空间以增加或减少指定缓冲区的大小,所有新增空间都将从缺省数据缓冲区defaultdatacache内的2K缓冲池中被加到指定缓冲区内的2K页缓冲池中,所有减少的空间亦从指定缓冲区内的2K页缓冲池中被释放到缺省数据库缓冲区defaultdatacache内的2K缓冲池中。
>;sp_cacheconfigpubs_cacheCacheNameStatusTypeConfigvalueRunvalue --------------------------------------------pubs_cacheActivemixed10.00MB10.00MB------------------------------- Total10.00MB10.00MB =======================================Cache:pubs_cache,status:Active,Type:mixedConfigSize:10.00MB,Runsize:10.00MB IOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB720KB0.00MB3.00MB 4KB1024KB4.00MB4.00MB 16KB1424KB3.00MB3.00MB
现以sp_cacheconfigpubs_cache,"20M"后重启,则改变如下:
>;sp_cacheconfigpubs_cache CacheNameStatusTypeConfigvalueRunvalue---------------------------------------------- pubs_cacheActivemixed20.00MB20.00MB------------------------------- Total20.00MB20.00MB ========================================Cache:pubs_cache,status:Active,Type:mixedConfigSize:20.00MB,Runsize:20.00MBIOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB512KB0.00MB13.00MB4KB1024KB4.00MB4.00MB16KB1424KB3.00MB3.00MB
返回pubs_log缓冲区报告:
>;sp_cacheconfigpubs_logCacheNameStatusTypeConfigvalueRunvalue ------------------------------------------- pubs_logActivelogonly7.00MB7.00MB------------------------------- Total7.00MB7.00MB====================================Cache:pubs_log,status:Active,Type:logonlyConfigSize:7.00MB,Runsize:7.00MB IOSizeWashSizeConfigSizeRunSize ----------------------------------- 2KB512KB0.00MB4.00MB4KB1024KB3.00MB3.00MB
再运行以指令sp_cacheconfigpubs_log,"6M"后重启,则改变为:
>;sp_cacheconfigpubs_log CacheNameStatusTypeConfigvalueRunvalue----------------------------------------------pubs_logActivelogonly6.00MB6.00MB ------------------------------- Total6.00MB6.00MB===========================Cache:pubs_log,status:Active,Type:logonlyConfigSize:6.00MB,Runsize:6.00MBIOSizeWashSizeConfigSizeRunSize----------------------------------- 2KB512KB0.00MB3.00MB4KB1024KB3.00MB3.00MB
欲彻底删除一个数据缓冲区,将其大小复位为0可使用sp_cacheconfigpubs_log,"0". 则将缓冲区状态变为"pend/del",重启SQLSERVER后此改变生效.在执行该操作前,缓冲区需保持激活状态,捆绑至缓冲区的所有对象仍使用该缓冲区执行I/O操作.若有对象捆绑于待删除的数据缓冲区,则SQLSERVER重启后,缓冲区的捆绑被标记为无效,所有无效缓冲区捆绑的对象都使用默认数据缓冲区.当捆绑被标记为无效时,警告信息将被输入错误日志.注意,默认数据缓冲区不能删除。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(2427次) :: 评论 (1) =========================================================== SYBASE数据库日志详解 ===========================================================
我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。
一、SYBASE SQL Server 如何记录和读取日志信息
SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。
二、日志设备
Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份Backup事务日志;二是防止数据库溢满;三是可以看到Log的空间使用情况。
所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。
三、日志的清除
随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
dump transaction with truncate_onlydump transaction with no_log
通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。
以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。
四、管理庞大的事务
有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。
例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务,并执行“dump transaction”动作。
上例中的情况就可以分成两个或多个小的事务:
update tab_a set col_a=0 where col_b>x godump transaction database_name withtruncate_only go update tab_a set col_a=0 where col_b <=x go dump transactiondatabase_name with truncate_only go
这样,一个大的事务就被分成两个较小的事务。
按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(3500次) :: 评论 (4) =========================================================== Sybase数据库简介 ===========================================================
一、Sybase数据库简介
1.版本
1984年,Mark B. Hiffman和Robert Epstern创建了Sybase公司,并在1987年推出了Sybase数据库产品。SYBASE主要有三种版本,一是UNIX操作系统下运行的版本,二是Novell Netware环境下运行的版本,三是Windows NT环境下运行的版本。现在最新版本已经是 12.5,在各主流Unix操作系统中均有广泛应用。IBM AIX,HP unix,Digital Unix,Sun solaris等等。
2.Sybase数据库的特点
(1)它是基于客户/服务器体系结构的数据库
一般的关系数据库都是基于主/从式的模型的。在主/从式的结构中,所有的应用都运行在一台机器上。用户只是通过终端发命令或简单地查看应用运行的结果。 而在客户/服务器结构中,应用被分在了多台机器上运行。一台机器是另一个系统的客户,或是另外一些机器的服务器。这些机器通过局域网或广域网联接起来。客户/服务器模型的好处是:
● 它支持共享资源且在多台设备间平衡负载
● 允许容纳多个主机的环境,充分利用了企业已有的各种系统
(2)它是真正开放的数据库
由于采用了客户/服务器结构,应用被分在了多台机器上运行。更进一步,运行在客户端的应用不必是Sybase公司的产品。对于一般的关系数据库,为了让其它语言编写的应用能够访问数据库,提供了预编译。Sybase数据库,不只是简单地提供了预编译,而且公开了应用程序接口DB-LIB,鼓励第三方编写DB-LIB接口。由于开放的客户DB-LIB允许在不同的平台使用完全相同的调用,因而使得访问DB-LIB的应用程序很容易从一个平台向另一个平台移植。
(3)它是一种高性能的数据库
Sybase真正吸引人的地方还是它的高性能。体现在以下几方面:
● 可编程数据库
通过提供存储过程,创建了一个可编程数据库。存储过程允许用户编写自己的数据库子例程。这些子例程是经过预编译的,因此不必为每次调用都进行编译、优化、生成查询规划,因而查询速度要快得多。
● 事件驱动的触发器
触发器是一种特殊的存储过程。通过触发器可以启动另一个存储过程,从而确保数据库的完整性。
● 多线索化
Sybase数据库的体系结构的另一个创新之处就是多线索化。一般的数据库都依靠操作系统来管理与数据库的连接。当有多个用户连接时,系统的性能会大幅度下降。Sybase数据库不让操作系统来管理进程,把与数据库的连接当作自己的一部分来管理。此外,Sybase的数据库引擎还代替操作系统来管理一部分硬件资源,如端口、内存、硬盘,绕过了操作系统这一环节,提高了性能。
3.Sybase数据库的组成
Sybase数据库主要由三部分组成:
(1) 进行数据库管理和维护的一个联机的关系数据库管理系统Sybase SQL Server;
Sybase SQL Server是个可编程的数据库管理系统,它是整个Sybase产品的核心软件,起着数据管理、高速缓冲管理、事务管理的作用。
(2) 支持数据库应用系统的建立与开发的一组前端工具Sybase SQL Toolset;
ISQL是与SQL Server进行交互的一种SQL句法分析器。ISQL接收用户发出的SQL语言,将其发送给SQL Server,并将结果以形式化的方式显示在用户的标准输出上。
DWB是数据工作台,是Sybase SQL Toolset的一个主要组成部分,它的作用在于使用户能够设置和管理SQL Server上的数据库,并且为用户提供一种对数据库的信息执行添加、更新和检索等操作的简便方法。在DWB中能完成ISQL的所有功能,且由于DWB是基于窗口和菜单的,因此操作比ISQL简单,是一种方便实用的数据库管理工具。
APT是Sybase客户软件部分的主要产品之一,也是从事实际应用开发的主要环境。APT工作台是用于建立应用程序的工具集,可以创建从非常简单到非常复杂的应用程序,它主要用于开发基于表格(Form)的应用。其用户界面采用窗口和菜单驱动方式,通过一系列的选择完成表格(Form)、菜单和处理的开发。
(3) 可把异构环境下其它厂商的应用软件和任何类型的数据连接在一起的接口Sybase Open Client/Open Server。
通过Open Client的DB-LIB库,应用程序可以访问SQL Server。而通过Open Server的SERVER-LIB,应用程序可以访问其它的数据库管理系统。
二、SYBASE有关概念
Sybase SQL Server是一个多库数据库系统。这些数据库包括系统数据库和用户数据库。 而不论是系统数据库还是用户数据库,都建立在数据库设备上。
1.数据库设备
所有的数据库都创建在数据库设备上。所谓数据库设备,不是指一个可识别的物理设备,而是指用于存储数据库和数据库对象的磁盘原始分区或操作系统文件。增加一个新的数据库设备时,必须对这些设备“初始化”。初始化的过程就是将物理磁盘、磁盘分区或操作系统文件变为SYBASE数据库可以识别的设备。初始化数据库设备使用DISK INIT命令:
DISK INIT
NAME=设备名,
PHYSNAME=物理设备名,
VDEVNO=虚拟设备号,
SIZE=块数
其中,NAME指数据库设备名,此名将用于CREATE DATABASE和ALTER DATABASE命令。PHYSNAME是原始磁盘分区或操作系统文件名。VDEVNO是数据库设备的标识号,在SQL Server中,它必须是唯一的。SIZE的单位是2K的块,对于新创建的数据库,最小的SIZE是model数据库的尺寸,即1024个2K的块(2M)。
例如:/*将/dev目录下400M的物理设备初始化为SYBASE的数据库设备tele114_log01*/
1>disk init 2>name=“tele114_log01”, 3>physname=“/dev/rtelelog” 4>vdevno=45>size=204800 /*2Kbyte*204800=400Mbyte*/ 6>go
2、段
数据库设备从逻辑上被划分为数据库段以允许将某一特定的对象放置在指定的段上(创建对象时指定),一数据库设备可拥有多达192个段,一段可使用255个逻辑设备上的存储空间。当用户创建一个数据库时,SQL SERVER 会自动在该数据库中创建三个段: SYSTEM、LOGSEGMENT 、DEFAULT,这三个段分别用来存储数据库的系统表、事务日志和其他数据库对象 。
在数据库中创建段的步骤是:
x 先用Disk init 初始化物理设备
x 通过使用Create database 和alter database 的on 子句,使数据库设备对数据库可用,于是新设备自动增加到数据库的default 和system段。
一旦数据库设备存在并对数据库可用,使用存储过程Sp_addsegment 定义数据库的段。语法如下:
Sp_addsegment 段名,数据库名,设备名
3、系统数据库
安装Sybase数据库时自动生成的下列系统数据库:
● 主数据库master;
● 模型数据库model;
● 系统过程数据库sybsystemprocs;
● 临时数据库tempdb。
也可选择下列数据库:
● 安全审核数据库sybsecurity;
● 示例数据库pubs2;
● 命令语法数据库sybsyntax。
(1) master数据库
包含许多系统表和系统过程,从总体上控制用户数据库和SQL Server的操作,构成了SYBASE系统的数据字典。MASTER数据库主要记录信息为:
● 登录帐号(SQL服务器用户名);syslogins,sysremolelogins
● 正在执行的过程;sysprocesses
● 可修改的环境变量;sysconfigures
● 系统错误信息;sysmessages
● SQL服务器上每个数据库的信息;sysdatabases
● 每个数据库占用的存储空间;sysusages
● 系统上安装的磁带及磁带信息;sysdevices
● 活动锁信息;syslocks
(2) model数据库
提供了新用户数据库的初型。当我们每次用CREATE DATABASE命令 时,SQL Server都产生一个model数据库的拷贝,然后把它扩展到命令要求的尺寸。如果我们修改了model数据库,那么以后新创建的数据库都将随它而改变。下面是几个通常用到的对model数据库的改变:
● 增加用户数据库类型、规则或缺省;
● 可存取SQL Server上所有数据库的用户用sp_adduser增加到model数据库上;
● 缺省权限(特别是guest帐号)可在model中建立;
● 诸如select into/bulkcopy那样的数据库选项可在model中设置。这些设置反映到所有新创建的数据库中。它们在model中最原始的值是关(off)。
在一般情况下,大多数用户无权修改model数据库,又没被授权读取。因为model中所有内容已拷贝到新数据库中,授权读model没什么意义。
1> use model2> go3> sp_help4> go Name Owner Object_type
(3) sybsystemprocs数据库
库中存储系统过程,当用户执行一存储过程(以sp_开始)时,SQL 服务器首先在用户当前数据库中搜索指定的存储过程,如果没有相应过程,则到系统过程数据库中寻找,若没有,再到MASTER数据库中寻找。
(4)临时数据库tempdb
该数据库为临时表和临时工作提供了一个存储区域。临时数据库是SQL Server上所有数据库共享的工作空间。由于这些表都是临时的,所以每当用户退出或系统失败,这些表都将消失。
(5)安全审核数据库sybsecurity
数据库中保存系统的安全审核信息,它可跟踪记录每个用户的操作情况,为维护系统安全提供控制手段。
(6)示例数据库pubs2
为用户提供一个学习SYBASE的数据库模型。
(7)命令语法数据库sybsyntax
库中保存SYBASE数据库的命令语法及支持的语言库。
4、用户数据库
用户数据库是指用Create database 命令创建的数据库。所有新的用户数据库都要在master数据库中创建,也就是说,不能存取master数据库的用户是无权创建新的数据库的。SA可以将创建数据库的权限授予其他用户。新建数据库中存在一些系统表,在sysusers表中至少有一条记录,既该数据库的创建者。数据库创建时,创建者既为该数据库的 owner, 当然创建者可以将这一地位或这一所有权用系统过程授予别的用户。
5、数据库对象
(1)表(Tables)
在一个关系数据库中,表是最重要的数据库对象,对应于关系数据库理论中关系,与DBASE或FOXPRO中的DBF文件是类似。一切数据都存放在表中。其它数据库对象都是为了用户很好地操作表中的数据。表都以一张二维表的形式存在。其中,每一列称之为一个字段,或一个域;而每一行称之为一个记录,也就是一项数据。
有一类表,它们的名字都是以sys开头的,这些表称为系统表,系统表记录着有关SQL Server的信息。在master数据库中的表大部分为系统表,这些表是随着master数据库的创建而建立的。另外,每个用户数据库在创建时都有一个系统表的子集。
例如,只有在master数据库中才有的系统表有:sysconfigures、sysdatabases、sysdevices、syslogins等;在用户数据库和系统数据库中都有的系统表有:sysalternates、syscolumns、sysindexs、syslogs、sysobjects、sysusers等。
例:
1> use master2> go3> sp_help4> go Name Owner Object_type
(2)视图(Views)
视图是查看一张或几张表中的数据的一种方式。通过将一张或几张表中的一部分数据进行组合得到视图。视图看上去与表非常相象,但与表还是有着本质的区别。通过视图看到的数据实际上都是存放在表中的,在数据库中仅存在视图的定义。
使用视图的好处是:
● 操作方便
● 安全性
(3)索引(Index)
索引是对字段生成的,用于加快数据的检索。在Sybase数据库中,索引是由系统自动管理的,也就是说,Sybase的索引操作对用户是透明的。表的索引一旦建立,系统会自动对其进行更新维护以使它与相应表对应一致;操作时,用户无须指定索引,系统会自动确定是否使用索引进行操作。
Sybase支持三种不同类型的索引,一是复合索引,即包含几个列的索引;二是唯一性索引,即任意两行中的索引列不能有相同的取值;三是簇类索引(Clustered indexes)和非簇类索引(Nonclustered indexs),簇类索引使SQL服务器不断重排表行的物理顺序以使其与逻辑索引顺序相一致,非簇类索引则不需要表行的物理顺序与逻辑顺序一致。每个表最多只能建立一个簇类索引,非簇类索引则可建立多个。与非簇类索引相比,簇类索引的检索速度要快。应当在建立任何非簇类索引以前建立簇类索引。
(4)存储过程(Stored procedures)
存储过程是用T-SQL语言编写成的SQL子例程,它存储于SQL服务器上供用户调用执行。与一般的SQL语句和批处理语句不同的是,存储过程是经过预编译的。当首次运行一个存储过程时,SQL Server的查询处理器将对其分析,并产生最终的执行方案。由于查询处理的大部分工作已经完成,所以以后执行存储过程时速度将会很快。执行存储过程时可带参数并可调用其他存储过程,执行完毕后返回信息以指示是否成功完成相应操作。存储过程有两种:一种是SQL服务器安装时自动建立的系统存储过程(系统过程),另一种是用户自己创建的存储过程。
系统过程是用于系统管理,并且为用户提供了从事数据库管理的一种途径。这些系统过程都是以sp_开头的,它们都放在master数据库中且隶属于sa(系统管理员) 。也有很多可以在任一个数据库中运行的系统过程。
常见的系统过程有:
Sp_addgroup 在当前数据库中建立一个数据库用户组
Sp_addlogin 建立一个SQL服务器用户
Sp_adduser 在当前数据库中增加一个用户
sp_changegroup 改变数据库用户组
Sp_dboption 查询或改变数据库系统设置
Sp_dropdevice 删除设备
Sp_dropgroup 删除组
Sp_droplogin 删除帐号
Sp_help 查询数据库对象及所有数据库信息
Sp_helpdb 查询数据库信息
Sp_helpdevice 查询设备信息
Sp_helpgroup 查询组信息
Sp_helpindex 查询给定表信息
Sp_helpuser 查询用户信息
Sp_lock 查询当前加锁信息
Sp_monitor 查询SQL服务器统计信息
Sp_password 改变登录帐号口令
Sp_spaceused 查询表中的行数、数据页数及空间大小
Sp_who 查询当前用户及过程信息
Sp_syntax 查询操作语法
Sp_configure 配置系统参数
(5)触发器(Triggers)
触发器是一种特殊的存储过程,用来维护不同表中的相关数据的一致性。当在一张表中插入、删除和修改数据时,触发器就会触发另一个存储过程,从而保持数据的一致性。
(6)缺省与规则(Defaults and rules)
缺省是在数据录入时,若用户没有输入数据,SQL Server自动输入的值。 规则是可以理解为对数据库、某一列、某用户数据类型的限制。
附录:只有在master数据库中才能有的系统表
系统表名 表中的内容
Sysconfigures 一行记录了用户可设置的配置参数
Syscurconfigs 有关SQL Server当前正使用的配置参数情况
Sysdatabases 一行记录了SQL Server中的一个数据库
Sysdevices 一行记录了数据库的每一磁带转储设备,磁盘转储设备,数据库设备和磁盘分区
Syslocks 有关动态锁的情况
Syslogins 一行记录了每一有效的SQL Server的用户帐号
Sysmessages 一行记录了每一系统错误或警告
Sysprocesses 有关Server进程的情况
Sysremotelogins 一行记录了一个远程用户
Sysservers 一行记录了一个远程SQL Server
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(4470次) :: 评论 (6) =========================================================== SYBASE ASA数据库恢复方法 ===========================================================
SYBASE ASA数据库当遇到不正常关机时,很容易出现异常,如:表或索引出错,麻烦的是用drop table t_name删除表时数据库就会DOWN下。下面是我常用的两种恢复方法:
一、用备份数据库恢复
1、用备份数据库启动
2、翻译出错数据库的日志(可能有多个文件)
3、按顺序执行翻译出的日志文件,read 文件
二、没有备份数据库
现象:set rowcount 10
select * from table_name时数据down下
用dbvalid检查此表时报错
处理方法:
1、删除table_name的发布、视图
2、dbunload -c "uid=dba;pwd=sql;dbf=d:sybdatadbname.db" -e table_name -an d:db_newdbname.db"
3、用新数据库启动
4、重建table_name表(没有数据)
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(5584次) :: 评论 (13) =========================================================== Sybase数据库死锁对策 ===========================================================
死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交。本文介绍一种处理解决这种死锁的方法。
Sybase封锁原理
数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。并发控制的任务就是为了避免共享冲突而引起的数据不一致。Sybase SQL Server并发控制的方法是加锁机制(LOCKING).
锁的类型
Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。
Sybase SQL Server是自动决定加锁类型的。一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。
锁的力度
SQL Server有两级锁:页锁和表锁。通常页锁比表锁的限制更少(或更小)。页锁对本页的所有行进行锁定,而表锁则锁定整个表。为了减小用户间的数据争用和改进并发性,SQL Server试图尽可能地使用页锁。
当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。锁定策略直接受查询方案约束,如果update或delete语句没有可用的索引,它就执行表扫描或请求一个表锁定。如果update或delete语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的页锁超过锁提升阈值,SQL Server就设法给该对象分配一个表锁。如果成功了,页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁。
锁的状态
SQL SERVER加锁有三种状态:
1)意向锁(intend)—是一种表级锁,它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据页的表上获得排它锁。
2)阻塞(blocking,简记blk)—它表明目前加锁进程的状态,带有blk后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。
3)需求锁(demand)—表示此时该进程企图得到一个排它锁。它可以防止在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。
需求锁是一个内部过程,因此用sp_lock是无法看见的。
死锁DEADLOCK
简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。
SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行。
在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。
查找死锁原因
既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步:
1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。
2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。
3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查找程序并修改之。
用sp_who获取关于被阻碍进程的信息
系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则:
◆status列显示“lock sleep”。
◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。
◆loginame列显示登录操作员。结合相应的操作员信息表,便可知道操作员是谁。
Fid spid status loginame origname blk dbname cmd 0 1 lock sleep lm lm 18 QJYD SELECT 0 2 sleeping NULL NULL 0 master NETWORK HANDLER 0 3 sleeping NULL NULL 0 master NETWORK HANDLER ……
用sp_lock浏览锁
要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server进程id号,用sp_who可以得到锁定与被锁定的spid号:
◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放, 该进程就申请互斥锁。
◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。
执行该进程后屏幕显示
Fid Spid locktype table_id page row dbname Class context 0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur 0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock 0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur ……
定位出错处
根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(1823次) :: 评论 (7) =========================================================== Sybase数据库的性能优化 ===========================================================
在一个大型的数据库中,性能成为人们关注的焦点之一,如何让数据库高效有效的运行成为广大数据库管理人员和开发人员必须要考虑的问题。
性能是一个应用或多个应用在相同的环境下运行时对效率的衡量。性能常用响应时间和工作效率来表示。响应时间是指完成一个任务花费的时间,可以从以下三方面来减少响应时间:
· 减少竞争和等待的次数,尤其是磁盘读写等待次数
· 利用更快的部件
· 减少利用资源所需的时间
绝大多数性能的获得来自于优秀的数据库设计、精确的查询分析和适当的索引。最好性能的获得能够通过确立优秀的数据库设计,在开发时学会使用SQL Server查询优化器来实现。
为了取得更好的数据库性能,我们就需要对数据库进行优化,减少系统资源的竞争,如对数据cache,过程cache,系统资源和CPU的竞争。
在SQL Server中,有如下优化层次:
·应用层——大部分性能的获得来自于对你的SQL应用中查询的优化,这必须是以好的数据库设计为基础的。
·数据库层——应用共享在数据库层中的资源,这些资源包括硬盘,事务日志和数据cache。
·服务器层——在服务器层有许多共享的资源,包括数据高速缓存,过程高速缓存,锁,CPU等。
·设备层——指的是存储数据的磁盘及其控制器,在这一层,你应尤其关注磁盘的I/O。
·网络层——指连接用户和SQL Server的网络。
·硬件层——指可利用的CPU。
·操作系统层——理想地,SQL Server是一台机器的唯一主要应用,它必须和操作系统以及其他sybase软件,如Backup Server或SQL Server Monitor共享处理器、内存以及其他资源。
在大多数情况下面,我们是对应用层进行优化,,因为对应用性能的优化是大家最乐于接受的功能,其结果能被观测及检验,查询的性能是SQL应用的整个性能的一个关键。
应用层上的问题包括以下内容:
·决策支持VS.和在线事务处理(OLTP)需要不同的性能策略
·事务设计能够减少并发,因为长的事务保持占用锁,也就减少了其他用户对相关数据的存取
·关联一致性对数据修改需要join操作
·支持Select操作的索引增加了修改数据的时间
·为了安全而设立的审计限制了性能
在应用层优化的选项包括:
·远程处理或复制处理能够把决策支持从OLTP机器中分离出来
·利用存储过程来减少编译时间和网络的利用
·利用最少量的锁去满足你的应用需要
数据库层的问题包括:
·建立备份和恢复方案
·在设备上分布存储数据
·审计操作影响性能;仅审计你所需的
·日常的维护活动将导致性能的降低和导致用户不能操作数据库表
在数据库层上优化选择包括:
·利用事务日志的阀值来自动转储事务日志防止其超出使用空间
·在数据段中用阀值来监视空间的使用
·利用分区来加速数据的装入
·对象的定位以避免硬盘的竞争
·把重要表和索引放入cache中,保证随时取得
服务器层的问题有:
·应用的类型——服务器是支持OLTP还是DSS,或者两者都支持
·所支持的用户数影响优化决策——随着用户数的增加,对资源的竞争会发生改变
·网络负荷
·当用户数和事务数达到一定的数量时复制服务器或其他分布式处理是一个解决的方法
服务器层的优化的选项包括:
·优化内存——一个关键的配置参数和其他方面的参数
·决策是客户端处理还是服务器端处理——有些处理能在客户端进行吗
·配置cache的大小和I/O的大小
·增加多个CPU
·为空闲时间排定批处理任务和生成报表
·工作负荷发生改变,重新配置特定参数
·决定是否可能把DSS移到另一个SQL服务器中设备层
设备层的问题包括:
·主设备、包含用户数据库的设备,用户数据设备,或数据库日志是否要镜像
·怎样在设备之间分布系统数据库、用户数据库和数据库日志
·为获得对堆表插入操作的高性能,是否有必要进行分区
设备层上优化的选项包括:
·用多个中等大小的设备及多个控制器可能比用少量的大设备有更好的I/O性能
·分布数据库,表和索引以在不同的设备上进行I/O装载
网络层
实际上,SQL Server的所有用户都是通过网络存取他们的数据。网络层上的主要问题有:
·网络的流量
·网络的瓶颈
·网络的速度
网络层上优化的选项包括:
·配置包的大小,以使其与应用的需要相匹配
·配置子网
·分隔出繁忙的网络运用
·创建一个高容量的网络
·配置多个网络引擎
·更好地设计应用,限制所需的网络传输
硬件层
在硬件层上的问题包括
·CPU的效率
·磁盘的存取:控制器和磁盘
·磁盘备份
·内存的使用
在硬件层上优化的选项包括:
·增加CPU以适应工作负荷
·配置调度程序以提高CPU利用率
·遵循多处理器应用设计指导以减少竞争
·配置多个数据cache操作系统层
操作系统层的主要问题有:
·文件系统——是否被SQL Server独占使用
·内存管理——精确估算操作系统和其他程序的内存占用
·CPU的利用——整个系统共有多少处理器可用?有多少分配给SQL Server
在操作系统层优化的选项包括:
·网络接口
·在文件和原始分区之间选择
·增加内存
·把客户操作和批处理移到其他机器上
·SQL Server利用多个CPU
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(4889次) :: 评论 (4) =========================================================== Sybase存储过程的建立和使用 ===========================================================
Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。
存储过程的性能特点如下:
·存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同,当首次运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很快。
·存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。
·存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。
·存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。
所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。
存储过程的语法规则
建立存储过程的语法规则为:
CREATE PROCedure[owner.]procedurename[;number]
[[(]@parameter_name datatype[=default][OUTput]
[,@parameter_name datatype[=default][OUTput]]...[)]]
[WITH RECOMPILE]
AS SQL_statements
使用存储过程的语法规则为:
[EXECute][@return-status=]
[[[server.]database.]owner.]procedurename[;number]
[[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
[,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]
[WITH RECOMPILE]
下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点,关于选项的更为详细的说明请参考有关手册。
·[[[server.]database.]owner.]procedure_name:存储过程的名字。
·@parameter_name datatype[=default][OUTput]:形式参数(形参)的名称、类型。df ault是赋予的缺省值(可选),OUTput指定本参数为输出参数(可选)。形参是存储过程中的自变量,可以有多个,名字必须以@打头,最长30个字符。
·SQL_statements:定义存储过程功能的SQL语句。
·@return_status:接受存储过程返回状态值的变量。
·[@parameter_name=]value:实际参数(实参),@parameter_name为实参的名称(可选)。如果某个实参以@parameter_name=value提供,那么随后的实参也都要采用这一形式提供。
·[@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选),如果变量@varialbe是用来接受返回的参数值,则选项OUTput不可缺少。
存储过程的建立和使用,我们将通过几个例子进行介绍。
假设有一个用下述语句生成的技能工资表RS-LS-GZ-JiNeng:
create table RS_LS_GZ_JiNeng/*技能工资表*/(GeRen_id char(4),/*个人代码 */RiQi smalldatetime,/*执行日期 */YuanYin_id char(1) null,/*变动原因代码 */JinE smallmoney)/*技能工资金额 */
该表存储着某单位员工多年来技能工资的历史档案。
例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p-RsGz-JiNeg-All:
create procedure p_RsGz_JiNeng_All as select * from RS_LS_GZ_JiNeng order by GeRenid,RiQi
然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:
execute p_RsGz_JiNeng_All
本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。 [page]
例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:
create procedure p_RsGz_JiNeng @c_GeRenId char(4) as select *from RS_LS_GZ_JiNeng where GeRen_id=@c_GeRenId order by RiQi
之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:
declare @GeRenId char(4)select @GeRenId="0135"/*设要查询员工的个人代码为"0135" */ execute p_RsGz_JeNeng @c_GeRenId=@GeRenId
存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。
例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:
create procedure p_RsGz_JiNeng_Slt (@c_GeRenId char(4),@sm_JinE smallmoney output) as select @sm_JinE=JinE from RS_LS_GZ_JiNeng where RiQi=(select max(RiQi) from RS_LS_GZ_JiNengwhere GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/
调用存储过程p_RsGz_JiNeng_Slt进行查询:
declare @GeRenId char(4),@JinE smallmoneyselect @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/ select @JinE=0 execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId, @sm_JinE=@ JinE output
这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。 [page]
例4.查到了个人代码为"0135"员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。
create procedure p_RsGz_JiNeng_Rtn @c_GeRenId char(4) as declare @ErrCode smallint select @ErrCode=0 if exists(select* from RS-LS-GZ-JiNeng where GeRenid=@c-GeRenId) begin select * from RS_LS_GZ_JiNeng whrer GeRen_id=@c_GeRenId order by RiQi return @ErrCode end esle begin select @ErrCode=1 return @ErrCode end
调用存储过程p_RsGz_JiNeng_Rtn:
declare @GeRenId char(4),@RtnCode smallint select @GeRenId="0135" select @RtnCode=0 execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId if @RtnCode=1 print"No this one!"
存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为"查无此人",返回出错状态值1。否则,返回成功状态值0。
调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息"No this one!"。
小结
上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(2029次) :: 评论 (12) =========================================================== Sybase数据库备份方案 ===========================================================
Sybase数据库产品自从1987年问世以来,它的客户机/服务器(client/server)工作模式、分布处理的基础体系结构、完善的安全保密性能、高速快捷的运行方式、多平台跨操作系统的广泛应用等优点,迅速被IT界接受并推广应用。我们作为金融业的用户,也在1995年开始使用Sybase10版本。在具体的使用中,发现集中式的数据管理有其优点,就是数据风险范围大为缩小,但是作为Sybase的服务器一端,数据风险比较集中,如何做好数据库的数据备份,成为至关重要的问题。
在实际应用中,我们总结出了两种全量备份方案:
一、使用Sybase的Backup Server(备份服务器),做Dump备份
转储数据库(Dump database),就是为整个数据库(包括数据、表结构、触发器、游标、存储过程、事务日志等)做一次物理备份。转储数据库时,系统自动执行一次checkpoint,即将日志和数据从缓冲区拷贝到硬盘(只拷贝脏页),把已被分配的页(日志和数据)转储到设备。
命令格式为:
dump database 数据库名 to 设备文件名 with 参数
如果备份到硬盘的文件上,可以不预先估算备份文件的大小,只要硬盘有足够的存储空间就可以。如果是备份到dds磁带上,那么就要估算一下备份后的大小,90米的dds磁带压缩存储空间为4G,120米的磁带压缩存储空间为8G,如果数据库的备份文件超过了这个尺寸,就要考虑多文件转储,使用stripe参数。
命令格式为:
dump database 数据库名 to 设备文件名1
stripe on 设备文件名2
stripe on 设备文件名3……
with 参数
这种数据备份方式是将整个数据库的运行环境完整的复制一份,包括数据库的脏页和碎片,在使用load命令恢复时,只能恢复到同样大小的数据库中(数据和日志的大小都只能和原来完全一致),适用于在每天的日终营业网点下班后的日常备份。优点是数据库完整无误,缺点是不能直接查看备份内容。
二、分数据结构和数据记录做两次备份
在一般情况下,生产机的数据库都比较庞大,而实验机则相对较小,难以在实验环境中以load命令恢复工作机的内容。所以,在工作实践中,我们摸索出了第二种全量备份方案。
1、数据结构备份
在windows平台的Sybase SQL Server Manager(数据库管理)平台中选择ServeràGenerate ddl则产生整个数据库服务器的所有信息,如果选择databaseàgenerate ddl则产生所选定数据库的信息,以master库为例,产生的文件主要包括:config.ddl(配置)、devices.ddl(设备)、database.ddl(数据库)、logins.ddl(用户)、remote.ddl(远程)、cache.ddl(缓冲)、segment.ddl()、group.ddl(用户组)、user.ddl(用户)、default.ddl(确省)、rule.ddl(规则)、udt.ddl、table.ddl(表)、view.ddl(视图)、proc.ddl(存储过程)、triger.ddl(触发器)。
2、数据记录备份
将数据库各表以Sybase自代的bcp(bulk copy)工具的方式导成一定格式的文本文件,命令格式:
bcp 表名 out 路径名 文件名 -c -t 分隔符 -u (用户名)-p(密码)-S(服务器名)
如果将一个数据库中的所有表都做一个bcp备份,就需要针对每一个表都做一次bcp,在一般情况下,一个数据库有100多个表,工作量比较大。可以利用数据库中的系统表信息做一个bcp备份脚本。原理是每一个用户表在系统表中都有信息记载,可以通过isql语句查询得到。现举一例说明:
1)、先编辑一个名为mkbcpout.sql的文件,内容如下:
select "echo bcp "+name+" out …… "+"bcp "+name+" out ./+"name+".table -c -t| -Uuser -Ppassword -S SERVER" from sysobjects where type=U go
2)、执行isql命令,以此文件作为输入,执行结果输出到另外一个文件里:
isql -Uuser -Ppassword -S server -I mkbcpout.sql -O bcpout
3)、对bcppout文件稍微修改,增加可执行权限
chmod +x bcpout
4)、执行bcpout,导出数据文本:
./bcpout
3、数据库恢复
业务生产机可能为小型机,而实验开发环境的硬件环境为PC server,安装好win nt或SCO unix下的Sybase服务器后,根据需要创建空间足够大的数据库和tempdb(系统临时数据库),创建数据库用户,并将其更改为此数据库的所有者,要注意两点:1)此数据库允许bcp拷贝,2)此数据库自动清除log。命令格式为:
1> sp_dboption databasedbname ,"select into/bulkcopy",true 2> go 1> sp_dboption databasename,"trunc log on chkpt",true 2> go
上述两个配置可能与生产机的配置不同。
然后以新创建的数据库用户登录,导入数据结构,注意要首先导入表结构,然后才是存储过程、触发器等等。命令格式:
1、isql -Uusername -Ppassword -I table.ddl -o error.log.table
2、isql -Uusername -Ppassword -I proc.ddl -o error.log.proc
……
为了提高bcp导入数据的速度,需要将比较大的表的索引和主键删除,否则的话,每bcp进一条数据,数据库都自动写一条log日志,记载此数据的上一条和下一条记录,确定本记录在此表中的准确位置,一是影响bcp速度,二是数据库的log飞速膨胀。数据库的自动清除log功能只有在一个事务结束后才起作用。
准备工作做完后,开始倒入数据记录。使用类似做bcpout的方法做一个bcpin的脚本,然后执行:
./bcpin |tee error.bcpin
使用tee管道输出的目的是让计算机完整记录下倒入过程,自动存入error.bcpin文件中,待倒入结束后,我们只需要检查日志文件,不需要一直紧盯着计算机屏幕。
所有工作做完之后,不要忘记重新将删除的主键和索引建上。
如果有现成的数据库,只需要单纯地导入数据记录,则首先将数据库中所有用户表(也就是所有type="U"的表)清空,命令格式:
1> truncate table tablename 2> go
当然最好也是利用做bcpout脚本的做一个truncate脚本,通过执行此脚本将所有用户表清空。然后的数据导入、处理索引和主键的过程与上面类似。
三、利用做bcp备份脚本的方法做数据库碎片整理
Sybase数据库作为联机事务处理应用服务器,每天应用程序都对数据库做大量的插入、修改和删除等操作,不可避免的在数据库的物理存储介质上留下页碎片和扩展单元碎片,从而影响数据库的存储效率和运行速度。具体表现为:业务繁忙时出现死锁(dead lock),数据库的输入/输出资源被大量占用,业务处理速度慢。其解决办法是:
1、清空数据库中的所有表,命令格式:isql -Uusername -Ppassword -I truncate.sql -o error.truncate
2、删除所有表的索引和主键:isql -Uusername -Ppassword -I dropindex.sql -o error.dropindex
3、导入数据:./bcpin
4、添加索引和主键:isql -Uusername -Ppassword -I addindex.sql -o error.addindex
5、更新数据库状态
1> update statistics tablename 2> go
上述操作都是针对数据库中的所有用户表进行的,利用做bcp备份脚本的方法做出相应的脚本,使繁琐的数据库维护变得简便易行,还克服了直接使用isql语句操作风险大、没有操作日志的毛病。
笔者在实际工作中,使用第一种方法对生产机做日常全量备份,日终通过unix的crontab定时批量作业(具体做法请参考《中国金融电脑》2001年第10期有关crontab的文章)bcp出全部数据。使用高档PC server 搭建模拟运行环境,在需要的情况下导入生产机数据,处理运行中后台server的各种问题,待研究出解决办法后再在生产机上做相应调整,这样做风险小,效果好。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(1855次) :: 评论 (4) =========================================================== Sybase临时数据库tempdb ===========================================================
本文中,你将以调整临时库的位置开始,有步骤的完成临时数据库的优化,并在此过程中了解到优化临时数据库和临时表的一些方法和规则。
实验环境的要求:你应具有系统管理员的权限,系统中有auths和article表。
步骤:
第一步:调整临时库的位置
tempdb数据库缺省放在master设备上,将临时数据库发在分离的设备上是更可取的。
1)初始化一个用来存放临时数据库的设备
diskinit name="tempdb_dev", physname= "d:sybaseexampletempdb.dat", vdevno=13, size=15360
(注意:如果将tempdb数据库放在多个设备上,需初始化多个数据库设备)
2)将临时数据库扩展到该一个设备上
alterdatabasetempdbontempdb_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)
说明:若将临时数据库放在多个磁盘设备上,可以更好的利用并行查询特性来提高查询性能。
第二步:将临时数据库与高速缓冲进行绑定
由于临时表的创建、使用,临时数据库会频繁地使用数据缓存,所以应为临时数据库创建高速缓存,从而可以使其常驻内存并有助于分散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;把对临时表的复杂的使用分散到多个批处理或过程中,以便为优化器提供信息。
下面的这个过程需要进行优化:
createprocbase_proc as select*into#huge_resultfromauths select*fromarticle,#huge_resultwherearticle.author_code=#huge_result.author_codeandsex=”0”
使用两个过程可以得到更好的性能
1) createprocbase_proc as select* into#huge_result from auths execselect_proc 2) createprocselect_proc as select*fromarticle, #huge_result wherearticle.author_code= #huge_result.author_codeandsex=”0”
说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。
结论:通过本实验我们知道,临时数据库经过优化可以极大的提高系统性能。实际工作中,必须考虑具体应用的情况,需长时间经验的积累。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(2336次) :: 评论 (5) =========================================================== Sybase的网络层安全 ===========================================================
检查远程服务器信息:
1.检查远程服务器是否允许访问
use master exec sp_configure "allow remote access"
返回‘1’表示允许远程访问,返回‘0’表示不允许远程访问,如果允许远程访问就需要检查远程用户的可信性,这将允许本地服务器的存储过程在远程服务器通过RPC执行。
2.检查信任用户的存在情况
exec sp_helpremoteserver
Sybase允许建立不需要密码即可连接到服务器的信任连接,若存在这样的连接就需要检查那些用户的信任关系
远程连接机制:
1. 检查安全机制和其提供的安全服务
select * from syssecmechs
syssecmechs表默认并不存在,仅在查询时才创建,它由以下的列组成:
sec_mech_name 提供的安全机制名、available_service 机制提供的可用安全服务,举个例子,如果用户是Windows管理员,那么这些内容将为:sec_mech_name= NT LAN MANAGER available_service=unified login
2. 检查libctl.cfg文件
文件内部包含了网络驱动的信息,安全,目录磁盘和其他初始化信息,比如LDAP、密码加密信息、dce表示DCE安全机制、csfkrb5表示cyber safe kerberos 5安全机制、libsmssp表示NT或95客户端上的windows网络管理员。
注意libctl.cfg文件的位置:
UNIX下的位置:$SYBASE/config/
桌面模式下的位置:SYBASE_homeini
3. 检查统一登录需要的参数
exec sp_configure "unified login required"
若启用网络安全,则将该参数设置为‘1’,若设置为‘0’将会允许传统的用户密码方式登录到ASE,这样也会对网络的安全性造成影响。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(17897次) :: 评论 (3) =========================================================== Sybase系统维护经验谈 ===========================================================
Sybase数据库系统作为C/S构架的主流产品在我国有着广泛的应用,因此,对Sybase系统的维护也显得至关重要。笔者在对Sybase系统维护工作中,总结了一些技巧和经验,现介绍给大家。
1.实现开机时自动装载Sybase数据库
原先要使Sybase SQL Server启动,一般需要先以sybase用户登录,然后运行$SYBASE/install目录下的startserver命令启动SYBASE_XXXX服务进程和SYB_BACKUP_XXXX备份服务进程。要实现Unix系统启动时就能在后台装载Sybase的功能,我们可在/etc/rc2.d/目录下新建一文件S99sybase,内容如下:
SYBASE=/usr/sybase PATH=$PATH:$SYBASE/bin export $SYBASE $PATH $SYBASE/install/startserver -f $SYBASE/install/RUN_SYBASE_XXXX > /dev/null $SYBASE/install/startserver -f $SYBASE/install/RUN_SYB_BACKUP_XXX >/dev/null
然后修改Sybase的权限,重启系统即可。
2.实现关机时自动卸载Sybase数据库
为保证Sybase系统的正常运行,每次在关闭Unix系统时要先结束Sybase SQL Server 的服务进程,从减轻系统管理人员操作的角度出发建立一用户halt,修改/etc/passwd文件,将halt用户的uid改为0(或其他可运行shutdown的用户id),/usr/halt/.profile中添加以下语句:
SYBASE=/usr/sybase DSQUERY=SYBASE_XXXX PATH=$PATH:$SYBASE/bin export SYBASE DSQUERY PATH isql -Usa -Pabcabc -ihalt.sql > /dev/null shutdown -y -g0
其中“abcabc”为sa用户的口令,halt.sql是一简单的文本文件,内容如下:
shutdown go
这样每次只要以halt用户登录,就实现了自动卸下Sybase数据库,然后关闭Unix系统。
3.Sybase库备份技巧
一般对Sybase库进行备份都用磁带作介质进行,但还有一更好的方法,即先备份到硬盘上然后经压缩,
拷贝到磁带上,这样便于恢复,多了一个备份拷贝,同时也节省了备份时间。具体实现步骤如下:
(1)建立磁盘备份设备
运行isql,以sa进入Sybase系统,运行如下内容:
sp_addumpdevice "disk",disk_bkupdevice ,/tmp/dumpdb ,2 go
这样就在Sybase中建立了一个名为“disk_bkupdevice”的备份设备,它对应Unix系统下的/tmp/dumpdb文件。
(2)创建备份用户
以root身份进入Unix系统,新建用户backupdb,并归属于sybase组。
(3)修改相关文件
在/usr/backupdb/.profile中添加以下语句:
SYBASE=/usr/sybase DSQUERY=SYBASE_XXXX PATH=$PATH:$SYBASE/bin export SYBASE DSQUERY PATH rm /tmp/backupdb.Z echo"开始备份SYBASE数据库…" isql -Usa -Pabcabc -ibackup.sql > /tmp/dbbackup.log echo"硬盘备份完成,正在压缩备份的数据文件…" compress /tmp/backupdb echo "正在将备份的压缩数据拷入磁带…" tar c8v /tmp/backupdb.Z echo "备份完成!"
其中"abcabc"为sa用户的口令,backup.sql是一简单的文本文件,内容如下:
dump database db_main to disk_bkupdevice go
备份的执行日志被记录在/tmp/dbbackup.log中,当然系统管理员也可通过查看$SYBASE/install/backup.log 获知备份日志。
这种备份方法要求硬盘空间足够大,这点请系统管理员在为Unix建分区时特别注意。在SCO Open Server 5.0.4、Sybase 11.0.3平台上,以上几个小技巧已应用成功,为笔者的日常维护节省了许多时间,取得了非常好的效果。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(1525次) :: 评论 (4) =========================================================== sybase双机热备份实现 ===========================================================
在当今的商业活动中,sybase已是主流的承载数据的服务器平台,基于该数据库系统的信息系统的可用性已成为衡量其资源利用率的最重要的尺度之一:
性能强劲:作业可以运行在不同的服务器上,整个系统的性能会大大提高;
高可用性:在群集系统中的某个主机宕机不对用户构成影响;
节省投资:高的系统稳定性带来对系统崩溃带来的业务损失的避免,尤其对于数据的损失。
同时,计算机技术的发展, pc服务器的处理能力更加强大,同时其性能/价格也越来越高,加上传统的小型机由于维护和升级困难,费用高,正受到pc服务器的挑战。因此,居于pc服务器的高性价比系统日益受到用户的喜爱。由于pc服务器的安全性因素,稳定可靠和系统的持续运行成为系统的关键,因此,sybase双机热备系统设置受到越来越多的欢迎。
在一般情况下,当系统不能正常运行时,我们需要用人工的方法进行故障的认定、分析、恢复及测试。这些都需要花费很长的时间。在这段时间内,系统必须停顿下来以等待恢复,从而给企业带来难以估计的经济损失。
双机容错是计算机应用系统稳定、可靠、有效、持续运行的重要保证,它通过系统冗余的方法解决计算机应用系统的可靠性问题,并具有安装维护简单、稳定可靠、监测直观等优点。当一台主机出现故障,该软件可及时启动另一台主机接替原主机任务,保证了用户数据的可靠性和系统的持续运行。
双机容错基本架构
双机容错的目的在于保证数据永不丢失和系统永不停机,一般采用智能型磁盘阵列柜可保证数据永不丢失,采用双机容错软件可保证系统永不停机。它的基本架构可分为两种模式:
双机互备援(dual active)模式
双机热备份(hot standby)模式。
双机互备援(dual active)模式
所谓双机热备援就是两台sybase主机均为工作机,在正常情况下,两台工作机均为信息系统提供支持,并互相监视对方的运行情况。当一台主机出现异常时,不能支持信息系统正常运营,另一主机则主动接管(take over)异常机的工作,继续主持信息的运营,从而保证信息系统能够不间断的运行,而达到不停机的功能(non-stop),但正常运行主机的负载(loading)会有所增加。此时必须尽快将异常机修复以缩短正常机所接管的工作切换回忆备修复的异常机。
切换时机(take over)
——系统软件或应用软件造成服务器宕机
——服务器没有宕机,但系统软件或应用软件工作不正常
——scsi卡损坏,造成服务器与磁盘阵列无法存取数据
——服务器内硬件损坏,造成服务器宕机
——服务器不正常关机
双机热备份(hot standby)模式
所谓双机热备份就是一台主机为工作机(primary server),sybase正常运行,另一台主机为备份机(standy server)。在系统正常情况下,工作机为信息系统提供支持,备份机监视工作机的运行情况。同时,工作机也同时监视备份机是否正常,有时备份机因某种原因出现异常,工作机可尽早通知系统管理员解决,确保下一次切换的可靠性。当工作机出现异常,不能支持信息系统运营时,备份机主动接管(take over)工作机的工作,继续支持信息的运营,从而保证信息系统能够不间断的运行(non-stop)。当工作机经过修复正常后,系统管理员通过管理命令或经由以人工或自动的方式将备份机的工作切换回工作机;也可以激活监视程序,监视备份机的运行情况,此时,原来的备份机就成了工作机,而原来的工作机就成了备份机。
sybase完全支持上述二种功能模式,对应地,sybase提供了 sybase ha系统软件,其支持平台为所有主要unix平台和nt系统。结合目前推出的powerbuilder8版本,我们甚至可以实现应用级的无缝切换。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(101458次) :: 评论 (23) =========================================================== sybase事务隔离级 ===========================================================
本篇文章描述了数据库事务隔离级对锁的影响,通过对比事务隔离级0和1,理解锁与脏读的关系。
实验内容:分别设置0和1级隔离级,执行两个不同但又有相关的事务。本实验环境如下:
1、有权访问用户数据库(在此是aca_database)和对数据库表有修改和查询权限。
2、数据库中有表auths,包含salary列(数据类型是money),有一定数据量(在此有1万行)。
步骤:
1、如在同一台机器,可分别执行两次“SQL Advantage”,分别用合法帐号登录,准备各自执行一个事务。
2、在各自界面打开用户数据库aca_database,设置隔离级为1(此亦为缺省值):
set transaction isolation level 1,查看当前隔离级别用select @@isolation
3、执行第一个事务的前两句,暂不执行后面的提交或回滚。
begin transaction update auths set salary=salary+100 commit transaction (rollback transaction)
4、执行第二个事务 select sum(salary) from auths
5、第一个事务正常执行结束,但只在内存缓冲区完成修改,事务并没有真正结束,相应也不释放锁,第二个事务处于等待状态。可执行sp_lock和sp_who命令查看。
6、执行第3步中的提交或回滚命令,第二个事务得到执行。
7、改变事务隔离级为0,重复执行3-4步。第一个事务没有任何变化,第二个事务很快出来根据第一个事务修改数据而成的结果,似乎在执行响应上并不受第一个事务的影响。
8、重复第6步结束。
通过上面的实验我们知道:
1、隔离级0时事务允许脏读,隔离级1时事务不允许脏读,而只是等待前一个修改事务真正结束并释放锁。
2、隔离级为0时,如果在修改事务的最后是回滚操作,则查询读事务将不能读到正确的数据。
3、在确信事务中没有回滚操作的可能,并要求更高的执行效率和并行性,只有这时可考虑设置隔离级为0。
Sybase 发表于:2006.07.18 10:22 ::分类: ( Sybase数据库管理技术 ) ::阅读:(134452次) :: 评论 (728) =========================================================== 细说SYBASE数据库日志 ===========================================================
SYBASE公司是世界著名的数据库厂家,其关系数据库产品SYBASE SQL Server在中国大中型企事业单位中拥有大量的用户。笔者在多年的使用过程中,总结出SYBASE数据库管理和维护的一些经验,现拿出来与大家分享。
我们知道,SYBASE SQL Server用事务(Transaction)来跟踪所有数据库的变化。事务是SQL Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志(Transaction Log),即系统表(Syslogs)。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要,我们进行数据库开发和维护必须熟知日志的相关知识。
一、SYBASE SQL Server 如何记录和读取日志信息
SYBASE SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时,SQL Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后,它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中,直到别的数据页需要该内存时,该数据页才被写到磁盘上。若事务中的某条语句没能完成,SQL Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。
二、日志设备
Log和数据库的Data一样,需要存放在数据库设备上,可以将Log和Data存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份Backup事务日志;二是防止数据库溢满;三是可以看到Log的空间使用情况。
所建Log设备的大小,没有十分精确的方法来确定。一般来说,对于新建的数据库,Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁,则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外,还有其它因素影响Log大小,我们应该根据实际操作情况估计Log大小,并间隔一段时间就对Log进行备份和清除。
三、日志的清除
随着数据库的使用,数据库的Log是不断增长的,必须在它占满空间之前将它们清除掉。清除Log有两种方法:
1.自动清除法
开放数据库选项 Trunc Log on Chkpt,使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预,由SQL Server自动执行,并且一般不会出现Log溢满的情况;缺点是只清除Log而不做备份。
2.手动清除法
执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志:
dump transaction with truncate_only
dump transaction with no_log
通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。为了尽量确保数据库的一致性,你应将它作为“最后一招”。
以上两种方法只是清除日志,而不做日志备份,若想备份日志,应执行“dump transaction database_name to dumpdevice”命令。
四、管理庞大的事务
有些操作会大批量地修改数据,如大量数据的修改(Update)、删除一个表的所有数据(Delete)、大量数据的插入(Insert),这样会使Log增长速度很快,有溢满的危险。下面笔者给大家介绍一下如何拆分大事务,以避免日志的溢满。
例如执行“update tab_a set col_a=0”命令时,若表tab_a很大,则此Update动作在未完成之前就可能使Log溢满,引起1105错误(Log Full),而且执行这种大的事务所产生的独占锁(Exclusive Table Lock),会阻止其他用户在执行Update操作期间修改这个表,这就有可能引起死锁。为避免这些情况发生,我们可以把这个大的事务分成几个小的事务,并执行“dump transaction”动作。
上例中的情况就可以分成两个或多个小的事务:
update tab_a set col_a=0 where col_b>x go dump transaction database_name with truncate_only go update tab_a set col_a=0 where col_b <=x go dump transaction database_name with truncate_only go
这样,一个大的事务就被分成两个较小的事务。
按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上,则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令,应该先执行“dump database”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。