1) 关于定时备份
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1233&show=390
crontab 中可以这样写:
00 23 * * * /sybase/ASE-12_0/bin/DUMPDB.sh >>/sybase/ASE-12_0/install/DUMPDB.out
放那里都无所谓,一个dumpdb.sh的例子:
#SUN Solaris 8
#!/bin/ksh
export SYBASE=/sybase
export SYBASE_FTS=FTS-12_0
export PATH=/sybase/ASE-12_0/bin:/sybase/OCS-12_0/bin:$PATH:/sybase/ASE-12_0/install:/usr/sbin
export SYBASE_OCS=OCS-12_0
export SYBASE_ASE=ASE-12_0
export LM_LICENSE_FILE=/sybase/SYSAM-1_0/licenses/license.dat:$LM_LICENSE_FILE
export LD_LIBRARY_PATH=/sybase/ASE-12_0/lib:/usr/local/openwin/lib:/sybase/FTS-12_0/lib:/sybase/OCS-12_0/lib:/usr/local/openwin/lib:/usr/lib:/sybase/SQLRemote/lib:$LD_LIBRARY_PATH
export SYBASE_SYSAM=SYSAM-1_0
export HOME=$SYBASE
$SYBASE_OCS/bin/isql -Usa -SSYBASE -P stripe on "/sybdump/dump.02" stripe on "/sybdump/dump.03" stripe on "/sybdump/dump.04" stripe on "/sybdump/dump.05" go ! 这里是一个典型的脚本,用于实现full备份! #!/usr/bin/sh # ************************************************************************* #for full backup after excuted dbcc operation # ************************************************************************* SHLIB_PATH=/opt/sybase/ASE-12_0/lib:/opt/sybase/FTS-12_0/lib:/opt/sybase/OCS-12_0/lib:/usr/lib:/lib:/usr/lib/Motif1.2:/opt/sybase/SQLRemote/ lib export SHLIB_PATH SYBASE_OCS=OCS-12_0 export SYBASE_OCS SYBASE=/opt/sybase export SYBASE ISQL="/opt/sybase/OCS-12_0/bin" ymd=`date +%y%m%d` bk_user="unb" bk_pwd="******" bk_db="SYB_HP" cd /sybase/backup mkdir $ymd LOG="/sybase/backup/$ymd" echo $ymd >$LOG/backup.log echo "\n11*************************" >>$LOG/backup.log echo "Check database $bk_db..." >>$LOG/backup.log d1=`date` su - sybase -c "isql -SSYB_HP -Usa -P****** <$LOG/dbcc-$ymd.log 2>&1 dbcc traceon(3604) go dbcc checkdb($bk_db) go dbcc traceoff(3604) go DBCC echo $d1,`date` >>$LOG/backup.log echo "\n22*************************" >>$LOG/backup.log d1=`date` dump_file="/sybase/backup/$dump-unb-full-$ymd.dat" echo "Dump database $bk_db to " $dump_file >>$LOG/backup.log su - sybase -c "isql -SSYB_HP -Usa -P****** <$LOG/dump-$ymd.log 2>&1 dump database $bk_db to "$dump_file" go DUMP echo $d1,`date` >>$LOG/backup.log echo "\n33*************************" >>$LOG/backup.log 请根据自身系统,调试后再使用! 至于备份日志的脚本与此类似,自己根据sybase的相关语法,稍加变动即可! 2) 有个关于游标的问题,请教各位大虾 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=429&show=390 在sybase数据库中用游标操作完表a的记录后,关闭close游标,在free游标。但接着想drop此表a,结果失败,显示的错误信息是"游标在使用"(记得不是很清楚了,大概是这个意思)。 请碰到过这类问题的大虾支持支持。在informix和oracle中释放游标是用free,在sybase也是用free吗? sybase 中正确操作游标的顺序是: 1、DECLARE CUR_ACCTINFO CURSOR FOR SELECT ..... (定义) 2、OPEN CUR_ACCTINFO (打开) 3、WHILE @@SQLSTATUS = 0 (判断是否成功) BEGIN 4、 FETCH CUR_ACCTINFO INTO ....... (取数据) IF @@SQLSTATUS <> 0 begin ...... end ........... 5、 CLOSE CUR_ACCTINFO (关闭) 6、 DEALLOCATE CURSOR CUR_ACCTINFO (释放) 3) 在sybase中有没有进行数据类型转换的函数 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1346&show=330 四舍五入用round,如round(123.4567,1)=123.5或round(123.4567,0)=123或round(123.67,0)=124 去尾用floor,如floor(123.4567)=123 进尾用ceiling,如ceiling(123.4567)=124 4) 新手问题:为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊!? http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1335&show=330 为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊!? 我用NetTerm登陆运行,但只要一退出NetTerm,BACKUP就自己DOWN了 加&运行也不行,怎么办啊? 命令前加nohup 试试 那是因为你的backup进程是以你的登录用户起动的,所以当该用户退出unix时, 进程也跟着退出操作系统了 5) 什么是BYPASS RECOVERY mode? http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1371&show=300 在客户端出现提示: Attempt to BEGIN TRANsaction in database "****" failed because database is in BYPASS RECOVERY mode. 请问如何解决? select name,status from master..sysdatabases where db_name="你所说的数据库" 看status是否是-32768 ,若是,sysdatabases系统表相应记录的status字段改为0,reboot数据库服务器就可以了。 谢谢各位,问题已解决。中午去SYBASE网站查找到有关这个问题的详细信息,包括问题成因及解决办法: Error 3908 Severity 16 Error Message Attempt to BEGIN TRANsaction in database '%.*s' failed because database is in BYPASS RECOVERY mode. Explanation Adaptive Server can start various types of transactions such as local (in response to a local command), internal (for the server's own use), external (started by an external client like a TP Monitor) and subordinate (child transactions started by a parent transaction in parallel). Bypass recovery starts Adaptive Server without recovering one or more databases. A database in this mode can be accessed even though it is not recovered. You use this mode to allow access to the database for problem analysis, to copy out data, and so on. Error 3908 is raised when a transaction is attempted while the database is in bypass recovery. Although certain commands are permissible in this mode, no transactions - regardless of type - can be started when the database is in bypass recovery. Error 3908 is raised in the following states: State Meaning 1 Attempted to start a transaction when the database is not available for update. Applies to all possible transaction types. 2 Attempted to start a subordinate transaction when the database is not available for update. Action Do not attempt to start a transaction while the database is in bypass recovery. Check if any automated jobs may have submitted a batch job that attempted such a transaction. First restore the database to the original working status it had (prior to bypass status) before attempting any transactions. Use the following steps to reset the database status: Note Although a status of zero is usually appropriate, it is not the only possible status value you can use. Reset the database to the actual, normal status it had prior to entering bypass recovery status. 1. Reset the database status to 0: 1> sp_configure "allow updates", 1 2> go 1> begin tran 2> go 1> use master 2> go 1> update sysdatabases set status=0 where name= 2> go Check that the above update command affected only one row (if more than one row was affected, issue a rollback transaction.) Then commit the transaction and shut down Adaptive Server as follows: 1>commit tran 2>go 1>shutdown with nowait 2>go 2. Restart Adaptive Server. Run dbcc checkdb and dbcc checkalloc on the affected database to make sure there are no errors. Version in Which This Error is Raised All versions. 再次谢谢aladdin,freebob,changing。 6) 数据库表BCP出来报错 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1326&show=300 数据库表BCP出来报错 DB-LIBRARY error I/O error while writing bcp data-file bcp出来的文件正好2GB,实际应该更大。 操作系统SCO OpenServer5.0.4, SYBASE 11.0.3 请问是何原因?谢谢。 当在后备数据量大于2GB的数据库时,可能会遇到以下错误: I/Oerror: operating system error,server device /backup/data. code 27 messages file too large. 这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件,这时可以使用Backup Server将一个数据库后备到多个文件中。 1>dump database pubs2 to "/usr/sybase/pubs2_dump.1" 2>stripe on "/usr/sybase/pubs2_dump.2" 3>stripe on "/usr/sybase/pubs2_dump.3" 4>go 这种方法还可以提高后备及恢复的速度,但注意恢复也必须用相应多的设备。例如: 1>load database pubs2 from "/usr/sybase/pubs2_dump.1" 2>stripe on "/usr/sybase/pubs2_dump.2" 3>stripe on "/usr/sybase/pubs2_dump.3" 4>go 7) sybase的sa口令丢失怎样恢复? http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1239&show=270 在RUN-SERVER文件中加入一行-psa,重起dataserver,在控制台上可以看见新的口令 http://www.powerba.com/develop/database/sybase/article/20010505001.htm 8) sybase表中如何删掉多条相同的记录? http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1438&start=0&show=180 sybase表中如何删掉多条相同的记录? 由于表出问题,将没有进行处理的*.txt文件bcp到表中,其中含有大量的重复记录。 请问有没有办法将表中重复的记录删掉呢? 那好办,那你就可以使用下面语句将唯一的记录先插入到临时表中: select distinct a ,b,c,d ... into tempdb..tempdb_table from tablename 然后清空原表,把临时表中的数据插入正式表中! 试试看 可以参考这种经典方法: 1---select * into tmp_tab from your_dup_tab where 1=2 2---若表无唯一性索引则建一个唯一性索引(一定能找到一个唯一性的索引建(复合索引))create unique index(列名1,列名2...) on tmp_tab with ignore_dup_key. 3----insert into tmp_tab from your_dup_tab 这样在新表中将自动删出重复记录。但数据量过大请留意日志空间(sp_spaceused syslogs). 很使用的方法.try it! 9) 关于阀值 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1231&show=180 发告警或者水自动溢出,以保护系统不至于达到危险境界。对于数据库而言,我们使用的存储设备毕竟有限,如果任由数据或日志增长,数据或日志日久天长终将占用所有存储设备,如果到了没有空间的时候,系统将挂起,这样业务将暂停。所以对于一些要求数据库可用性很高的系统,必须保证在可预见的情况下数据段或者日志段不至于没有空间!为做到这一点,传统的数据库一般都需要系统维护人员经常的定期的进行数据库检查,若数据段不够了,转储一部分数据或者增加一些设备,若日志空间不够了,转储日志!但这样系统管理员就有点累了! 为减轻系统管理员的负担,提高系统的自动化程度,sybase提出了用阀值进行自动管理的这样一种模式,只要在开始定义好各段的阀值,以及达到阀值后的处理存储过程,就可以实现自动管理了! 不过,我先前也想这样做,也研究了一阵子,但是后来还是放弃了这种懒惰的办法。因为使用阀值管理可能出现一些意想不到的问题,什么问题现在还没想到,只是sybase不推荐在大系统中这样做!再加上本身系统有omni back备份软件,何必自找麻烦呢! 10) 什么SYBASE安装完后要增加TEMPDB的空间? http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1444&show=180 扩展后sp_helpdb tempdb看应改master设备上是data/log的 你use tempdb sp_dropsegment 'default',tempdb,master sp_dropsegment system,tempdb,master sp_dropsegment logsegment,tempdb,master 后, sp_helpdb tempdb select db_name(dbid),segmap,lstart,size,vstart,pad,unreservedpgs from sysusages where dbid=2 贴出来 如果第一行中segmap为0,就ok 你们回答的什么,驴唇不对马嘴(呵呵,开玩笑) 一般情况下数据库装好之后,都要给tempdb增加空间,因为在用户数据库中的很多插入,删除等操作需要用到tempdb数据库作为临时存储空间,所以要增大他的空间,否则可能你的事务不能执行 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=185&show=120 sybase 临时数据库 缺省情况下,tempdb数据库是放置在master设备上,容量为2M,而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等操作,所以tempdb的优化应该受到特别的关注。本篇文章目的在于使你掌握临时数据库的优化策略以及临时表的优化使用。本文中,你将以调整临时库的位置开始,有步骤的完成临时数据库的优化,并在此过程中了解到优化临时数据库和临时表的一些方法和规则。 实验环境的要求:你应具有系统管理员的权限,系统中有auths和article表。 步骤: 第一步:调整临时库的位置 tempdb数据库缺省放在master设备上,将临时数据库发在分离的设备上是更可取的。 1) 初始化一个用来存放临时数据库的设备 disk init name="tempdb_dev", physname="d:\sybase\example\tempdb.dat", vdevno=13, size=15360 (注意:如果将tempdb数据库放在多个设备上,需初始化多个数据库设备) 2)将临时数据库扩展到该一个设备上 alter database tempdb on tempdb_dev=30 3)打开tempdb数据库,从段上删除master设备 sp_dropsegment "default",tempdb,master sp_dropsegment logsegment,tempdb,master 4)发出如下命令,检查default段中是否不再包含master设备 select dbid,name,segmap from sysusages,sysdevices where sysdevices.low<=syusages.size+vstart and sysdevices.high>=sysusages.size+vstart-1 and dbid=2 and(status=2 or status=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; 把对临时表的复杂的使用分散到多个批处理或过程中,以便为优化器提供信息 下面的这个过程需要进行优化: create proc base_proc as select * into #huge_result from auths select * from article, #huge_result where article.author_code= #huge_result.author_code and sex="0" 使用两个过程可以得到更好的性能 1)create proc base_proc as select * into #huge_result from auths exec select_proc 2) create proc select_proc as select * from article,#huge_result where article.author_code=#huge_result.author_code and sex="0" 说明:在同一个存储过程或批处理中,创建并使用一个表时,查询优化器无法决定这个表的大小。 结论:通过本实验我们知道,临时数据库经过优化可以极大的提高系统性能。实际工作中,必须考虑具体应用的情况,需长时间经验的积累。 11) 怎样利用脚本自动关闭sybase数据库 http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&topic=1484&show=180 不知你什么平台,如果是unix,ksh #!/bin/ksh LOGIN="`whoami`" if [ "${LOGIN}" != "sybase" ]; then echo "`basename $0`: You should login as 'sybase'\n" exit 0 fi echo "\n\n" { isql -Usa -P -Syourservername > /dev/null 2>&1