Sybase常见问题

在Sybase 应用过程中,碰到不少问题,网上很少查到完整答案,现整理如下(几年前整理,一直没时间放上来)

基于SYBASE 版本12.0
SYBASE CLIENT版本12.5

关于SYBASE的一些配置和MSSQLSERVER是一样的,因为MSSQLSERVER继承了SYBASE一些特性,现在SYBASE也加入了MSSQLSERVER独自发展的一些特性.

常见问题

1.在运行安装程序时提示碰到找不到JAVA 虚拟机,在安装客户端时我碰到过
   解决方法:由于SETUP.EXE 可以带参数,所以可以在当前目录建一个Setup.bat 批处理文件,内容如下:setup -is:javahome C:"javasoft"Sun"j2eesdk1.4_beta2"jdk"jre
或者直接在命令行运行

2。如果需要以ADO 方式连接数据库
   SYABSE CLIENT 12.5 包含一个比较新的ADO OLE 驱动,选择自定义安装,选中即可

3. SYABSE SERVER端安装,如果安装时不想立即配置数据库,从菜单里选择【开始】-【程序】-【SYBASE】-【服务器配置】 报错 Invalid Command line argument ‘and ‘.
 这是SYBASE SERVER安装时的一的BUG,如果出现了报错,一般配置SERVER不会成功,可以从安装目录进去,缺省目录 C:"SYBASE"ASE-12_5"BIN"SYCONFIG.EXE

4. 默认错误日志路径,C:"SYBASE"ASE-12_5"INSTALL

5. 如果服务启动报错,或提示服务已经启动,其实你的服务没有启动
a. 这时可能由于你启动过配置工具,当服务没有启动时,启动配置工具连接服务器,配置工具好像会尝试以单用户方式启动,你可以通过命令行检测一下,ISQL –Usa –Psa_password –Syourserver 登录,如果能登录,说明是的,这时你输入SHUTDOWN可以结束服务,然后再重启服务
b. 还有可能服务正在关闭中,你性子比较急,那么请你稍候,没事干的话,你可以在那儿点击鼠标按钮刷新WINDOWS服务列表,稍候一会再重启服务
c. 如果以上情况都不是,请删除C:"SYBASE"ASE-12_5" 的一个.KRG文件,文件名一般是你的数据库服务名, 只有服务启动,就会产山这样一个文件,如果服务终止就会自动删除这个文件,如果非正常终止,这个文件可能就会得不到正常处理,手动删掉之候,再启动服务

6. 字符集设置,排序规则设置
为了支持多语言,请把服务器设置为UTF8,如果不希望大小些敏感,可以设为不区分大小写,一旦数据有了数据,是不允许修改排序规则的,字符集的修改也会导致数据库中的数据变成乱码, 请在数据库安装的时候就设置好
a.默认UTF8是没有安装的,具体安装方法如下:

c:">cd "sybase"charsets"UTF8

c:"sybase"charsets"UTF8> charset -Usa -Psa_pass -Sserver_name nocase.srt Utf8
b.安装成功后.SQL环境中

>select name,id from syscharsets

>go

