存档
今天下午在solaris10 ASE15.0.3平台上批量创建非聚簇索引时,报下面的错误:
Msg 1526, Level 17, State 5: Server 'SYB_NFJD_TEST', Procedure 'sp_helpdb', Line 674: Sort failure. The configure size for data cache (default data cache) is not sufficient to handle the sort buffers (128) requested. Please reconfigure the data cache or sort buffers and try the command again. (return status = -7)
用命令:sp_helpcache "default data cache",发现高速数据缓冲大小为:8M,此为默认值。
执行命令将default data cache扩充至100M,sp_cacheconfig "default data cache","100m"
然后再重新执行一遍非聚簇索引的创建过程,成功完成了!
在error message & troubleshooting 中没有找到错误号1526的解释以及解决办法。
目前暂时没有想明白,为什么在创建非聚簇索引的时候需要用default data cache,而且默认数据缓存不足还会出错。难道default data cache要缓存某一层次的索引的页数据?
------------------------------------------------------------------------------------------------
以下关联一篇网上搜索的也是关于error:1526的信息
The failure is most likely happening on the remote server where the actual
physical table lives. It's certainly possible to create indexes on proxy
tables, but what really happens is that the physical index is created on the
remote server. Try logging in to the remote server where the actual table
resides. Check the memory settings on the remote server.
> Hi,
> I am trying to create a non clustered index on an "existing
> table"(proxy table). But it keeps failing with the error,
>
> Sort failure. The configure size for data cache (default
> data cache) is not
> sufficient to handle the sort buffers (30008) requested.
> Please reconfigure the
> data cache or sort buffers and try the command again.
>
> The data cache is configured 2 Gig, 800MB for 8K pool
> I have this configuration enough for most of the things.
>
> How can I make the non clustered index.
总结一下: 在建立非聚簇索引的时候,都涉及到default data cache数据缓存的使用。不管是在基本表还是在代理表上创建非聚簇索引,都会在物理表所在的ASE服务器上使用数据缓存。如果数据缓存不足,则会报 1526的错误信息。解决办法为用过程sp_cacheconfig增加default data cache即可。
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:nonclustered index default data cache insufficient 1526
数据缓存不足 非聚簇索引
————————————————————————————————-
ASE15.0之前的版本中利用bcp这个实用程序只能够导出整表或视图的数据。要想利用bcp有条件得导出表内数据,只能根据条件建立视图,然后 再导出该视图的数据;或者根据条件建立临时表,再导出临时表的数据。但是,都必须在执行bcp命令之前到数据库内部去创建对象(视图或者临时表),然后再 执行bcp命令导出视图或者临时表数据。显然,不是太方便。而其它的数据库管理系统,比如sqlserver早在sqlserver2000就实现了根据 条件queryout数据的功能。利用sybase ASE的第三方工具按条件导出数据也是一种办法。
在ASE 15.0及以后版本中,sybase终于提供了按照条件导出表内数据的办法,虽然实现起来还稍微有一点点小麻烦,但是终究是有这个功能了。参数:--initstring 就是为实现这个功能而加的。
关于参数:--initstring的注意事项有:
1. 参数--initstring之后的SQL语句会在数据导出之前被发送到ASE引擎;
2. 参数--initstring之后的SQL语句被当做会话级别的SQL语句一样处理;
3. 参数--initstring之后的SQL语句在整个bcp导出数据会话期间始终有效;
4. 真正导出的数据是关键字bcp和out之间的表的数据,而不是参数--initstring中select列表的数据。
下面开始举几个例子:
问题描述:
在Sybase Central中查看数据库时,在数据库目录下没有找到某个用户数据库(名字:andkylee),但是用isql连上数据库执行sp_helpdb能够 查询到andkylee的确存在。在Sybase Central中找了一会儿,竟然在代理数据库目录下找到了数据库andkylee。很是奇怪,怎么跑到代理数据库里面了。数据库andkylee就是一 个普通的用户数据库而已。
继续,依次展开代理数据库里面的andkylee库的目录,却找不到任何的用户表。代理表目录空空的,也没有用户表目录(真正的代理数据库中没有用户表)。纳闷了,andkylee库里的用户表都跑到哪里去了?
不过,用其它的数据库客户端工具是能够查询到andkylee库里面的用户表数据的。比如:用isql连上数据库,进入到andkylee库里。 sp_help可以查看到所有的对象名称。发现用户表都在,执行select能够查看到表的数据。其它的比 如:powerbuilder,dbartisan里面都能够在tables目录下面找到andkylee库里的所有表。看来,用户数据库 andkylee没多少异常。是普通库而不是代理数据库。
分析原因:
一开始,我以为是andkylee库里的用户没有关联上登陆账号引起的。这个情况是比较常见的。
在master库中执行:select suid ,name from syslogins where name='escourt4'
1> select suid ,name from syslogins where name='escourt4'
2> go
suid name
----------- ------------------------------
5 escourt4
(1 row affected)
登录escourt4对应的suid为:5。
在进入到用户库andkylee里面。
1> use andkylee
2> go
1> select suid,uid,name from sysusers where name='escourt4'
2> go
suid uid name
----------- ----------- ------------------------------
5 3 escourt4
(1 row affected)
可以看出库andkylee里面的用户escourt4的uid为:3,它的suid为:5,正是对应的登录escourt4的suid。这没有问题,是正常的!
在测试load tran with until_time 的时候出现了错误。
先执行:dump tran andkylee to "d:\andkylee_tran2.dmp" with no_truncate 然后,进行数据库的恢复。
先进行全库恢复,接着进行下面的日志恢复,并恢复到指定的时间点。
但是报下面的错误:
1> load tran andkylee from "d:\andkylee_tran2.dmp" with until_time='Jun 28 2010 5:24:10 PM'
2> go
Backup Server session id is: 111. Use this value when executing the
'sp_volchanged' system stored procedure after fulfilling any volume change
request from the Backup Server.
Backup Server: 6.28.1.1: Dumpfile name 'ndkylee101790F554' section number 1
mounted on disk file 'd:\andkylee_tran2.dmp'
Backup Server: 4.58.1.1: Database andkylee: 75548 kilobytes LOADed.
Msg 623, Level 21, State 1:
Server 'TEST', Line 1:
Adaptive Server failed to retrieve a row via its RID in database 'andkylee'
because the target page is not a data page. Rid pageid = 0x16381; row num = 0x0.Page pointer = 0x240FA000, pageno = 0, status = 0x300, ptnid = 99, indexid = 0,
level = 0.
用dbcc page查看pageid = 0x16381 的页面内容,发现此页面为日志页。页面号0x16381为十六进制,转化成十进制为:91009
今天下午作为公司的代表参加了南大通用数据技术有限公司在钓鱼台国宾馆举行的GBase 8a产品发布会。GBase 8a是国内首款具有自主知识产权的分析型数据库。
GBase 8a采用了列式存储、智能查询、高效压缩、双向并行、自适应优化等多项新技术,打破了以往提高性能只能靠增加数据库的容量,建很多索引的常规,使得 GBase 8a既有高性能又有很高的数据压缩比。宣称查询速度比传统关系型统数据库能够提升10倍以上,有5倍以上的存储压缩率。现在发布的单节点GBase 8a可以支撑大约10T的数据量,紧接着会发布GBase 8a的集群版本SN(share nothing)能存储100T级别的大规模数据量。
发布会现场展示了GBase 8a的卓越的查询性能。 模拟一个超市历年的销售数据,2张表,每张都有500亿多行的记录。 统计一下表内的行总数select count(*) from TABLE_NAME 只花了2秒左右的时间。的确够快的!还有,在聚合统计方面的速度更惊人,统计1994年2月1日至1994年2月28日之间的折扣率为5%到7%之间的 (包含5%,7%)的所有销售收入总和,(忘记了还有一个也是范围的条件),查询列是: sum(数量*价格),这个操作仅仅需要了6秒多点的时间。很惊讶!国产数据库能做到这个水平,不容易。GBase 8a采用列存储,使用智能索引技术,有一个称为数据包或者知识网格knowledge grid的东西。想不出来,用什么技术会产生这么惊人的结果。
好像,GBase 8a目前只能运行在64bit的unix平台上。比较经典的是运行在linux上,比如redhat,redflag(这和他们的ceo以前在redflag工作过不无关系,呵呵)。 好像aix上也有版本吧。windows平台上应该不支持。
以后,继续试用。
今天试验了一下不同ASE版本跨平台远程备份数据库的操作。
环境:
源数据端:solaris 10 SPARC 64bit,ASE 12.5.4,称为:server1
目的数据端:windows xp x86,ASE15.0.3,称为:server2
任务:
测试将源数据端solaris上的ASE数据库服务器里面的andkylee库远程备份到目的windows-xp机子上。
第一步:在server1的interfaces文件中添加远程服务器条目
在server2的连接接口配置文件%SYBASE%\ini\sql.ini中,备份服务器的名称为:TEST_BS.
在server1的 /db/sybase/ase1254/interfaces中添加:
TEST_BS
master tcp ether 192.168.2.173 5001
query tcp ether 192.168.2.173 5001
注意:添加到server1的远程备份服务器名称务必和server2中的备份服务器名称保持一致。
第二步:连接上server1的ASE服务器,添加远程备份服务器的条目
isql -Usa -P -Sase1254
sp_addserver TEST_BS
这一步不是必须的!
第三步:在server1的ASE中执行远程备份命令
dump database andkylee to "d:\andkylee_remote.dmp" at TEST_BS
可以使用stripe on进行远程备份文件分片,最大分片数为32。
如果想压缩远程备份文件的话,必须使用with compression=[0-9]选项;兼容选项compress::只支持本地备份。
最后检查,在远程服务器server2上D盘发现有远程备份生成的文件:andkylee_remote.dmp。 远程备份数据库操作完成!
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:ase cross-platform dump load solaris windows 跨平台 远程 备份恢复
————————————————————————————————-
AIX下mount一个iso文件的步骤:
mklv -y cdaix -s n -L /dev/cdaix rootvg 384M hdisk0
dd if=/sybase/sybaseAIX64BIT.iso of=/dev/cdaix bs=10m
mkdir /mnt/cdaix
mount -v cdrfs -o ro /dev/cdaix /mnt/cdaix
完成,加载点/mnt/aix内即为iso的内容。
Solaris下mount一个iso文件的步骤:
lofiadm (显示已用的设备名)
lofiadm -a /db/sybdata/rs1520solx64zhja.ISO /dev/lofi/2
lofiadm /dev/lofi/2 (查看刚才创建的附属的块设备)
mount -F hsfs -o ro /dev/lofi/2 /mnt (用mount命令mount映像文件)
完成,加载点/mnt内即为iso的内容。
Linux下mount一个iso文件的步骤:
mount -t iso9660 -o loop ./wary-5.1.4.iso /mnt/remove/
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字: aix solaris mount iso mklv dd lofiadm
————————————————————————————————-
在ASE12.5.x平台中没有替换字符串的函数,也就是说没有类似replace的函数。对于replace这个词,我想有编程经验的肯定一看字 面意思就知道是将某一字符串中指定的字符串替换为另外的字符串。可惜的是这么简单的功能在ase12.5.x中没有相应的函数,只有一个可怜的stuff 函数。
stuff函数仅仅能够替换某一个字符串中某一个位置处的字符串为另外的字符串,如果这个字符串中有多处需要被替换呢?抱歉,stuff歇菜了。
一个简单的类似replace的功能还得需要写个过程或者函数来实现。 写起来效率低执行起来效率更低, so pooor.
谁要是实现了用简单的一两条sql语句顶替replace的功能,麻烦告诉我一声。谢谢!
幸运的是,ASE15.0版本中引入了类似replace的函数,但是人家的名字叫str_replace,不知道为啥?replace这个词和那个关键字冲突吗? 不解ZZZZZZZ~~~
str_replace函数的语法很简单:
st_replace("string_expression1", "string_expression2", "string_expression3")
就是:将字符串1中所包含的所有 的字符串2都用字符串3统统替换。
一个简单的例子:
1> select str_replace('This is Andkylee!My nAme is andkylee!','A','a')
2> go
-------------------------------------
This is andkylee!My name is andkylee!
(1 row affected)
但是, 网上有人发帖说str_replace不能替换字符串中的空格为“(也就是说删除字符串中的所有空格)。不看官方文档,想当然的就写出来这样的语句:select str_replace('123 456 ',' ','')
但是很可惜,执行失败。
1> select len('123 456 '),str_replace('123 456 ',' ','') ,len(str_replace('123 456 ',' ',''))
2> go
----------- -------- -----------
8 123 456 8
(1 row affected)
如上可以看到select str_replace('123 456 ',' ','')并没有替换其中的空格为空(亦即删除其中的所有空格),用函数str_replace执行前后的字符串是相同的。
通过查阅官方文档中关于str_replace的介绍,有下面的两点需要注意:
1. Adaptive Server 将空字符串常量自动转换为 1 个空格的字符串,以便将该字符串与 NULL 值区分开。
2. str_replace 在第三个参数中接受 NULL,将其视为尝试用 NULL 替换 string_expression2,有效地将 str_replace 转换成“字符串切除”
操作。
这两条的意思是说:在函数str_replace中""相当于" ", NULL 相当于“”(空字符)。
""相当于" "
示例:
1> select str_replace("cde fghi ","","_")
2> go
---------
cde_fghi_
(1 row affected)
1> select str_replace("cde fghi "," ","_")
2> go
---------
cde_fghi_
(1 row affected)
两个空格还是2个空格意思:
1> select str_replace("cde fghi "," ","_")
2> go
---------
cde fghi
(1 row affected)
NULL 相当于“”(空字符)
示例如下:
1> select str_replace("cde fghi "," ",null),len(str_replace("cde fghi "," ",null))
2> go
--------- -----------
cdefghi 7
(1 row affected)
1> select str_replace("cde fghi ","",null),len(str_replace("cde fghi "," ",null))
2> go
--------- -----------
cdefghi 7
(1 row affected)
总结:
在函数str_replace中NULL 相当于“”(空字符),""相当于" " 。其它都是正常的。
通过本文中的例子,可以看出Sybase ASE中存在一些不太符合常规习惯的地方。
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:str_replace 15.0 null 空格 替换
————————————————————————————————-