Sybase ASE学习笔记

我的未来我决定 提交于 2019-12-02 15:58:53

      通过这两天的学习,由于之前完全没有接触过sybase,发现sybase跟oracle或者SQL server都有比较大的差别,一是需要配置运行sybase的环境,二是sybase采用的是Transaction-SQL。三是,其数据库管理开始时让我很不习惯。 

      在接触别人安装了的sybase(linux 64bit-ase15.7)时,我发现sybase老是连不上,通过showserver命令来查看,shell却说没此命令,接着进入其安装 SYBASE_HOME/ASE-15_0/install/检查了,showserver没有问题,但启动./startServer.sh时,发现错误 了,出现了can execute file RUN_SYBASE。此刻我发现了我与本目录的RUN_*****不同,虽然意识到不同,但我只是mark下它而没有进行进一步思考。通过上网搜索资 料,如果sybase是安装成功,那么应该就是环境问题了。所以我调用./SYBASE.sh(我以为起码当前的环境就配好了),于是我就调用isql -Usa -S服务名、isql -Usa -S192.168.*.*和isql -Usa -S192.168.*.*:5000 以及它们各种变形,其间还需用注意得在SYBASE_HOME/OCS-15_0/bin目录下(即存在isql.sh脚本文件的目录下),这里花了我不 少时间来弄明白,最后通过同事的协调,请到了高人给我展示了一下其登陆过程,我才弄明白。 

小结:1.出现can execute file RUN_SYBASE的错误可能是安装者修改了默认服务名而引起的。 

       2.调用./SYBASE.sh是不可以把环境信息导入当前的shell中的,要使用source ./SYBASE.sh才行。另外可以使用export -p来看当前shell的环境情况。 

       3.连接时出现了LANG的错误,可能就是sybase不识别系统使用的语言,我遇到的是由于多语言引起的。export应该可以了 。 

       4.另外还有一个方法可以快速查sybase有没启动服务。lsof -i:端口号。端口号可以在SYBASE_HOME/interfaces可以查看端口号。


       5.关闭服务可以通过Kill进程,或者通过isql以SA用户登录使用shutdown go来关闭数据库


       6.开启数据库,./startserver.sh -f RUN_服务名 -f RUN_备份服务名


some points in sybase:

sybsystemprocs 系统过程数据库

sybsystemdb 两阶段提交事务数据库

tempdb 临时数据库

master数据库存储有关用户数据库和设备的信息,但不要放置用户对象,这会导致master的事务日志很快就满。如果事务日志的空间已用完,则无法使用dump transaction命令来释放master数据库中的空间。

注意:不要将用户数据库存储在主设备上。在更改配置参数时要谨慎。


用于磁盘资源的命令:


命令 

任务 

disk init 

name="dev_name" 

physname="phys_name" ... 

使某个物理设备可供特定的Adaptive Server使用。 

指派数据库设备名称(dev_name),用于在其它 

Adaptive Server命令中表示该设备 

sp_deviceattr logicalname、 

optname、optvalue 

更改现有数据库设备文件的dsync设置 

sp_diskdefault "dev_name" 

向缺省数据库空间的常规缓冲池添加dev_name. 

disk resize 

name ="dev_name" 

size =addtional_space 

动态增加数据库设备的大少 

disk mirror 

name="dev_name" 

mirror ="phys_name" 

在特定物理设备上镜像数据库设备 


在创建登录用户时,最好指定好数据库,尽量不用master数据库,以免master有包含用户创建的数据库对象 


使用配置文件可有以下几方面的好处: 

1.可以使用同一个配置文件,在多台服务器上复制某一特定配置文件。 

2.能够以某个配置文件为基准测试服务器的配置值。 

3.可以在实际设置参数值之前,先使用配置文件对参数值进行检查。 

4.可以创建多个配置文件,以便需要更改资源时在它们之间转换。 


把日志放到独立的数据库设备上,可以: 

1,允许使用dump transaction 命令而不是dump database命令,从而节省时间和磁带 

2,允许建立固定长度的日志,防止它与其他数据库活动争用空间 

