存档
Sybase ASE自带了一个导出对象结构的命令行工具:ddlgen
比较详细的用法,请参照:用DDLGEN从ASE数据库中提取对象的定义语法
如果对象结构中包含中文,使用参数: -Jcp936
比较实用的用法如下:
1、导出数据库tpchdb内所有表的表结构(包括索引):
ddlgen -Usa -Psybase123456 -STEST -Dtpchdb -TU -N%.% -Jcp936 -O./tables.sql
2、导出数据库tpchdb内所有视图的创建语法:
ddlgen -Usa -Psybase123456 -STEST -Dtpchdb -TV -N%.% -Jcp936 -O./views.sql
3、导出数据库tpchdb内所有存储过程的创建语法:
ddlgen -Usa -Psybase123456 -STEST -Dtpchdb -TP -N%.% -Jcp936 -O./procs.sql
4、只导出表结构(不包含索引):
ddlgen -Usa -Psybase123456 -STEST -Dtpchdb -TU -N%.% -FI -Jcp936 -O./tables.sql
5、仅仅导出表上的索引的语法:
ddlgen -Usa -Psybase123456 -STEST -Dtpchdb -TI -N%.% -Jcp936 -O./indexes.sql
注意常见的对象类型:
I --- 索引
U ---- 表
TR --- 触发器
P --- 存储过程
V --- 视图
本文的目的在于给出一种方法(或者workaround)来屏蔽错误Error: 9561。
在老环境ASE 12.5上测试某程序时,执行一些命令会报Error: 9561!
环境介绍:
ASE版本为: Adaptive Server Enterprise/12.5/SWR 9616 GA/P/NT (IX86)/OS 4.0/main/1647/32-bit/OPT/Fri Jun 01 16:58:25 2001
此版本为ASE 12.5 GA,裸奔很久了。
lock scheme=allpages
系统库model、tempdb以及用户数据库均启用了选项:allow nulls by default
本文介绍我遇到的一例ASE Error: 624的解决过程;所使用的方法仅对我遇到的案例时适用的。
对于Error: 624,主要有两种情况:
一、ASE服务器联机状态中,损坏的非聚簇索引的叶页指向不正确或不存在的RID;
二、ASE服务器自动恢复过程中,事务日志中最后一条检查点记录的数据结构指向日志中不正确或不存在的记录;
问题确认:
我所遇到的这个案例是属于第二种情况,事务日志页指向有错误。
客户反映ASE 15.0.3无法启动,错误日志报错:Error: 624
Adaptive Server failed to retrieve a row via its RID in database 'master' because the requested RID has a higher number than the last RID on the page. 0x28.0xbdb.
ASE将索引标记为“可疑”时,或者ASE的排序顺修改后,索引状态会设置:-32768,
patrol指标SuspectIndex会监控数据库中可疑索引的个数。
查找出现索引索引损坏的表:
存储过程:sp_indsuspect [table_name]
如果不加表名,就是查找当前数据库中因排序顺序更改需被重建的索引的所有表;
或:
select u.name as user_name, o.name as table_name, i.name as index_name,i.status
from sysobjects o, sysindexes i, sysusers u
where o.id = i.id and o.uid = u.uid
--and o.id = object_id('table_name')
and (i.status & -32768) != 0
例子:
1> sp_indsuspect
2> go
Suspect indexes in database dbainfo:
Own.Tab.Ind (Obj_ID, Ind_ID)
----------------------------------------------
dbo.sysqueryplans.csysqueryplans (27, 2)
dbo.sysqueryplans.ncsysqueryplans (27, 3)
修复索引:
建议使用dbcc reindex ({table_name | table_id})
当dbcc reindex发现损坏的索引时,它会删除并重新创建相应的索引。dbcc reindex不会重建系统表的索引。
生成重建用户表索引命令的SQL语句:
select distinct 'dbcc reindex('''|| u.name || '.' || o.name || ''')'
from sysobjects o, sysindexes i, sysusers u
where o.id = i.id and o.uid = u.uid
--and o.id = object_id('table_name')
and (i.status & -32768) != 0
索引重建时间:
系统表sysindexes中有字段crdate记录索引的创建时间。使用dbcc reindex重建索引后,可以通过查询sysindexes.crdate来确认索引的创建时间。
select object_name(id),indid,name,crdate from sysindexes
另外修复索引的方法:
1、保存索引的创建语法,手动删除索引后再创建索引;
2、reorg rebuild table_name index_name
曾经写过博文介绍利用代理表统计数据库内所有表占用空间情况,也包括表的行数:
可以参考:ASE15.0中利用代理表实现统计用户表存储空间大小的功能
配置代理表可能有些麻烦,本文提供一个简单的脚本来获得数据库内表的行数。
#!/bin/bash
ISQL="isql -Usa -P -SSYBASE -w5000"
database_name="tpchdb"$ISQL <<EOF | sed -e '1,2d' -e 's/^ *//;s/ *$//' -e '/^$/d' > tablename.list
use ${database_name}
go
set nocount on
go
select name from sysobjects where type='U' order by name
go
quit
EOFwhile read table_name
do
if [ "${table_name}" = "" ]; then
break
fi
$ISQL <<EOF | grep "=" | sed -e 's/^ *//;s/ *$//;s/= */=/'
use ${database_name}
go
set nocount on
go
select "${table_name}=",count(*) from ${table_name}
go
quit
EOF
done < tablename.list
echo "Table Count:`wc -l tablename.list|awk '{print $1}'`"
rm -f tablename.list
使用的时候,仅仅需要修改一下红色标记的用户名、密码、服务器名称、数据库名称即可。
当然你也可以只统计相应的表的行数,修改select name from sysobjects where type='U' order by name,比如:name like 'flow_%' and crdate > '2014-01-01'
另外,如果不想用脚本而在TSQL中实现的话,可能得用到游标了。
脚本tablerowcount.sh下载地址。
在定义游标时不指定for update 或 for read only,ASE会检查以了解游标是否可更新;
如果游标查询语句中包含order by子句,则ASE会将游标定义为只读;其它情况下定义为可更新游标;
如果不涉及更新或删除表数据的话,建议在游标定义中加上for read only选项,这样ASE将游标定义为只读;
表customer在c_custkey列上建有唯一索引,查询表的前10行内容(所有字段拼接成一个字符串),
如果定义游标为for read only:
declare cur_hash cursor for select top 10 convert(varchar,c_custkey)+coalesce( nullif(isnull(c_name,''), '') , ' ')+coalesce( nullif(isnull(c_address,''),'') , ' ')+convert(varchar,c_nationkey)+coalesce( nullif(isnull(c_phone,''),'') , ' ')+convert(varchar,c_acctbal)+coalesce( nullif(isnull(c_mktsegment,''),'') , ' ')+coalesce( nullif(isnull(c_comment,''),'' ) , ' ') from customer for read only
则使用表扫描返回表的前10行数据;
遇到两例isql登录ASE报Client password encryption fails.的错误,先总结一下。
主要原因可能有:
1、操作系统不被支持;
2、sybase环境变量不正确;
case 1:
在SUSE 10 x64 上安装了ASE 15.7 ESD#7的32位的客户端,使用isql连接的时候,报: Client password encryption fails(客户端密码加密失败)
通过查询sybase官方的版本与平台支持信息,
ID | Product | Prod Version |
Prod Word Size |
OS Version | Status |
1436 | Adaptive Server Enterprise | 15.0 | 64-bit | SuSE SLES 10 (AMD64/EM64T) | Certified |
General Notes: | ASE15.7 release does NOT support SLES10. Due to recent changes in glibc, the environment variable LD_POINTER_GUARD should be set to 1 for ASE to function properly. This variable should be set before starting any ASE binary. Note that there is known bug with the configuration step of the ASE installer. Please use "srvbuild" or "srvbuildres" to configure devices. This bug will be fixed in a future release of ASE. ASE15.5 ESD5.2 can't install on SUSE10SP2 Work-round: Replace sylapi with 32bit and change to 32bit JRE. ASE 15.5 support SUSE10: kernel-smp-2.6.16.21-0.8 glibc-2.4-31.2 ASE CE 15.5 support SUSE10.1: kernel-smp-2.6.16.46-0.12 glibc-2.4-31.30 e2fsprogs-1.38-25.21 libaio-0.3.104-14.2 libgcc-3.3.3-43.41 libstdc++-3.3.3-44.41 compat-libstdc++-5.0.7-22.2 | |
Minimum Product Level : | ASE 15.0.2 ESD#1 ASE15.5 GA to ASE15.5 ESD5.1 ASE15.7 release does NOT support SLES10. |
|
Minimum Required OS Level : | ASE15.7 release does NOT support SLES10. ASE15.7 requires SLES 11.0 as minOS.
For ASE15.0.2 and higher to ASE15.5 ESD5.1: kernel-smp-2.6.16.21-0.8 |
再查看ASE 15.7的最低支持平台,看到:
ASE中在会话级别得到SQL语句的抽象查询计划:
set showplan on
go
set statistics io,time on
go
set noexec on
go
--<<<SQL语句>>>
set noexec off
go
set statistics io,time off
go
set showplan off
go
如果知道会话的spid,可以执行:
sp_showplan @sp_id,null,null,null
查看该会话正在执行的最后一条SQL语句的抽象查询计划。