找到nameutf8对应的id(假设为190 utf8_nocase 101

设置缺省字符集
>sp_configure "default character set id",190

>go
设置缺省排序规则
>sp_configure “default sortorder id “,101
>go
重启服务器
a.UTF8安装好之后也可以直接通过服务器配置工具配置语言,注意,先选择语言UTF8保存,然后再选择排序规则,这时候排序规则可选的只有两项与UTF8相关的了,选择NO CASE 的那一个, 如果不先保存语言设置,排序规则好像没有立即刷新
 
注意:如果你需要安装不区分大小写的UTF8直接参照如上步骤,如果你开始希望选择UTF8二进制的,那么c:"sybase"charsets"UTF8> charset -Usa -Psa_pass -Sserver_name binary.srt Utf8
这时你设置排序为101就不会起作用,如果你覆盖安装charset -Usa -Psa_pass -Sserver_name nocase.srt Utf8 也不行,我昨天就是碰到这个情况,后来重装的

7. 为数据库分配最大内存
   默认是动态内存,为你的数据库分配最大内存后,数据库启动后优先申请固定内存,从而保证数据库性能。 不要超过物理内存的3/4 (估计值) 这个可以根据实际情况估计一下,如果你只作SYBASE SERVER可以大一点,如果有多个应用,就少一点,更重要的是,WINDOWS系统启动之后的剩余内存小于如果你分配的内存,那么系统服务将申请内存失败,启动不了
   sp_configure "max memory ",256m

8. SYBASE SERVER12.0 SYBASE CLIENT12.5 安装冲突
当你在已经安装了SYBASE Server12.0 的机器上安装SYBASE Client 12.5 那么[恭喜你],你的SYBASE 将起不来了,解决方法如下
原因是:由于12.5CLIENT默认安装的JAVA虚拟机版本跟SERVER12.0 不一样,并且把他加到WINDOWS环境变量里去了。具体解决办法,在WIDNOWS环境变量里把SYBASE CLIENT的与JRE相关的环境变量去掉(记下来),特别注意的是SYBASE这个环境变量,CLIENT安装之后,就指向CLIENT端安装目录了,把他改为SERVER端安装目录,然后重启,这样的结果是SERVER可启动了,但CLIENT JAVA CENTER启动不了了,JAVA CENTER 启动是通过C:"sybase"client"sybcent41"bin"scjview.bat 批处理文件启动的,可以直接这个批处理文件,把刚刚记下来的环境变量CLIENT的设置直接添加到BAT处理文件中去,批处理文件中读取环境变量的地方替换成刚刚记下的目录.
结论:a. 除非必要,不建议在一台机器上同时安装SERVERCLIENT
        b. 如果同时,安装请安装在不同目录
      c. 在安装好SERVER端后,请保存好当前SERVER的环境变量,然后再安装CLIENT端,
      d. 修改批处理文件前,如果不了解批处理,请先了解一下批处理的一些基本命令

9. 数据库设备
a. 创建数据库前,必须先创建数据库设备

 b. 建立数据库时必须先选择数据库设备,请把日志和数据分开存放,有利与数据库的备份与恢复
c. 建立系统设备,为系统存储过程和临时表扩容, 因为大量数据库查询操作时,统统利用临时表缓存的

10. 数据库的备份与恢复
. 首先启动数据库备份服务
. dump database database_name to “c:" database_name.bak”
 load database database_name from “c:" database_name.bak”
 另外在转储的时候,可以截断日志然后再备份,以减少文件大小
 一些常用命令如下:
 对整个数据库进行转储
 dump database
 对日志进行转储
 dump transaction
 数据库发生设备故障后转储事务日志
 dump transaction with no_truncate
 截断日志不备份,然后复制整个数据库
 dump transaction with truncate_only
 dump database
 因为日志空间不足,导致通常方法失败后,截断日志,然后复制真格数据库
 dump transaction with no_log
 dump database
 更详细的命令可以参考SYBASE手册,其官方网站上有

11. 数据的转储与恢复

数据导入还可以用SYBASE BCP程序来完成。在SYBASE 端添加一个SERVER,指向SQL SERVER 的地址和端口。然后用

bcp database_name.owner.table_name out datafile_name -c -t'|' -Usa -Ppwd -Ssqlsrv -b5000

可以将SQL SERVER的表table_name的数据导出成文本格式的文件。然后用

bcp database_name.owner.table_name in datafile_name -c -t'|' -Usa -Ppwd -Ssybsrv -b5000
参数说明: b 表示每5000 行写日志,如果没有这个参数,数据量很大时,会频繁写日志,会导致日志空间很快用完
         t 指定制表符,当数据库里有中文时,如果不用制表符会出现导不进去的情况

12 客户端查询管理器乱码
   修改安装目录"locals"locals.dat 查找[NT] 项的最后一行
locale = default, us_english, iso_1 改为
locale = default, us_english, utf8 即可

13.当客户端启用了utf8后,有些中文字符插入不进数据库
可能是由于SYBASE 与微软操作系统在UTF8之间的兼容性问题,SYBASE没有给与解决办法, 可以通过补空格的方法
另外如果只有中文,可以设为CP936,或者默认ISO_1
当然,如果你不用考虑服务器支持多语言字符集,服务器也是CP936最彻底了

14. CLIENT CENTRAL 的好处
 可以直接浏览数据表的数据
 可以直接查看VIEW的脚本,不过好像有BUG,如果你包含中文或者注释行,显示有时将会碰到问题,没关系,你可以通过SP_HELPTEXT YOUR_VIEW 得到视图的脚本,还可以通过GERERATE DDL看到脚本

15 查询管理器 SQL ADVANTAGE
 不用也吧,JAVA写的,显示极慢,如果你有的耐性的话可以使用,否则可选择第三方的工具,推荐一个Embarcadero DBArtisan 7.2.1 ,可以支持多种数据库

16 命令查询表属性的几个系统存储过程
sp_helptext
sp_columsn
sp_tables
sp_who
等等,对MSSQLSERVER适用(MSSQLSERVER下用不着,无论企业管理器,还是查询管理都很好用),当然,如果你有了Embarcadero DBArtisan 你就可以抛弃CLIENT CENTRAL SQL ADVANTAGE 这个两个又占资源又其慢的东西,也不需要用这几个系统存储过程

17. 关于ADO OLE使用的注意
a. 先选择正确的驱动

b. 切换到最后一页,填写SERVER NAME 和端口, 默认端口5000 关键点:一般驱动是不需要切换到这个业签来的,第一次使用SYBASE OLE 驱动可能碰到这个问题


c. 输入用户名,密码,选择数据库,当然这些也可以在上面的页面页,然后再返回这个页面测试连接 (反正要回来,还不如直接在这个页面修改)

18 .关于日志的一些注意事项(转摘)
细说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一样,需要存放在数据库设备上,可以将LogData存放在同一设备上,也可以分开存放。一般来说,应该将一个数据库的DataLog存放在不同的数据库设备上。这样做有如下好处:一是可以单独地备份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”。以此类推,我们可以对表删除、表插入等大事务做相应的拆分。

19. Sybase 12.5XP下中文乱码解决办法:
进入: ."shared-1_0"jre1.2.2"lib目录,将文件font.properties.zh.NT4.0的名称改为font.properties.zh.NT5.1即可。另外,还必须将."shared-1_0"jre1.2.2"lib中的font.properties.zh_TW的名称改成font.properties.zh_CN  能显示为简体中文。
安装完成之后,基于中文的管理工具依然会出现乱码,按上面的方法更改%sybase%"shared-1_0"jre1.2.2"lib中的font.properties.zh.NT4.0文件名为font.properties.zh.NT5.1,另外还必须按上面的方法改font.properties.zh_TW的名称改成font.properties.zh_CN 使显示为简体中文。

windows操作系统的版本号
windows NT4.0  NT4.0
windwos 2000   NT5.0
windows XP     NT5.1
版本号为x.x,就改为NTx.x

  暂时想到这么多,有些问题不记下来,我自己碰到也要搞半天才能想起来.
关于乱码的有些设置是Sybase的一位工程师(tmmaha)教我的,不过他早就离开了Sybase。

2005-10-21

posted @ 2008-06-06 16:04  老万 - 一刀  阅读(6457)  评论(0编辑  收藏  举报