3,在日志段上创建缺省的可用空间或值监控,并允许在数据库的日志和数据部分创建额外的可用空间监控。 

4,提高性能 

5,确保硬盘崩溃后的完全恢复。 


事务日志的大小由下列因素决定: 

1.相关数据库中更新活动的数量 

2.事务日志转储的频率程度 


查看报告日志使用情况:dbcc checktable(syslogs) 

查看数据库使用情况: sp_spaceused 先通过 use 数据库名 go 去到想查看的数据库里先。 

sp_spaceused输出结果列解析: 

database_name 正在检查数据库的数据库名称 

database_size 数据库中的大小 

reserved 分配给所有在数据库中创建的表和索引的空间量。 

data,index 数据和索引所用的空间。 

unused 已保留但尚未被已存在的表和索引所用的空间量。 

如果想删除设备,先得删除使用该设备的数据库。 

将日志和数据在同一设备上的数据库的事务日志移到单独的数据库设备上:sp_logdevice dbname,devname 

1,只有在单用户模式下才能执行。2,只将sp_logdevice    用于日志和数据都在同一设备上的数据库,不要将它使用在具有单独的日志设备的数据库上。 

查看数据库大小和设备信息:sp_helpdb [dbname]。 


在sybase的数据类型中,只有可变长的数据类型才能置NULL值,如varchar(n)和varbinary(n).另外输入的带有E符号的文字货币都会被看成float。 


datetime 8个字节,date time smallldatetime 4个字节 

sybase不能进行一下转换: 

1.将smallint数据转换为datetime 

2.datetime数据转换成smallint 

3.将binary或varbinary数据转换为smalldatetime或datetime数据 


@@boottime 返回Adaptive Server 上次启动的日期和时间 

@@errorlog 返回指向Adaptive Server错误日志所在目录的完整路径。 

@@maxpagesize 返回服务器的逻辑页大小。 

@@servername  返回Adaptive Server的名称


@@version   返回sybase的版本

临时表名以#开头,变量名以@开头


my experiences:

在使用sybase的这几天内,遇到比较多问题:

一.如何设置linux用户登录时自动执行source SYBASE.sh?(~/.bash_profile中添加source SYBASE.sh)

二.sybase的数据库使用经验:

1.增加登录用户 以sa登录寻使用sp_addlogin loginname,password,defaultdb 增加用户。


                       sp_adduser loginname把用户添加到当前数据库中。


                      要注意的点是:sp_addlogin中虽然加入默认登录的db,但只执行该语句并不能使用户有登录默认数据库的权限,一定得使用sp_adduser加入数据库后才能访问该DB。

2.权限管理跟oracle语法差不多,只是有个别权限名字不同而已。create default、create procedure、create rule、create table、create view、create function。免得麻烦,我通常grant all。all就等于前面6个权限。如有怀疑,可通过以下方式验证: 


                用dbo登录数据库, 使用该语句可以查询用户具有的权限:select a.uid,a.name,b.action from sysusers a,sysprotects where a.uid=b.uid  


                关于sysusers和sysproctects的详情可下载官方的tables文档来看。     


3.设备的新建:

disk init

name="server中唯一识别符",   --不要漏了逗号

physname="物理路径",

size="1g"  --不加单位为多少页,页的大小在创建服务器时已制定,可以通过select @@maxpagesize来查询,大小写均可。

改变设备的大小(只能增大):在某些版本中没有disk resize

disk resize

name="dev_name",

size="addtional_space" -- 增加的大小

sybase ase默认的设备个数为10。

4. 新建数据库.

create database dbname

on dev_name=size

log on dev_name=size

在此过程,服务器将执行以下动作:

①.检查数据库名是否唯一

②.检查数据库所依赖的设备是否可用,即检查该设备是否存在,和它满不满足数据库要求的空间大小。

③.服务器将自动为该数据库寻找唯一的dbid.

④.在master的sysusages记录数据库占用设备的信息。

⑤.在sysdatabases中新增一行。

⑥.根据model数据库生成该数据库的系统表

⑦.因为上述语句没有for load,所以服务器会清除该数据库设备的剩余页。

5.数据库与设备的关系

设备根据其用途大概为分为3种:

①数据设备 ②日志设备 ③混合设备

但强烈不建议使用混合设备。原因:降低数据查询速度(具体看上面)。

虽然设备与数据库是多对多的关系(即一个设备可以对应多个数据库),但个人不建议这样做,建议一个数据库对应一个数据设备和一个日志设备。想要删除设备,就先得删除依赖它的数据库,使用sp_dropdevice删除设备。

三、遇到连接错误的问题:当使用isql登录服务器时,出现这样的错误:ct_connect(): network packet layer: internal net library error: Net-Lib protocol driver call to connect two endpoints failed。

一看到这个错误,应该是网络出现了问题,但使用lsof -i:5000 和RUN_servername来查看sybase服务器的状态,都没有问题,使用命令hostname -i也没有发现问题。因此具体造成此错误的原因我尚未弄明白,但通过重启服务就把它就解决了。这个错误让我想起之前我在oracle中遇到的一个问题:我 把原来关闭了orcle的console服务打开(其他相关的服务原来就开启了),打开后,我用cmd以sysdba的分配登录sqlplus时,报一个 监听错误,我用NET MANAGER查看监听信息,与ora的配置文件中信息对比,都没有发现错误,最后重启一个listener服务就可以了。我想可能console的服务 与listener的服务存在前后顺序的关联。


sybase的字符集问题:

1.安装字符集:到sybase安装目录下的charsets的目录,选择要安装的字符集,使用charset -Usa -Ppassword -Sserver_name binary.srt charset_name

2.查看默认字符集:sp_helpsort

3.设置默认字符集:sp_configure "default character set id",id 在master数据库下运行,id可以通过select * from syscharsets查询。


日志满了的问题:

两种解决方法:1.手动清除 truncate transaction dbname with truancate_only 当然如有需要,你可以先备份数据。

                      2.自动清除 sp_dboption dbname,"trunc log on ckpt",true (在master下运行,且需要在dbname下运行checkpoint才能生效,有提示信息的)


修改设备数量:sp_configure "number of devices",30 默认为10个

查看当前用户信息:sp_displaylogin

查看最大连接数:select @@max_connections

查看当前连接数: select @@connections

查看最大用户连接数:sp_configure "number of user connections"


查看sybase锁的个数(个人认为挺重要的参数):sp_configure “number of locks”


创建登录用户: sp_addlogin username,userpassword

把某个数据库的登录权限授予用户:use dbname。sp_adduser name

改变某个数据库的拥有者给某个用户: use dbname。sp_changedbowner username(这个用户不能是该数据库的用户)

修改用户参数:sp_modifylogin username,option,option_value


option有:authenticate with-登录鉴别

defdb-默认登录数据库

deflanguage-用户缺省语言的正式名称

fullname-用户的全名

"add default role"-增加用户角色

"drop default role"-删除用户角色

"passwd expiration"-口令有效日期(天数:0-32767)

"min passwd length"-密码最小长度

"max failed_logins"-允许登录失败次数

log script-登录时运行的脚本


 使用sp_who可以查看那当前所以用户和进程信息


dbcc traceon(3604)打开跟踪,使得dbcc的运行结果打印在控制台上。


dbcc sqltext(pid)就可以打印出进程号为pid正在运行的SQL语句。

sybase远程备份: 

环境描述:1.机器A是windows机器,sybase的备份服务器名为:A_BS 版本ase 15.7 页大小:8K 

                  2.机器B是linux机器,sybase的备份服务器名为:B_BS 版本ase 15.7 页大小:8K 

                  3.A,B联网 

注意点:如果A,B的备份服务名重复,需要更改或新建(未尝试过)。另外,sybase备份服务必须处于开启状态. 

问题:把B机器上名为XXX的数据库远程备份到A机器上? 

思路:sybase备份数据库要备份,必须使用到备份服务器,为了让B识别到A的备份服务器,因此在B中需要添加A的sybase备份服务器,再使用备份命令备份相应的数据库到远程服务器的路径就可以了。 

步骤: 

1.在linux下,修改${SYBASE_HOME}/interfaces,添加A_BS服务器(模仿已存在的服务,主要是变更服务名,远程机器名或IP,端口)(windows平台下该文件为sql.ini) (也可以使用dscp(linux平台)或dsedit(windows平台)) 

2.用sa登录系统,通过sp_addserver A_BS,ASEnterprise,A_BS.接着设置A_BS的serveroption 

sp_serveroption A_BS,"timeouts",true  --不保持常连接,如果机器B在一点时间段内没有对A_BS操作的话,链接会自动断开 

sp_serveroption A_BS,"net password encryption",false --密码在网络传输中不加密 

sp_serverooption A_BS,"readonly",false


(设置后要重启本地的ASE服务)


3.使用命令备份


dump database XXX to "F:\XXX_backup.dmp" at A_BS 

4.恢复数据库 

load database XXX from "F:\XXX_backup.dmp" at A_BS 

另外一种备份方法。 
PS:这里指的数据库迁移仅限于sybase到sybase(版本,页大小一致的)。 
环境描述、问题都同学习笔记2一样,即把linux上的数据库远程备份到windows下。 
先把要使用的工具介绍一下:1.ddlgen 2.bcp 
1.ddlgen在sybase ase 12.5以后才出现的工具,ddlgen参数说明可参考 http://infocenter.sybase.com/help/index.jsp(

Adaptive Server Enterprise 15.7 >  Utility Guide >  Utility Commands Reference

)

2.bcp这个工具可在cmd下bcp -help来查看用法,另外还可以参考 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc30191.1570100/doc/html/san1367605030412.html 
问题:如何把linux下的数据库备份到windows下呢? 
步骤: 

1.为了让在windows下能识别远程linux下的sybase服务,因此必须在sql.ini(路径:${SYBASE_HOME}\ini\)中添加该服务。

另外sybase也提供了修改接口文件的工具,在windows下是dsedit.exe,在linux下是dscp

2.使用ddlgen工具导出数据库结构。

ddlgen -U用户名 -Ppassword -Ssybase -Ddb_name -OC:\script.txt(注:可以根据需要添加-E错误日志、-L过程日志和-J指定字符)

这里的用户名最好是DBO或者是SA,理由:经比较普通用户导出的文件和DBO或者SA导出的文件,我发现普通用户导出的文件在文件的开头会少了DBOPTION的设置(最后会use 目标db 运行checkpoint,从而使下方的增加用户脚本运行正确),导致脚本会出错。

3.使用bcp工具导出数据库的数据。

首先通过db连接工具链接要导出数据的数据库。 
运行以下sql: select 'bcp db_name..' + name + ' out C:\data\data_' + name + '.txt' + '  -U用户名 -Ppassword -Ssybase -c -t"|"' from sysobjects where type='U' 

其中红色部分是为了隔离\和',免得系统识别为转义,蓝色部分可选,可不填写格式或根据需要更改格式都行。(bcp中有t这个参数,它的作用是列与列之间的数据用什么分割,由于本人的经历,建议选择分隔符时一定要选择比较特殊的符合,这样可以避免在bcp in的时候出错)

打开notepad,把sql的结果复制到notepad中并保存,修改文件后缀,改为bat。(linux下改为shell脚本)

最后双击运行就可以了。 

恢复数据库 
1.用isql工具,isql -Usa -Ppassword -Ssybase -iC:\script.txt  
2.把上面的bat文件中out改为in,双击运行就可以了。 

个人比较推荐使用这种方法,一是所需要的物理空间较小,二是应该可以根据实际需要来修改ddl脚本。 在实际时候过程中,还会遇到字符集的问题,这个问题实践较少,内容有待补充,但值得一提是的bcp的-Y参数:specifies that character-set conversion is disabled in the server, and is instead performed by bcp on the client side when using bcp out 。NOTE:During bcp out, all character-set conversion is done in the server. 


最后跟大家分享一下:在导入的时候遇到报错,可以使用bcp -e保存错误日志,因为console台上打印的信息有时候是不完整。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!