﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-水煮三国-随笔分类-Sybase</title><link>http://www.blogjava.net/os586/category/10207.html</link><description>态度决定一切，思想决定出路</description><language>zh-cn</language><lastBuildDate>Tue, 07 Aug 2007 17:06:16 GMT</lastBuildDate><pubDate>Tue, 07 Aug 2007 17:06:16 GMT</pubDate><ttl>60</ttl><item><title>BCP 数据导入导出时经常遇见的错误</title><link>http://www.blogjava.net/os586/archive/2007/08/07/135077.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 07 Aug 2007 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/08/07/135077.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/135077.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/08/07/135077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/135077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/135077.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">ct_connect(): network packet layer: internal net library error: Net-Lib protocol driver call to connect two endpoints failed<br />Establishing connection failed.<br />无法连接远程服务器</font>
		</p>
		<p>
				<font size="2">cs_convert: cslib user api layer: common library error: The conversion/operation was stopped due to a syntax error in the source field.<br />CSLIB Message: - L0/O0/S0/N36/1/0:<br />导入表对应的列数量不正确</font>
		</p>
		<p>
				<font size="2">cs_convert: cslib user api layer: common library error: The conversion/operation was stopped due to a syntax error in the source field.<br />导入数据存在自增长列，但数据源不存在自增长列</font>
		</p>
		<p>
				<font size="2">blk_rowxfer(): blk layer: internal BLK-Library error: Data truncated while doing local character set conversion. col = 3<br />导入表对应的字段长度不足</font>
		</p>
		<p>
				<font size="2">ct_sendpassthru(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect<br />CTLIB Message: - L5/O3/S5/N5/5/0:</font>
		</p>
<img src ="http://www.blogjava.net/os586/aggbug/135077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-08-07 21:25 <a href="http://www.blogjava.net/os586/archive/2007/08/07/135077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 我再一次把你拾起</title><link>http://www.blogjava.net/os586/archive/2007/07/05/128440.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 05 Jul 2007 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/07/05/128440.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/128440.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/07/05/128440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/128440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/128440.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">最早经手sybase数据库是在电力上使用，那时对这东西很是模糊。因为我只要配置一下自己的客户端连结使用就可以了。而较为系统较为全面的使用还是在以前的一个金融项目中使用。<br /><br /><br /><br />当时对有些东西只是刚刚接触，特别是对设备(主设备，日志设备，转储设备。。)，segment，最恼人的就是sybase的数据库日志问题导致的数据库服务起不来的问题。那时，有一全套手册，真是大补。感觉对这东西有了些较为全面的了解。但是一段时间后，我因为工作关系转到oracle上来了。当时，感觉到非常的失望，公司里不使用sybase，因此又要全新的学习oracle.好在，公司内部还是有一些老项目使用了sybase,呵呵，可以有用武这地了.......<br /><br /><br /><br />这次重新拾起，是因为我经手的这个项目是在sybase上使用，而且这台服务器上有很多数据库了。<br />仔细看了一下，未知管理员配置的数据库服务器，感觉还是不错的。<br /><br />为了使我经手的项目能够顺利的走下去，我还是又拿出了我的全套手册!<br /><br />因此，借用javablog.net我会发一些sybase的一些文章。<br /><br />我会把一些相关的数据库文件链接至此!</font>
		</p>
<img src ="http://www.blogjava.net/os586/aggbug/128440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-07-05 21:13 <a href="http://www.blogjava.net/os586/archive/2007/07/05/128440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 数据库默认设备的更改</title><link>http://www.blogjava.net/os586/archive/2007/07/04/128191.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 04 Jul 2007 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2007/07/04/128191.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/128191.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2007/07/04/128191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/128191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/128191.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">为了防止用户数据库被分配到数据库系统主设备 master 上，应该在安装完数据库后修改默认设备—安装完 sybase ASE 后，master 是唯一的默认设备。Sybase 建议，master 设备只应该提供给系统数据库而不是用户数据库。因此，对于用户数据库，我们应当单独创建设备，并且把用户设备设置成默认状态。<br /><br /><br /><br />  比如我们可能要建立几个用户数据库设备：userData,userLog<br /><br />  首先我们需要先取消master的默认设备：<br /><br /><br /><br />    sp_diskdefault "master","defaultoff"<br /><br />    go<br /><br />    sp_diskdefault "userData","defaulton"<br /><br />    go<br /><br />    sp_diskdefault "userLog","defaulton"<br /><br />    go<br /><br />　　在后面创建用户数据库的过程中，如果不指定数据库设备，则该用户数据库理所当然地创建在默认设备。<br /><br />　　创建数据库：本数据库创建在设备 userData 上，而在分开的设备（userLog）上创建数据库日志。<br /><br />　　1&gt;create database mydatabase //创建一个名为 mydatabase 的数据库<br />　　2&gt; on userData = “50M” //数据库的存储空间为 50M，数据库设备是 userData，而不是 master<br />　　3&gt;log on userLog =”10M” //日志文件的存储空间为 10M<br />　　4&gt;go<br /><br /><br /><br /><br /></font>
		</p>
<img src ="http://www.blogjava.net/os586/aggbug/128191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2007-07-04 22:01 <a href="http://www.blogjava.net/os586/archive/2007/07/04/128191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sybase数据库中分离日志与数据文件</title><link>http://www.blogjava.net/os586/archive/2006/09/30/72964.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Sat, 30 Sep 2006 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/30/72964.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/72964.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/30/72964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/72964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/72964.html</trackback:ping><description><![CDATA[
		<p>详细步骤，已测试成功 </p>
		<p>1、备份数据库，包括 master 和你要分离数据与日志的应用库,最好是备份所有数据库；</p>
		<p>2、检查数据库的日志是否有单独的存放设备，如有，则直接到第５步；</p>
		<p>3、如没有单独的日志设备，则增加一个设备：disk init .....；</p>
		<p>4、alter database db_name log on new_log_device=xxx；</p>
		<p>5、sp_logdevice dbname,new_logdev (移动日志设备)；</p>
		<p>6、sp_dropsegment logsegment, db_name, device_name (如果数据库有多个设备既放数据又放日志，则要相应的运行几次；</p>
		<p>7、创建一个临时表，然后往里面插入足够的数据，然后截断日志；</p>
		<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed">
				<span>use </span>
				<span>db_name</span>
				<span>go</span>
				<span>create </span>
				<span>table</span>
				<span> t1 (id </span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">int)<br /><br />go</span>
				<span>
				</span>
				<span>declare </span>
				<span>@loop int</span>
				<span>select </span>
				<span>@loop</span>
				<span>= </span>1						<br /><span></span><span><br /><br /><br /><br /><br />while</span><span>(</span><span>@loop</span><span>&lt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">500</span><span>)<br /><br />b</span><span>egin<br /><br /></span><span>insert</span><span> t1 </span><span>values</span><span>(</span><span>@loop)<br /><br /></span><span>select </span><span>@loop </span><span><a href="mailto:=@loop																		+																		1														"><font color="#000000">= </font></a></span><font color="#000000"><span>@loop </span><span>+ </span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span></font><br /><span><br />end<br /><br /></span><span>go<br /><br /></span><span>dump </span><span>tran </span><span>db_name </span><span>with </span><span>truncate_only<br /><br /></span><span>go</span></pre>
		<p>8、到此，数据与日志的分离已经完成，使用sp_helpdb db_name或sp_helplog查看是否已分离。</p>
		<p>增加和删除 segment 并不移动当前的已分配空间。日志至少有一个扩充（extend）位于以前的 segment 上（还记得吗，为对象分配存贮单元时，实际是以 extend 为单位的。）。如果当前 extend 被填满，需要再为日志分配时，ASE会在新的 segment 上分配（segment 约束它不得不这么做）。此时，截断日志就可以回收以前分配的 extend 了。最后，还是要备份所有数据库.</p>
<img src ="http://www.blogjava.net/os586/aggbug/72964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-30 10:29 <a href="http://www.blogjava.net/os586/archive/2006/09/30/72964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 数据库用户管理的一些基本概念</title><link>http://www.blogjava.net/os586/archive/2006/09/29/72728.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 29 Sep 2006 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/29/72728.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/72728.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/29/72728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/72728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/72728.html</trackback:ping><description><![CDATA[
		<p> </p>
		<p> 1.sybase 的登录用户与数据库用户.</p>
		<p>   刚开始使用sybase的时候感觉到很纳闷,经常使这两者混淆.但是后来发现,它们这两个是有很大区别的.</p>
		<p>   Sybase必须在创建登录用户后,这用户以一个合法的身份进入了sybase server,同时该登录用户信息会放</p>
		<p>进master数据库的syslogins表中.</p>
		<p>   但是只有注册用户成为某一数据库用户,并且对该用户赋予某些权限时,该注册用户才能在限制条件下使</p>
		<p>用数据库当中的表.</p>
		<p>   通常我都是这样理解的:</p>
		<p>   首先我们需要在Sybase当中注册登录:</p>
		<p>     sp_addlogin loginame,password,defaultdb</p>
		<p>   接下来:我们首先要打开你要登录的数据库,然后进行组或者是用户的注册</p>
		<p>     use dbname<br />     sp_addgroup grpname</p>
		<p>     sp_adduser loginame,name-in-db,grpname</p>
		<p>     这样该用户就可以访问某一数据库了了,同时我们可以通过grant对其进行权限或者是角色的给予.</p>
		<p> </p>
		<p>2.Sybase 数据库用户分类:</p>
		<p>    一般在sybase当中可以分为如下四种用户: sa用户,数据库属主,数据库对象属主,数据库普通用户.</p>
		<p>    sa用户在sybase 中为最高等级用户,所有命令都可以执行.</p>
		<p>    数据库属主(dbo):用户可以对本数据库中所有对象(表,视图,存储过程等)进行操作,一般有三种途径创建</p>
		<p>      一是系统管理员的用户<br />      二是系统管理的用户将创建数据库的权限赋予某个登录用户,由该用户进行数据库的创建后,自然形成</p>
		<p>对数据库属主.<br />      三是系统管理员的用户创建数据库后,将某个sybase中登录用户变为数据库的属主.</p>
		<p>    数据库对象属主为创建该对象的用户,在实际的数据库的管理中,一般为数据库属主.数据库普通用户必</p>
		<p>须在数据库属主对本数据库中某些对象(表,视图,进程)赋予某些权限时,才可以对本数据库中某些对象进行</p>
		<p>允许的操作.几者的关系是相互包含的.数据库管理员的用户在进入某个数据库后,自然成为该数据库的属主</p>
		<p>,数据 属主可看作为特殊的数据库普通用户.</p>
		<p>
				<br />3.别名 与  组</p>
		<p>   别名 与组在数据库管理中是经常用到的,它能简化数据库用户管理.方便对用户的监控.<br />   别名即将sybase中的登录用户以同一个数据库用户的身份来访问数据库,并且具有与该用户相同的权限.<br />   也就是说,在数据库中只要建立一个数据库用户,对该数据库用户各种操作定义好,并使sybase中已经定义</p>
		<p>好注册用户成为该数据库用户的别名用户后,即拥有与该用户相同的权限.这样一来，注册用户不必成为数</p>
		<p>据库的用户即可访问数据库，对所有别名用户的权限的控制只需通过对一个数据库用户的控制达到</p>
		<p>.如：有一SQL SERVER名为TEST.SER，有一名为EXAMPLE的数据库，其中有一名为OK的表，当系统管</p>
		<p>理员为TEST.SER创建名为JOHN和KATE的注册用户，EXAMPLE的数据库中有一名为OK_SELECT的数据</p>
		<p>库用户，该数据库用户有对OK表的查询权限。将JOHN和KATE这两个注册用户变为OK_SELECT的别名后</p>
		<p>，JOHN和KATE即可进入数据库，并拥有与OK_SELECT的数据库用户相同的权限。组（group）为数据库</p>
		<p>用户的集合，即通过对组(group)的权限的控制达到对该组中数据库用户的控制，但也可对该组中数据库</p>
		<p>某些用户进行格外的权限控制。在上例中的EXAMPLE的数据库中有一OK_INSERT的组，它对OK的表有插</p>
		<p>入的权限，数据库中有两个用户：MARRY和KITY，当这两个用户加入到OK_INSERT组后，MARRY和</p>
		<p>KITY就有对OK表的插入的权限。对MARRY和KITY相同的权限操作可通过对OK_SELECT组的控制可得。</p>
		<p>而使MARRY对OK表有查询权限，仅对MARRY用户赋权即可。而别名则不行。  </p>
		<p>四、SYBASE SQL SERVER的角色  <br />一般在管理分工较细的数据库系统中，sa用户往往被分为三种角色：系统管理员角色(SA role)系统安全员</p>
		<p>角色(SSO role)、操作员角色（OPER role）。sa用户往往被锁住，其权力被以上三种角色所瓜分。这三种</p>
		<p>角色将分别用不同的数据库注册用户承担。因三种角色任务较多，所以不一一介绍。  </p>
		<p>SYBASE SQL SERVER 的用户管理是很复杂的，但首先掌握以上的内容，便对掌握SYBASE SQL SERVER</p>
		<p>的用户管理有了一定的基础。</p>
<img src ="http://www.blogjava.net/os586/aggbug/72728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-29 10:02 <a href="http://www.blogjava.net/os586/archive/2006/09/29/72728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 精华问题整理 [转摘于ChinaUnix.net-Sybase论坛]</title><link>http://www.blogjava.net/os586/archive/2006/09/28/72481.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 28 Sep 2006 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/28/72481.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/72481.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/28/72481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/72481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/72481.html</trackback:ping><description><![CDATA[
		<font size="2">1) 关于定时备份<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1233&amp;show=390<br />crontab 中可以这样写：<br />00 23 * * * /sybase/ASE-12_0/bin/DUMPDB.sh &gt;;&gt;;/sybase/ASE-12_0/install/DUMPDB.out<br /><br />放那里都无所谓，一个dumpdb.sh的例子：<br />#SUN Solaris 8<br />#!/bin/ksh<br />export SYBASE=/sybase<br />export SYBASE_FTS=FTS-12_0<br />export PATH=/sybase/ASE-12_0/bin:/sybase/OCS-12_0/bin<img src="http://bbs.chinaunix.net/images/smilies/shy.gif" align="absMiddle" border="0" />PATH:/sybase/ASE-12_0/install:/usr/sbin<br />export SYBASE_OCS=OCS-12_0<br />export SYBASE_ASE=ASE-12_0<br />export LM_LICENSE_FILE=/sybase/SYSAM-1_0/licenses/license.dat<img src="http://bbs.chinaunix.net/images/smilies/shy.gif" align="absMiddle" border="0" />LM_LICENSE_FILE<br />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<img src="http://bbs.chinaunix.net/images/smilies/shy.gif" align="absMiddle" border="0" />LD_LIBRARY_PATH<br />export SYBASE_SYSAM=SYSAM-1_0<br />export HOME=$SYBASE <br />$SYBASE_OCS/bin/isql -Usa -SSYBASE -P &lt;&lt;!<br />dump database YOURDBNAME to "/sybdump/dump.01"<br />                stripe on "/sybdump/dump.02"<br />                stripe on "/sybdump/dump.03"<br />                stripe on "/sybdump/dump.04"<br />                stripe on "/sybdump/dump.05"<br />go<br />! <br />这里是一个典型的脚本，用于实现full备份！ <br />#!/usr/bin/sh <br /># *************************************************************************<br />#for full backup after excuted dbcc operation<br /># *************************************************************************<br />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/<br />lib<br />export SHLIB_PATH <br />SYBASE_OCS=OCS-12_0<br />export SYBASE_OCS <br />SYBASE=/opt/sybase<br />export SYBASE <br /><br />ISQL="/opt/sybase/OCS-12_0/bin"<br />ymd=`date +%y%m%d`<br />bk_user="unb"<br />bk_pwd="******"<br />bk_db="SYB_HP" <br />cd /sybase/backup<br />mkdir $ymd<br />LOG="/sybase/backup/$ymd"<br />echo $ymd &gt;;$LOG/backup.log<br />echo "\n11*************************" &gt;;&gt;;$LOG/backup.log<br />echo "Check database $bk_db..." &gt;;&gt;;$LOG/backup.log<br />d1=`date`<br />su - sybase -c "isql -SSYB_HP -Usa -P****** &lt;&lt;DBCC &gt;;$LOG/dbcc-$ymd.log 2&gt;;&amp;1<br />dbcc traceon(3604)<br />go<br />dbcc checkdb($bk_db)<br />go<br />dbcc traceoff(3604)<br />go<br />DBCC<br />echo $d1,`date` &gt;;&gt;;$LOG/backup.log <br />echo "\n22*************************" &gt;;&gt;;$LOG/backup.log<br />d1=`date`<br />dump_file="/sybase/backup/$dump-unb-full-$ymd.dat"<br />echo "Dump database $bk_db to " $dump_file &gt;;&gt;;$LOG/backup.log<br />su - sybase -c "isql -SSYB_HP -Usa -P****** &lt;&lt;DUMP &gt;;$LOG/dump-$ymd.log 2&gt;;&amp;1<br />dump database $bk_db to "$dump_file"<br />go<br />DUMP<br />echo $d1,`date` &gt;;&gt;;$LOG/backup.log <br />echo "\n33*************************" &gt;;&gt;;$LOG/backup.log <br />请根据自身系统，调试后再使用！ <br />至于备份日志的脚本与此类似，自己根据sybase的相关语法，稍加变动即可！ <br /><br /><br /><br />2) 有个关于游标的问题，请教各位大虾　<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=429&amp;show=390<br />在sybase数据库中用游标操作完表a的记录后，关闭close游标，在free游标。但接着想drop此表a，结果失败，显示的错误信息是"游标在使用"（记得不是很清楚了，大概是这个意思）。<br />请碰到过这类问题的大虾支持支持。在informix和oracle中释放游标是用free，在sybase也是用free吗？<br /><br />sybase 中正确操作游标的顺序是：<br />1、DECLARE CUR_ACCTINFO CURSOR FOR SELECT .....    （定义） <br />2、OPEN CUR_ACCTINFO                               （打开）<br /><br />3、WHILE @@SQLSTATUS = 0                            （判断是否成功）<br />BEGIN<br />             <br />4、         FETCH CUR_ACCTINFO INTO  .......     （取数据）<br />          IF @@SQLSTATUS  &lt;&gt;; 0<br />begin<br />                    ......<br />end<br />           ........... <br />5、 CLOSE CUR_ACCTINFO               （关闭）<br />6、 DEALLOCATE  CURSOR CUR_ACCTINFO  （释放） <br /><br /><br />3) 在sybase中有没有进行数据类型转换的函数　<br />  http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1346&amp;show=330<br /><br />四舍五入用round,如round(123.4567,1)=123.5或round(123.4567,0)=123或round(123.67,0)=124<br />去尾用floor,如floor(123.4567)=123<br />进尾用ceiling,如ceiling(123.4567)=124 <br /><br /><br />4) 新手问题：为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊！？<br />  http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1335&amp;show=330<br />为什么我的SYBASE的RUN_BACKUP老是自己DOWN啊！？<br />我用NetTerm登陆运行，但只要一退出NetTerm，BACKUP就自己DOWN了<br />加&amp;运行也不行，怎么办啊？<br /><br /><br />命令前加nohup 试试 <br /><br />那是因为你的backup进程是以你的登录用户起动的,所以当该用户退出unix时,<br />进程也跟着退出操作系统了<br /><br />5) 什么是BYPASS RECOVERY mode？　<br />  http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1371&amp;show=300<br /><br /><br />在客户端出现提示：<br />Attempt to BEGIN TRANsaction in database "****" failed because database is in BYPASS RECOVERY mode.<br />请问如何解决？ <br /><br /><br />select name,status from master..sysdatabases where db_name="你所说的数据库"<br />看status是否是-32768 ,若是,sysdatabases系统表相应记录的status字段改为0，reboot数据库服务器就可以了。<br /><br />谢谢各位，问题已解决。中午去SYBASE网站查找到有关这个问题的详细信息，包括问题成因及解决办法： <br />Error 3908<br />Severity <br />16 <br />Error Message <br /><br />Attempt to BEGIN TRANsaction in database '%.*s' failed because database is in BYPASS RECOVERY mode. <br />Explanation <br />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). <br />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. <br />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. <br />Error 3908 is raised in the following states: <br /><br /><br /><br />State Meaning <br />1 Attempted to start a transaction when the database is not available for update. Applies to all possible transaction types. <br />2 Attempted to start a subordinate transaction when the database is not available for update. <br />Action <br />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. <br />Use the following steps to reset the database status: <br />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. <br /><br />1. Reset the database status to 0:<br />1&gt;; sp_configure "allow updates", 1 <br />2&gt;; go <br />1&gt;; begin tran <br />2&gt;; go <br />1&gt;; use master <br />2&gt;; go <br />1&gt;; update sysdatabases set status=0 where name=&lt;database_name&gt;; <br />2&gt;; go <br />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: <br />1&gt;;commit tran <br />2&gt;;go <br />1&gt;;shutdown with nowait <br />2&gt;;go <br />2. Restart Adaptive Server. Run dbcc checkdb and dbcc checkalloc on the affected database to make sure there are no errors. <br />Version in Which This Error is Raised <br />All versions. <br />再次谢谢aladdin，freebob，changing。<br />6) 数据库表BCP出来报错　<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1326&amp;show=300<br />数据库表BCP出来报错<br />DB-LIBRARY error<br />I/O error while writing bcp data-file<br />bcp出来的文件正好2GB，实际应该更大。<br />操作系统SCO OpenServer5.0.4, SYBASE 11.0.3<br />请问是何原因？谢谢。<br />当在后备数据量大于2GB的数据库时，可能会遇到以下错误： <br />I/Oerror: <br />operating system error,server device /backup/data. code 27 messages <br />file too large. <br />　　这是由于后备文件的大小超出了操作系统的用户最大文件限制。而有些操作系统不支持大于2GB的文件，这时可以使用Backup Server将一个数据库后备到多个文件中。 <br />　　1&gt;;dump database pubs2 to "/usr/sybase/pubs2_dump.1" <br />　　2&gt;;stripe on "/usr/sybase/pubs2_dump.2" <br />　　3&gt;;stripe on "/usr/sybase/pubs2_dump.3" <br />　　4&gt;;go <br />　　这种方法还可以提高后备及恢复的速度，但注意恢复也必须用相应多的设备。例如： <br />　　1&gt;;load database pubs2 from "/usr/sybase/pubs2_dump.1" <br />　　2&gt;;stripe on "/usr/sybase/pubs2_dump.2" <br />　　3&gt;;stripe on "/usr/sybase/pubs2_dump.3" <br />　　4&gt;;go <br /><br />7) sybase的sa口令丢失怎样恢复？　<br />  http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1239&amp;show=270<br />在RUN-SERVER文件中加入一行-psa，重起dataserver，在控制台上可以看见新的口令 <br />http://www.powerba.com/develop/database/sybase/article/20010505001.htm<br /><br />sybase表中如何删掉多条相同的记录？　<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1438&amp;start=0&amp;show=180<br />sybase表中如何删掉多条相同的记录？<br />由于表出问题，将没有进行处理的*.txt文件bcp到表中，其中含有大量的重复记录。<br />请问有没有办法将表中重复的记录删掉呢？<br /><br />那好办，那你就可以使用下面语句将唯一的记录先插入到临时表中：<br />select distinct a ,b,c,d ... into tempdb..tempdb_table from tablename<br />然后清空原表，把临时表中的数据插入正式表中！<br />试试看 <br /><br />可以参考这种经典方法：<br />1---select * into tmp_tab from your_dup_tab where 1=2<br />2---若表无唯一性索引则建一个唯一性索引（一定能找到一个唯一性的索引建（复合索引））create unique index(列名1，列名2...) on tmp_tab with ignore_dup_key.<br />3----insert into tmp_tab from your_dup_tab<br />这样在新表中将自动删出重复记录。但数据量过大请留意日志空间（sp_spaceused syslogs）.<br />很使用的方法.try it!<br /><br />9) 关于阀值<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1231&amp;show=180<br />发告警或者水自动溢出，以保护系统不至于达到危险境界。对于数据库而言，我们使用的存储设备毕竟有限，如果任由数据或日志增长，数据或日志日久天长终将占用所有存储设备，如果到了没有空间的时候，系统将挂起，这样业务将暂停。所以对于一些要求数据库可用性很高的系统，必须保证在可预见的情况下数据段或者日志段不至于没有空间！为做到这一点，传统的数据库一般都需要系统维护人员经常的定期的进行数据库检查，若数据段不够了，转储一部分数据或者增加一些设备，若日志空间不够了，转储日志！但这样系统管理员就有点累了！<br />为减轻系统管理员的负担，提高系统的自动化程度，sybase提出了用阀值进行自动管理的这样一种模式，只要在开始定义好各段的阀值，以及达到阀值后的处理存储过程，就可以实现自动管理了！<br />不过，我先前也想这样做，也研究了一阵子，但是后来还是放弃了这种懒惰的办法。因为使用阀值管理可能出现一些意想不到的问题，什么问题现在还没想到，只是sybase不推荐在大系统中这样做！再加上本身系统有omni back备份软件，何必自找麻烦呢！<br /><br />10) 什么SYBASE安装完后要增加TEMPDB的空间？<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1444&amp;show=180<br />扩展后sp_helpdb tempdb看应改master设备上是data/log的<br />你use tempdb<br />sp_dropsegment 'default',tempdb,master<br />sp_dropsegment system,tempdb,master<br />sp_dropsegment logsegment,tempdb,master<br />后，<br />sp_helpdb tempdb<br />select db_name(dbid),segmap,lstart,size,vstart,pad,unreservedpgs<br />from sysusages<br />where dbid=2<br />贴出来<br />如果第一行中segmap为0,就ok<br /><br /><br />你们回答的什么，驴唇不对马嘴（呵呵，开玩笑）<br />一般情况下数据库装好之后，都要给tempdb增加空间，因为在用户数据库中的很多插入，删除等操作需要用到tempdb数据库作为临时存储空间，所以要增大他的空间，否则可能你的事务不能执行 <br /><br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=185&amp;show=120<br /><br />sybase 临时数据库 <br />缺省情况下，tempdb数据库是放置在master设备上，容量为2M，而临时数据库是活动最为平凡的数据库常常被用来排序、创建临时表、重格式化等操作，所以tempdb的优化应该受到特别的关注。本篇文章目的在于使你掌握临时数据库的优化策略以及临时表的优化使用。本文中，你将以调整临时库的位置开始，有步骤的完成临时数据库的优化，并在此过程中了解到优化临时数据库和临时表的一些方法和规则。<br />实验环境的要求：你应具有系统管理员的权限，系统中有auths和article表。<br />步骤：<br />第一步：调整临时库的位置<br />　　tempdb数据库缺省放在master设备上，将临时数据库发在分离的设备上是更可取的。<br />1）  初始化一个用来存放临时数据库的设备<br />disk init<br />name="tempdb_dev",<br />physname="d:\sybase\example\tempdb.dat",<br />vdevno=13,<br />size=15360<br />(注意：如果将tempdb数据库放在多个设备上，需初始化多个数据库设备)<br />2)将临时数据库扩展到该一个设备上<br />  alter database tempdb on tempdb_dev=30<br />3)打开tempdb数据库，从段上删除master设备<br />sp_dropsegment "default",tempdb,master<br />sp_dropsegment logsegment,tempdb,master<br />4)发出如下命令，检查default段中是否不再包含master设备<br />     select dbid,name,segmap from sysusages,sysdevices<br />where sysdevices.low&lt;=syusages.size+vstart<br />and sysdevices.high&gt;;=sysusages.size+vstart-1<br />and dbid=2<br />and(status=2 or status=3)<br />说明：若将临时数据库放在多个磁盘设备上，可以更好的利用并行查询特性来提高查询性能。<br />第二步：将临时数据库与高速缓冲进行绑定。<br />　　由于临时表的创建、使用，临时数据库会频繁地使用数据缓存，所以应为临时数据库创建高速缓存，从而可以使其常驻内存并有助于分散I/O：<br />1、创建命名高速缓存<br />sp_cacheconfig “tempdb_cache","10m","mixed"<br />2、重新启动server<br />3、捆绑临时数据库到tempdb_cache高速缓存<br />sp_bindcache “tempdb_cache", tempdb<br />4、若有大的I/O，配置内存池<br />第三步：优化临时表<br />   大多数临时表的使用是简单的，很少需要优化。但需要对临时表进行复杂的访问则<br />应通过使用多个过程或批处理来把表的创建和索引分开。以下两种技术可以改善临时表的优化<br />slash;         在临时表上创建索引<br />1）  临时表必须存在<br />2）  统计页必须存在（即不能在空表上创建索引）<br />slash;         把对临时表的复杂的使用分散到多个批处理或过程中，以便为优化器提供信息<br />下面的这个过程需要进行优化：<br />create proc base_proc<br />as<br />select * into #huge_result from auths<br />select * from article, #huge_result where article.author_code=<br />#huge_result.author_code and sex="0"<br />使用两个过程可以得到更好的性能<br />1）create proc base_proc<br />as<br />select *<br />into #huge_result<br />from auths<br />exec select_proc<br />2)  create proc select_proc<br />     as<br />select *       from article,#huge_result<br />where  article.author_code=#huge_result.author_code and sex="0"<br />说明：在同一个存储过程或批处理中，创建并使用一个表时，查询优化器无法决定这个表的大小。<br />结论：通过本实验我们知道，临时数据库经过优化可以极大的提高系统性能。实际工作中，必须考虑具体应用的情况，需长时间经验的积累。<br /><br />11) 怎样利用脚本自动关闭sybase数据库　<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1484&amp;show=180<br />不知你什么平台，如果是unix,ksh<br />#!/bin/ksh <br />LOGIN="`whoami`"<br />if [ "${LOGIN}" != "sybase" ]; then<br />echo "`basename $0`: You should login as 'sybase'\n"<br />exit 0<br />fi <br />echo "\n\n"<br />{<br />isql -Usa -P -Syourservername &gt;; /dev/null 2&gt;;&amp;1 &lt;&lt;ISQL<br />use master<br />go<br />shutdown SYB_BACKUP<br />go<br />shutdown<br />go<br />ISQL<br />}<br /><br />12) 请教存储过程动态使用表　<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1488&amp;show=180<br />你指动态sql<br />要12.0版本以上才支持<br />CREATE PROCEDURE dbo.mytt <br />(@c varchar(25))  <br />AS <br />  BEGIN <br />declare @cc varchar(25)<br />select @cc = "select * from " + @c<br />exec (@cc)<br />  END<br /><br />13) sybase中的跨库操作<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1489&amp;show=150<br />假如本机server为loc_server,远程server为re_server <br />在这两个server 各自的interface文件里都必须有定义<br />sp_configure "allow remote access"是否为1; <br /><br />在本机server上：<br />sp_addserver re_server<br />sp_addserver loc_server,LOCAL ---&gt;;这样你select @@servername就有东西<br />在remote server 上：<br />sp_addserver loc_server<br />sp_addserver re_server,LOCAL <br />在2个server 上<br />sp_addremotelogin ...... <br />检查这两个参数<br />number of remote sites <br />number of remote connections . <br />然后：<br />如果isql从loc_server 到rs_server<br />connect to rs_server<br />disconnect <br />rs_server...sp_who在loc_server上执行rs_server 上的sp_who<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1560&amp;start=15&amp;show=90<br />这里给你提供一篇这方面的资料：<br />如何实现两个Sybase Adaptive Server之间的数据通信 <br />在进行以Sybase作为后台数据库的MIS系统开发时，经常会碰到需要在两个Sybase Adaptive Server之间进行数据通信的问题。要解决这一问题通常由两类方法：其一便是在前台来做；这种方法一般是通过建立多个事务，分别连接到不同的Server，在应用程序中通过编程实现数据的交换。这种方法的缺点在于可维护性差，还有一点是由于需要多个事务肯定也会影响效率。另外一类方法就是利用Sybase 的Transact SQL在后台来做。这类方法把数据的通信工作交给了SQL服务器自己去做。这种方法显而易见的一种有点便是可维护性好，当业务发生变化或服务器设置改变时可以很少修改大部分情况是不用修改应用程序。下面举一个简单的例子来介绍一下如何利用Transact SQL在后台实现SQL服务器之间的数据通信。 <br />---- 假设有两台操作系统都是Windows NT的Sybase SQL服务器LocalServer、RemoteServer，两者能够相互访问即应是通过网络相连的；在LocalServer和RemoteServer上分别有数据库LS_database和RS_database；在数据库LS_database和RS_database里分别有表LS_table和RS_table。 <br />---- 假设现在业务规则是当LS_table更新时需要更新RS_table。 <br />---- 要实现这种业务逻辑首先需要在RemoteServer的RS_database里建立至少一个带参数的存储过程设为pro_upd_rst，用来更新RS_table；其次需要在表LS_table上建立三个触发器：设为update_rst、delete_rst和insert_rst，在这些触发器中调用RS_database中的存储过程。即采用触发器传递参数进行远程存储过程调用(Remote Procedure Calls)的技术来实现。当LS_table发生更新时触发器update_rst、delete_rst和insert_rst中有一个会被触发，通过临时表inserted和deleted能够得到更新的信息，赋给相应变量，传递参数给pro_upd_rst并调用之。 <br />---- 需要提到的一点是Sybase数据库的缺省安装并没有设置RPC，所以还要对LocalServer进行一些设置工作，这一点比较有必要强调尤其是对于初学者来说。这些设置工作主要有以下几点： <br />运行LocalServer接口程序管理器Dsedit添加一个Server，Server Name设置为"RemoteServer"(可以是其他字符串)，编辑Server Address，添加网络协议和端口号，通常选择TCP/IP协议，Network Address 设为"RemoteServer,5000"，其中RemoteServer（这里指的是该服务器在网络中的机器名）可以用其IP地址来代替。试一试能否Ping通RemoteServer。Ping通后进行下面的工作。 <br />在LocalServer添加一个远程服务器，可以通过运行LocalServer的Sybase Central，打开LocalServer的"remote servers"文件夹，双击"Add Remote Server"，在编辑框内输入一个字符串设为"Remote_Local"(注意区分大小写)，在下面的下拉列表框中选择"RemoteServer"（这是第1步中的Server Name），点击下一步后在列表框中选择"sql_server"完成。 <br />重新设置LocalServer一些与RPC有关的参数，也可以通过Sybase Central。右键点击LocalServer，单击谈出菜单的"configure"，在下拉列表框种选择"Component Integration Services"，注意下面的两个参数"cis rpc handling" 和 "enable cis"，这两个参数的缺省值都是"0"，应该把它们都改为"1"。由于"enable cis"是静态参数所以修改后需要重起数据库才能生效。最后最好检查一下RemoteServer的"enable remote access"参数的值是否为"1"(缺省情况应该是"1"<img src="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" align="absMiddle" border="0" />否则改为"1"。 <br />---- 其中第1步可以通过编辑接口文件sql.ini（在Sybase根目录的"ini"子目录下）来代替，打开sql.ini在最后加入如下三行： <br />[RemoteServer] master=TCP,RemoteServer,5000 query= TCP,RemoteServer,5000 <br />        保存并关闭。 <br />---- 第2、3步可以通过系统存储过程"sp_configure"来代替，在SQL Advantage或isql中执行下列语句： <br />sp_addserver Remote_Local,null,RemoteServer <br />        go sp_configure "enable cis",1 go sp_configure "cis rpc handling",1 <br />        go <br />---- LocalServer配置号以后应该测试一下，运行SQL Advantage或isql连接LocalServer执行下列语句"exec Remote_Local.master.dbo.sp_help"，再次强调一点其中的Remote_Local区分大小写。 <br />---- 上面所举的只是一个简单的例子，只能在LocalServer上调用RemoteServer上的存储过程，若要在RemoteServer调用上LocalServer上的存储过程则要在RemoteServer进行同样的设置(添加Remote Server、重新配置RemoteServer的参数等)，并且要保证LocalServer的"enable remote access"的值为"1"。 <br /><br /><br />14) ASE在windows xp/2000上安装的二个注意的问题<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1522&amp;show=150<br />本人近日在Windows xp上安装Sybase ASE12.5开发版作学习之用。遇到了一点麻烦，现将解决办法介绍给大家参考，如有还有类似的问题可联系我：email: learun@hotmail.com <br />一、ASE12.4 在XP下中文乱码解决办法： <br />  查看注册表，在键：key_local_machine\software\microsoft\windows NT\CurrentVersion\CurrentVerison中，可知当前系统版本为5.1 <br /><br />  进入Sybase源安装目录，查看run.bat文件，找到一行：set JAVA_HOME=.\shared-1_0\jre1.2.2,<br />然后进入: .\shared-1_0\jre1.2.2\lib目录，将文件font.properties.zh.NT4.0的名称改为font.properties.zh.NT5.1即可。如果源目录在光 <br />盘上，将jre1.2.2目录、run.bat文件拷到硬盘上，修改run.bat中的JAVA_HOME项，然后运行run.bat. <br /><br />安装后，基于中文的管理工具依然会出现乱吗，按上面的方法更改%sybase%\shared-1_0\jre1.2.2\lib中的font.properties.zh.NT4.0文件 <br />名。 <br />一些windows操作系统的版本号： <br />windows9898<br />windows nt4nt4.0<br />windwos 2000nt5.0<br />windows xpnt5.1 <br /><br />二、网络地址 <br />安装过程中，需要配置sql server和sybase xp server的网络地址。在安装界面上，对网络地址没有什么说明，如果输入错了，也没什么提 <br />示。它其实与协议类型有关，如果是TCP协议，它的构成为：机器名（或IP地址）, 端口号。例如：myserver,9001 。在安装后也可以用 <br />“Dsedit"来编辑。网络地址很重要，如果错了，服务器无法启动。 <br />另：当启动信息中含有：in module 'e:\rel12501\porttree\svr\sql\generic\ksource\strmio\n_winsock.c' 。不必为这句话迷惑，这是 <br />Sybase程序的硬编码输出，与你的E盘有无此文件无关。 <br />15) 关于数据库锁<br />http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1118&amp;show=120<br />SYBASE 11.9以上的版本提供行级锁。<br />锁类型选择的确是sybase数据库设计的一个需要重要考虑的问题！见大家讨论的如此火热，特上点干材支持一把，来点关于lock的借介绍性资料！ <br /><br />所支持的加锁机制 <br />2.1 全页加锁 <br />　　全页加锁既是一个新术语，它又是由ASE（Adaptive Server Enterprise）在过去所支持的一种加锁类型。这种类型有下列特性： <br />对所有可被访问的页面在页面级加锁 <br />当各种类型的页面以任何方式发生改变时，对这些排它性的页面进行加锁；而且这种加锁机制一直保持到该事务终止； <br />当下一个所需的页面已经成功地获得，对那些已经释放的的当前访问页进行共享页面加锁(如果采用了第三层ANSI隔离，则把这种加锁机制保持到该事务终止为止) <br />采用页级时间印记（timestamp）以确定是否发生改变，详细信息记录在事务日志中，以便在系统恢复时以向前或向后方式使用。 <br />　　这种加锁方式常常提供性能最高的解决方案，特别是当应用设计时已经考虑了这些特性时更是如此。但是，有一些应用系统，当发生某些活动时，这种对整个页面进行加锁的方式就可能会对系统性能产生有重大意义的影响。对于那些面对诸如文件系统或其它已经支持更细小尺度加锁机制的数据库厂家产品的一般环境而设计的应用系统而言，这种情况尤其如此。 <br />　　此外，还存在一系列问题，它们要围绕着更加困难的条件进行工作。它们通常要采用更加具有Sybase特性的解决方案。对于商用的应用软件制造厂商而言，对他们是一个挑战，因为这将要求他们必须跨越他们所支持的数据库平台，去完成维护其原代码的工作，而这个工作有相当工作量。在这个领域的基本问题如下： <br />对已经按照升序值创建的非群聚性索引的最末端叶型页面存在着争议 <br />对非群聚性索引的表进行插入和查询时可能发生死锁； <br />在按照群聚性的索引值进行更新和对非群聚性索引的表进行查询访问之间可能发生死锁； <br />在没有作索引的表的最后一行可能发生冲突(尽管对最后的特定地址可以使用分区) ； <br />有可能使行数很少的表之间发生潜在的冲突(尽管对特定的地址可以使用填充因子[ fillfactors]和每页最大行数[ max_rows_per_page]这两个参数) <br />对每个页面两边进行加锁的需要常常被分割开来； <br />如果一个表特别小，以致在一个单一页面中进行驻留，那么对单一行的访问实际上将破坏对整个表的加锁机制。 <br />2.2 仅对数据加锁 <br />　　仅对数据加锁机制试图去解决本文前一节所关注的主要问题(其他的议题将在其它功能领域中加以解决)。这种加锁方式支持两类不同的工作方式： 数据行加锁和数据页加锁。在这两种情况中，对于它们所支持的加锁方式，都与以前的加锁机制有所不同。仅对数据加锁具有下列特性： <br />在索引页面中不会破坏事务加锁。相反，而是采用了一种称之为锁存的机制。锁存是一种类似于旋转锁（spinlocks）的同步方法，它们与事务无关并且只保留很短的周期（一般而言，当一个任务在数据库中物理上改变一小片数据时，这个周期相当于在共享存贮区中在一个2K的页面改变某些字节数据的时间）一旦完成之后，这个任务将直接打开这个锁存。当这种情况还可能临时同其它组块时 ，因为这种锁存不能对服务器任务进行有上下文的切换，也不能涉及死锁，并且只能保持主要的一小段时间，所以它们不能产生有显著意义的争用。 <br />采用一个RID对单一行进行数据行加锁(行标识[RID----Row ID]是逻辑页号与所在页面上该行号的组合)； <br />支持固定的行标识 RIDs, 它可以是向前的，允许不进行其RID的改变，就完成数据行的移动。当一行变大超过了它的可用空间时，采用上述结果对非群聚索引不需要进行任何改变。 <br />不需要进行任何争用就可以在表的尾部进行插入操作，这一功能已经增加进来。. <br />支持采用范围加锁、下一个关键字加锁和无限大加锁等方式对逻辑范围值进行加锁 <br />支持由最顶层操作所导致的页面分割。这些情况直接加以提交，"系统"事务可以导致在更短一点的时间周期里保持分裂的页面处于锁定状态。 <br />　　为了支持这些变化，需要对采用的存贮表结构进行一系列改善。这些改进的主要效果如下： <br />群聚索引现在被存贮为象许多人所熟悉的IBM DB2产品所采用的"放置索引"（"placement indexes."）方式。这种结构类似于非群聚性的索引，需要类似的空间总量。这种修正的结构导致了在数据初始存贮时可以按照顺序跨数据页进行存储，但是当发生插入时，它们就要尽可能紧密存放以便在正确的逻辑页面中不存在页面分割。此外，在数据页中的数据顺序在新行增加时是不进行维护整理的。这种索引的应用使每个群聚化的索引周游增加了一次I/O操作。 <br />行位移表已经增加到索引页和数据页中。这种增加和新的行索引行存贮格式具有使每个索引页面所存贮的索引条目个数减少的潜在能力。 <br />固定行标识（RIDS）。当一行移动时，对于分配新行位置的向前地址被放在用于驻留该行的位置上。当这种移动需要改变非群聚性索引时，对该行的访问需要增加一次I/O操作以得到'向前'的位置。 <br />一般而言，索引将更小和更短，这是因为如下原因： <br />从每个叶级页面中采用双重键限制机制来限制双重键（Duplicate key）例如，如果值"绿"（"GREEN"）在下列行标识（RIDs）值等于123-1，234-2，和345-3的行中, 就分别存贮值“绿”（"GREEN"），123-1，234-2，345-3，而不是存贮值"绿"（"GREEN,"）三次。在每个索引页中每个值只存贮一次。 <br />在非群聚性索引树的非叶型结点中将后缀实行压缩(例如，如果键值是"GREEN"和"HAMILTON"，而在这两个值之间发生分裂，那么就在非页级索引页面中存储"G"和"H"<img src="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" align="absMiddle" border="0" />。<br />2.3 数据页和数据行加锁 <br />　　只对数据加锁机制支持两种方式：数据页加锁和数据行加锁。这些与它们的工作方式和所提供的功能相类似。这两种方式仅在对数据访问产生阻碍作用时，在加锁的尺度上有所区别。在数据页加锁方式下再采用数据行加锁方式具有两种作用（一种起正向作用，另一种起反向作用）。首先，较小尺度加锁机制的使用可能导致减少争用与冲突，然而当大量数据发生变化时，就有可能对加锁产生大量阻碍的情况发生。 <br />2.4 特定使用的加锁类型 <br />　　除非对配置参数加以特定，对所有的表都予置了隐含的全页面加锁机制。 <br />sp_configure 'lock scheme', [allpages | datapages | datarows] <br />　　当数据库从原先版本的服务器中转储出来重新加载时，所有的表都被定义为全页面加锁的表。当建立一个新表时，可以不使用这个缺省值，可采用如下的句法格式： <br />create table &lt;tablename&gt;;… lock [allpages | datapages | datarows] <br />　　为了在使用的一个表中改变加锁类型，可以采用如下的句法格式： <br />alter table &lt;tablename&gt;; lock [allpages | datapages | datarows] <br />　　在一个现存的表中改变加锁方式，将引起下列三种行动后果发生： <br />首先，如果一张表从全页加锁转变为仅对数据加锁，或者从仅对数据加锁转变为全页加锁，在这两种类型之间就要对表进行选择以允许进行存贮格式改变。如果这是一个分区表，就要同时假定必要的并行级别和工作线程已经配置好的情况下，才能执行。 <br />其次, 对表中的群聚性索引必须重新创建。因为我们能保证数据，所以如果从全页加锁方式转换为只对数据加锁时，这种重新创建可以通过"with sorted_data"来完成。然而，当从仅对数据加锁机制转换为全页加锁方式时，就要进行并行的索引创建操作。（请注意：如果这是一个分区表时，那么并行等级和工作线程的数目必须加以配置才能允许进行这种改变，否则这种迁移将会失败） <br />最后，非群聚性的索引将被重建，如果服务器已经为并行处理所加以配置，当进行本步骤时将加以采用。 <br />　　由于这些活动同潜在的工作量有关，从全页加锁机制改变为仅对数据加锁或从仅对数据加锁改变为全页加锁机制都可能是耗费时间的活动。为了标注这一点，有以下一些选择： <br />如果可能的话，应该配置使用并行方式。这至少对执行非群聚性索引的哈斯（杂凑，即hashed）创建方法是必须的，但是如果可能的话，采用分区表和分区扫描将使系统得到更大的改进。 <br />在选择进入和创建群聚性的索引之后，该任务将被设置检查点（checkpointed ）所以，如果有充分的硬件资源，通过允许在任何一个时间点上，检查点任务可以具有多于10个（系统缺省值）的异步I/O请求，利用dbcc进行调谐将能够带来有益的效果。('maxwritedes', number) <br />进一步作为降低使用检查点成本的一种方法，在相关的高速缓冲池（cache pool）、大数据量的I/O操作中，采用对高淘汰程度进行标记的方法，并允许清洁程序（好象家庭主妇一样）保持特别活跃的状态，将为那些检查点需要从高速缓冲池中刷新较"脏"的页面的而增加的I/O操作次数，并因此花费了在检查点上的时间，都能够大大减少作出贡献。 <br />如果预先进行了配置，则可以对并行的选择进入可以使用预先分配的盘区。所以，通过将sp_configure number of pre-allocated extents设置为16也将对系统性能有明显的积极的效果。 <br />　　备注：在仅对数据加锁类型之间进行改变不需要对数据进行备份， 而且执行起来只需很短的一段时间。 <br />[以上为摘自sybase公司站点上的资料] <br />据我个人使用经验，我觉得对于并行性较高的应用要充分考虑使用行级锁，这样对于提高并发性能至关重要！当然，事务都存在利弊两方面，使用行级锁，也会带来一些相应的弊端，比如使用的锁越多，占用的内存也越多，在使用行级锁的表上频繁的进行数据删除、插入操作久而久之会造成数据库碎片的大量生成，数据库性能会下降，这就需要定时进行reorg操作，但该操作比较耗时，且影响业务！<br />16) 请问！怎样设置自动清log,和temp的阀值？<br />  http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=10&amp;topic=1507&amp;show=120<br /><br />一般我们可以为某段设置多个阀值，但只需在达到最后机会阀值时作些空间清理的操作.<br />第一步，在你的数据库中设置阀值，并指定达到阀值后的处理过程： <br />查看当前数据库某段的最后机会阀值：<br />sp_helpthreshold "default"<br />或者察看其他段的信息。<br />修改某段的最后机会阀值：<br />sp_modifythreshold 数据库名,段名,自由空间名,[新过程名[,新自由空间名[,新段名]]]<br />sp_modifythreshold mydb,"default",200,NULL,175<br />将最后机会阀值由200页调整到175页。<br />具体其他操作，可以参考相关手册！ <br />第二步，编写阀值处理过程：<br />create procedure sp_thresholdaction <br />               @dbname varchar(30),<br />               @segmentname varchar(30),<br />        @space_left int,<br />    @status int<br />as<br />       declare @SpaceLeft varchar(20),<br />               @Status varchar(20)<br />       select @SpaceLeft=str(@space_left,6,0)<br />       select @Status=str(@status,6,0)<br />       print "Log is dumpped('％1!' for '％2!',SpaceLeft:'%3!',Status:'%4)',<br />       and is dumped.",@segmentname,@dbname,@SpaceLeft,@Status<br />       dump transaction tempdb to with truncate_only<br />return <br /><br />不过，我还是不建议用最后机会阀值来进行自动维护。 <br /><br /><br /><br />17〉sybase 相关产品的中文显示问题： <br />问： <br />安装Sybase ASE 12.5时，如果是中文字符的话，显示方框字符的乱码，因为安装程序使用java制作，可能与什么有关，我不太懂？ <br />答： 安装前将安装文件中此路径下的：shared-1_0\jre1.2.2\lib\font.properties.zh.NT4.0-&gt;;改为\shared-1_0\jre1.2.2\lib\font.properties.zh.NT5.0 <br />试一下！ <br />我的正版12.5没有出现这个问题，估计你的SYBASE12.5没有打包JRE吧！ <br />补充说明：类似情况在安装　ASEＩＱ　和　ｓｙｂａｓｅ　客户端时视不同操作系统和机器都可能存在这个问题，出现这种情况，就得考虑打补丁或修改ｊｒｅ名字。<br />1<img src="http://bbs.chinaunix.net/images/smilies/icon_cool.gif" align="absMiddle" border="0" /> 如何恢复受损的master数据库<br />　　本实验描述了如何在master数据库毁坏的情况下，如何重建主设备，恢复master数据库，得以重新恢复系统。 <br /><br />这里假定： <br /><br />l Master数据库已损坏，或主设备已损坏。 <br /><br />l有系统表的最新打印输出。 <br /><br />l主设备只包括master数据库、tempdb和model <br /><br />l有master数据库的最新备份，且上次转储master数据库后没有初始化任何设备或创建、变更任何数据库。 <br /><br />关于恢复过程 <br /><br />l将主设备重建为第一次安装服务器时的缺省状态； <br /><br />l将master数据库恢复为缺省状态； <br /><br />l将master数据库恢复为上次备份时的状态； <br /><br />注意：在恢复master数据库的早期阶段，不能使用系统存储过程。 <br /><br />恢复步骤 <br /><br />步骤1：查找系统表 <br /><br />查找已保存到文件的系统表sysdatabases、sysdevices、sysusages、sysloginroles和syslogins的副本。用这些副本可以保证在此过程结束时系统已经全部恢复。 <br /><br />步骤2：建立新的主设备 <br /><br />如果Adaptive Server正在运行，关闭它，然后重建主设备。重建主设备时，必须指定设备大小。开始重建前，记住以下几点： <br /><br />l保留旧设备，以防遇到问题，旧设备可提供至关重要的信息。 <br /><br />l使用buildmaster命令之前应关闭Adaptive Server。 <br /><br />l不同操作系统上创建主设备的命令有所不同，如：buildmast（unix）、bldmaster（windows NT），并安装通用master数据库的副本。 <br /><br />l命令中给出主设备的全名和大小。 <br /><br />示例：重建一个30兆（15360个2k的页） <br /><br />在Window NT上： <br /><br />bldmastr －d d:\devices\master.dat –s15360 <br /><br />步骤3：以主恢复方式启动Adaptive Server <br /><br />使用-m选项以主恢复方式启动Adaptive Server。在Window NT上，使用sqlsrvr命令从命令行启动Aadaptive Server。 <br /><br />Sqlsrvr.exe –d:\devices\master.dat –sserver_name –ed:\sybase\install\errorlog –id:\sybase\ini –MD:\sybase –m <br /><br />说明：以主恢复方式启动Adaptive Server时，只允许一个用户（系统管理员）登录。 <br /><br />步骤4：重建master的设备分配 <br /><br />检查sysusages系统表的书面副本，如果有多行dbid＝1的记录，则需要增加master的大小以便装载转储。最简单情况下，对master进行额外分配只需要使用alter database即可。复杂情况，必须为其它数据库分配空间，以便重新构造恢复master所需的正确的vstart值。 <br /><br />示例： <br /><br /><br />alter datbase master on master=2 <br /><br />步骤5：检查Backup Server和sysservers系统表信息。 <br /><br />使用空口令以“sa“用户登录服务器（如果Backup Server的网络名不是SYB_BACKUP，则必须更新sysservers以便Adaptive Server可以与其Backup Server通信）。 <br /><br />l检查interfaces文件中Backup Server的名称； <br /><br />l并发出下面的命令： <br /><br />select * from sysservers <br /><br />where srvname=”SYB_BACKUP” <br /><br />l检查此命令中输出结果的srvnetname。是否与服务器的backup Server的interfaces文件条目匹配，若匹配跳过步骤5； <br /><br />l如不同，则必须更新sysservers <br /><br />示例： <br /><br />begin tranaction <br /><br />updata sysserver <br /><br />set srvnetname=”backupserver_name” <br /><br />where srvname=”SYB_BACKUP” <br /><br />l核实该命令，如果updata修改了多行，或者修改了不应修改的行，则发出rollback tranaction命令，然后尝试再次更新。 <br /><br />如果该命令正确修改了Backup Server的行，则发出commit transaction命令。 <br /><br />步骤6：核实Backup Server正在运行 <br /><br />Window NT平台上，本地安装的Sybase Central和服务管理器可以显示Backup Server是否正在运行。 <br /><br />步骤7：装载master数据库的备份 <br /><br />在Window NT上： <br /><br />load database master from “d:\device\master.bck” <br /><br />在load database成功完成后，Adaptive Server将关闭。 <br /><br />步骤8：更新number of devices配置参数 <br /><br />仅当使用的数据库设备比缺省值多时才执行此步骤。 <br /><br />步骤9：以主恢复方式方式重新启动Adaptive Server <br /><br />Sqlsrvr.exe –d:\devices\master.dat –sserver_name –ed:\sybase\install\errorlog –id:\sybase\ini –MD:\sybase –m <br /><br />注意：装载master的备份将使“sa”帐号恢复到以前的状态。如果sa帐号有口令，则口令恢复。 <br /><br />步骤10：检查系统表以检验master的当前备份 <br /><br />l如果发出最新的disk init、create database或alter database命令以后已备份了master数据库，则sysusages、sysdatabases、和sysdevice的内容将与书面副本匹配。 <br /><br />l如果副本中的任何设备未包含在已恢复的sysdevices中，则上次备份以后已添加了设备，必须运行disk reinit和disk refit。 <br /><br />步骤11：重新启动Adaptive Server <br /><br />以常规（多用户）模式重新启动Adaptive Server <br /><br />步骤12：检查Adaptive server <br /><br />l将sysusages的书面副本与新联机版本比较 <br /><br />l将sysdatabase的书面副本与新联机版本比较 <br /><br />l在每个数据库上运行dbcc checkalloc <br /><br />l检查每个数据库中重要的表 <br /><br />完全恢复master数据库并运行全部的dbcc完整性检查后，使用常规转储命令备份此数据库。</font>
<img src ="http://www.blogjava.net/os586/aggbug/72481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-28 10:09 <a href="http://www.blogjava.net/os586/archive/2006/09/28/72481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>爱上济南的35个理由</title><link>http://www.blogjava.net/os586/archive/2006/09/22/71318.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 22 Sep 2006 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/22/71318.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/71318.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/22/71318.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/71318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/71318.html</trackback:ping><description><![CDATA[
		<h4>从网上转载的，嘿~我稍微修改了一下，红色标注的是我特别认同和赞可的~<br /><br />1、<font color="#ff0000">济南是全国最安全的城市，连续N年全国犯罪率最低的城市。</font><br />2、济南有全国最大的长途汽车站，去哪里玩都有豪华大巴坐。 <br />3、济南的烤肉串品种最全，说几十种都没重样的。 <br />4、济南的男人好，保守而体贴，美女作家画眉说济南男人是有着温暖阳光味道的老棉袄。 <br />5、<font color="#ff0000">济南女人好，巩俐是济南的名片，但是把巩俐扔到济南美女里都不扎眼，说明济南出美女。</font><br />6、<font color="#ff0000"><strong>济南有鲁能泰山，可以让人在每个周末感受狂喜！</strong></font> <br />7、济南有扎啤，走三步就有一个扎啤摊，连某些同志的网名都叫我爱喝扎啤。 <br />8、<font color="#ff0000">济南的出租车便宜，你在城里再怎么折腾也就是20来块钱。</font><br />9、济南出租车与人口的比例全国第一，除了下雨，平时你一招手，基本上能招来3辆车。 <br />10、济南出租车堵车的时候不跳表，不会象北京，堵车的时候表跳的人心脏病发作。 <br />11、济南有泉城广场，网友见面很容易约地方，你在泉标下面站3分钟，一定有人会来问你是不是忧郁的小宣宣。 <br />12、济南的房租便宜，300块钱就能租到一室一厅。 <br />13、济南刚刚被评为中国十大安静城市之一。 <br />14、<font color="#ff0000">济南是个安逸的城市，在济南的路上你很少看见人在跑，大家都是悠然自得的安逸心情</font>。 <br />15、济南的网吧可以玩CS，在很多地方这都是不可能的。 <br />16、星级酒店的巴西烤肉32元一位，外地人听了都瞪眼。 <br />17、济南人不歧视外地人，不觉得别人都是乡下人或者觉得别人都是自己部下。 <br />18、<font color="#ff0000">济南这个城市有人情味，没那么多商业气息。</font><br />19、济南值得一逛的地方都比较集中，而且商业街都不是很长，陪女朋友逛街不会累死。 <br />20、晚上可以去灰姑娘，花钱不多，可以听歌可以蹦迪还可以去静吧谈生意。 <br />21、济南的街道横平竖直，基本上不会掉向。 <br />22、济南有洛口市场，再穷的男人也敢带女朋友来买衣服。 <br />23、济南有免费的植物园，环境优美，大大降低了恋爱成本。 <br />24、<font color="#ff0000">济南人家庭观念特别强，大部分济南人宁愿呆在济南，离父母近一些，以照顾老人。</font><br />25、去体育中心游泳馆游泳经常能看到田亮和郭晶晶，因为国家跳水队长驻济南训练。 <br />26、济南的宽带网比较发达，竞争激烈，百灵广电网通联通，济南人接宽带的选择最多，宽带普及也相当高。 <br />27、济南人的环保意识强，很多家庭已经开始将废水二次利用了，济南人盼望泉水复涌的热情和关注，超过了任何一个城市的居民对自己城市的关注。 <br />28、济南的开发区里车少路宽，刚学出本的菜鸟可以去练车技。 <br />29、济南的文化市场，你可以买到各种真的或者假的怀旧的东东。 <br />30、<font color="#ff0000">老舍说：济南的冬天，天是响晴的，因为济南的冬天，所以喜欢济南</font>。 <br />31、济南的荷花是最美的花。花美，花香，花下的莲藕同样惹人喜爱。 <br />32、周末可以去爬山(大佛头，螺丝山，华不住山，浆水泉...)，去锦云川"挑战极限"。到舜花园顶层打羽毛球，壁球，游泳，健身...想一展歌喉可以到"东方之韵""阿米果""幸福时光""mbox"...随便你挑。 <br />33、济南的交警长的帅又有礼貌~ 迷了路可以放心的把自己托付给他。 <br />34、<font color="#ff0000">济南的饭店很多，尤其是有特色的小店很多，总能找到适合自己口味的。</font><br />35、济南的咖啡吧、酒吧有很多，价钱也不高，自己去坐坐，或约上几个好朋友去聊聊天，好不惬意。 </h4>
<img src ="http://www.blogjava.net/os586/aggbug/71318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-22 14:43 <a href="http://www.blogjava.net/os586/archive/2006/09/22/71318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 修改字符集及 Sort</title><link>http://www.blogjava.net/os586/archive/2006/09/22/71314.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 22 Sep 2006 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/22/71314.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/71314.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/22/71314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/71314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/71314.html</trackback:ping><description><![CDATA[
		<p>今天同事因为有一个项目中用到了Sybase数据库,其中他机子上的sybae是12.5,安装后一切都是默认的.没有对字符集及sort进行更改.<br /><br />然后在命令窗口中进行sql查询的时候显示的全是乱码.<br /><br />而发现这个还是在后面了.是因为他在web程序中给我看,然后把一切有关设置tomcat,jsp字符集的问题全都进行更改还是无补.只好打开数据库进行分析,呵呵,蒙了,通过脚本建立起来的全是乱码<br /><br /><br /><br />但是全套程序移植到我的机器上来却能够正常显示,没有乱码.我现在明白了,是他的数据库字符集的问题.<br /><br />Sybase数据库字符集的设置如下:<br /><br /><br /><br /> 在sybase安装目录下面的charsets下执行charset -Usa -P -Sservername binary.srt iso_1<br /><br />然后选择y即可.<br /><br />接下来可以用select id,name from syscharsets,<br /><br />看一下iso_1的id号<br /><br />然后运行sp_configure "defualt character set id",1<br /><br />因为iso_1的id为1<br /><br />这样字符集就设置完成,可以正常显示中文了.<br /><br />然后你可以再设置一下sort,这个比较简单,<br /><br />在config server当中选择language&gt;default sort&gt;<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Spanish case and accent insensitive dictionary order,然后保存,重启服务.可能不会成功,不过你可以启动一下机子就可以完成了.<br /></span><br /><br /></p>
<img src ="http://www.blogjava.net/os586/aggbug/71314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-22 14:17 <a href="http://www.blogjava.net/os586/archive/2006/09/22/71314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摘 Oracle9i与SYBASE ASE12.5相比的几个不足</title><link>http://www.blogjava.net/os586/archive/2006/09/20/70745.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 20 Sep 2006 03:51:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/20/70745.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/70745.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/20/70745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/70745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/70745.html</trackback:ping><description><![CDATA[Oracle9i与ASE12.5分别是世界主流数据库厂商ORACLE、SYBASE公司的主打产品，拥有相当大的市场份额。本文抛开两者之间在体系结构、技术路线上的差异，纯粹从使用者的角度出发，整理了Oracle9i与SYBASE Adaptive Server Enterprise 12.5 (简称ASE12.5)相比的几个不足，至于ASE12.5与Oracle9i相比的不足则不在本文的讨论范围。<br /><br />1 不支持正则表达式：熟悉Unix/Linux及ASE12.0/12.5的人都知道正则表达式的灵活、功能强大。像“查找所有包含数字的表名称”这样的需求，在ASE12.5中极其简单：<br /><br />select name from sysobjects where type=”U” and name like “%[0-9]%” (这里sysobjects相当于Oracle9i中的all_objects)，而Oracle9i的实现要颇费一番周折了，一般情况下很多人都是写一个函数实现，以下就是刚学Oracle的时候写的一个实现该功能的函数：<br /><br />CREATE OR REPLACE function is_number(p_str in varchar2)<br /><br />return number<br /><br />as<br /><br />  w_char char(1);<br /><br />  i      number :=1;<br /><br />begin<br /><br />  while  i &lt;= length(p_str) loop<br /><br />       w_char := substr(p_str,i,1);<br /><br />       if w_char &gt;='0' and w_char &lt;='9' then<br /><br />          return 1;<br /><br />       end if;<br /><br />    i:=i+1;<br /><br />    end loop;<br /><br />  return 0;<br /><br />end;<br /><br />/<br /><br />在Oracle9i调用一个自定义的PL/SQL函数开销会很大；远不及ASE12.5的内部实现。<br /><br />2  UPDATE语句的“蹩脚”,在数据库的应用中，两个表关联update是很常见的，如有如下两个表：t_a(id,name,point,…),t_b(id,point,…) id均为主键或unique index,现要实现根据id的对应关系将t_b表上point加至t_a表point。我们来看Oracle9i与ASE12.5的实现:<br /><br />/** For Oracle9i **/<br /><br />Update t_a a<br /><br />Set   a.point=a.point+(select b.point from t_b b where b.id=a.id)<br /><br />Where exists (select 1 from from t_ b where b.id=a.id)<br /><br />/<br /><br />/** For ASE12.0/12.5 **/<br /><br />Update t_a <br /><br />Set    point=a.point+b.point<br /><br />From  t_a a,t_b b<br /><br />Where  a.id=b.id<br /><br />Go<br /><br />Oracle9i的语句似乎不顾清晰、容易误解，而且查看执行计划发现t_b表或索引扫描了2遍！ASE12.5只扫描了1遍。虽然第2遍是逻辑读，但总觉得不甘心；<br /><br />有时如果t_b表较小，且id上无索引，我宁愿采用cursor方式，多次试验表明<br /><br />比Create INDEX+关联UPDATE要快得多。还有就是采用Oracle9i的OLAP特性，用merge 语句来完成。<br /><br />3临时表技术的比较：<br /><br /> <br /><br />ITEM<br /><br />存储位置<br /><br />DDL<br /><br />数据生命周期<br /><br />ORACLE9i<br /><br />任何表空间<br /><br />用户自己维护,表名是全局（数据库用户）唯一<br /><br />Session / Transaction<br /><br />ASE12.5<br /><br />Tempdb库<br /><br />用户create;用户drop或系统drop，表名Session级唯一<br /><br />Session<br /><br /> <br /><br /> <br /><br /> <br /><br /> <br /><br /> <br /><br />虽然两者各有所长，但我觉得ASE12.5的实现似乎更得”临时”的精髓—在每个会话期间，“召之即来”,不用担心与别人重名，#11 #22 #aa #bb随个人喜好创建，”挥之即去”, 会话结束亦不必显式删除，由系统代劳，不必担心垃圾表存在。<br /><br /> 4  Count的问题还是Distinct的问题?在select 语句使用 distinct 关键字修饰以返回唯一的行集，这在统计分析、剔除重复数据尤为重要，但是有时仅想统计一个总数呢？我第一次是这样写的:<br /><br />Select count(distinct a,b,c) from my_table 结果语法不对，只好修改为：<br /><br />Select count(*) from ( select distinct a,b,c from my_table ) 方得以通过，心想这一定是distinct惹的祸，但随后发现distinct 被冤枉了，因为即使是：<br /><br />Select count(a,b,c) from my_table 也是不行的。只能写成：<br /><br />Select count(*) from ( select a,b,c from my_table )<br /><br />但在ASE12.5上无论是Select count(distinct a,b,c) from my_table 还是Select count(a,b,c) from my_table 均能得出正确结果。<br /><br />5  数据导入导出工具的比较：Exp/Imp在备份和恢复方面用的比较多，且受版本(高低版本、32bit/64bit)、语言影响较大，且sqlldr 只能算作导入工具，严格来说Oracle9i没有表数据的文本级的导出工具！相反，ASE12.5的bcp 的在表数据导入导出方面的很灵活，格式也很简单，很容易做应用程序的输入。还有视图、存储过程、触发器的导出工具defncopy也很好用；至于Oracle9i，我N+1次遇到以下情况：<br /><br />问：我怎么得到某个存储过程的代码啊？<br /><br />答：有没有装client阿？<br /><br />问：装了！<br /><br />答：打开Enterprise Manager Console，登录后在方案下面找吧<br /><br />……<br /><br />问：怎么麻烦阿？<br /><br />答：那你有没有装Toad或者PL/Develop阿,这些工具好用点<br /><br />问：没有啊！<br /><br />答：L<br /><br />或者 <br /><br />问：我怎么得到某个存储过程的代码啊？<br /><br />答：有没有装client阿？<br /><br />问：装了，可我在主机上啊！<br /><br />答：那你用sqlplus看罢，<br /><br />set long 300<br /><br />select text from all_source where name=’YourName’<br /><br />go<br /><br />问：哇，怎么麻烦阿<br /><br />答：L<br /><br />要是在ASE12.0<br /><br />问：我怎么得到某个存储过程的代码啊？<br /><br />答：用defncopy 吧<br /><br />问：怎么用啊<br /><br />答：我靠，这么简单！你还用问阿！J<br /><br />6  联机备份：虽然Oracle9i提供了冷、热备份技术,但是与ASE12.5基于Open Server技术的联机实时备份Backup Server相比似乎逊色不少，将备份的介质直接拿到另外一台ASE12.5进行Load，很快很简单就能获得一个时效性极强的”镜像”数据库环境。而我觉得Exp/Imp比较琐碎，且限制也较多。<br /><br />Oracle9i附带的命令行工具如sqlplus exp/imp sqlldr等，执行时无一例外都将输出时间、版本、版权信息，给像我这样喜欢用shell处理结果的人来说徒增不少麻烦，相比ASE12.5的isql bcp defncopy 的干净利落，是Oracle9i的无聊和”自恋”，还是埃里克森的霸气呢?<img src ="http://www.blogjava.net/os586/aggbug/70745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-20 11:51 <a href="http://www.blogjava.net/os586/archive/2006/09/20/70745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 数据库的优化</title><link>http://www.blogjava.net/os586/archive/2006/09/20/70742.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 20 Sep 2006 03:44:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/20/70742.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/70742.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/20/70742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/70742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/70742.html</trackback:ping><description><![CDATA[
		<p>一. SYBASE 系统参数调整<br />1.内存<br />sp_configure "max memory",1500000 重启生效（设置为共享内存的75%）<br />sp_configure "allocate max shared mem",1 启动的时候自动分配max memory指定的最大内存<br />sp_cacheconfig "default data cache","1500m" 设置数据缓存（设置为max memory的一半）<br />sp_cacheconfig "default data cache","cache_partition=2" 是CPU数量的倍数,对数据缓冲区分区<br />sp_poolconfig "default data cache","64m","16k" 设置16K 数据缓存<br />sp_poolconfig "default data cache","128m","8k" 设置8K 数据缓存<br />sp_configure "procedure cache size",90000 存储过程数据缓存</p>
		<p>2.cpu <br />sp_configure "max online engines",2 设置使用的CPU数量<br />sp_configure "number of engines at startup",2 启动时使用CPU数量</p>
		<p>3. 网络<br />sp_configure "default network packet size",2048 设置网络传送包的大小(重启动生效)<br />sp_configure "max network packet size",2048 </p>
		<p>4. 其他资源使用<br />sp_configure "number of locks",100000 锁使用数量<br />sp_configure "number of open indexes",5000 打开索引<br />sp_configure "number of open objects",5000 打开对象<br />sp_configure "number of user connections",1000 用户连接数<br />sp_configure "number of device",100 新建设备最大数量</p>
		<p>
				<br />二. sybase 设备调整<br /><br />数据设备与日志设备必须分开，添加临时数据库设备</p>
		<p>1. 数据设备<br />sp_deviceattr devname,"dsync",true<br />2. 日志设备<br />sp_deviceattr devname,"dsync",false<br />3. 临时数据库设备<br />sp_deviceattr devname,"dsync",false</p>
		<p>
				<br />三. sybase 数据结构调整</p>
		<p>1. 数据库对象表、索引。。<br />(1)对表新建合理的索引，定期分析表<br />update statistics tabname (不锁表)<br />(2)整理数据库空间 (锁表，剩余空间必须为最大表的1.2倍)<br />reorg rebuild tabname<br />recreate clustered index<br />(3)重新编译存储过程与触发器<br />sp_recompile usertable (与表相关联的存储过程和触发器)</p>
		<p>
				<br />四. sybase 数据库监控</p>
		<p>1. 数据库死进程<br />select * from master..syslogshold</p>
		<p>
				<br />五. sybase 数据库启动参数</p>
		<p>-T3607 master <br />-T3608 其他数据<br />-m 单</p>
<img src ="http://www.blogjava.net/os586/aggbug/70742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-20 11:44 <a href="http://www.blogjava.net/os586/archive/2006/09/20/70742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 数据库的一些常用 函数 总结</title><link>http://www.blogjava.net/os586/archive/2006/09/20/70740.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 20 Sep 2006 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/20/70740.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/70740.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/20/70740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/70740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/70740.html</trackback:ping><description><![CDATA[
		<div>
				<p>一.字符操作</p>
				<p>1.替换指定字符</p>
				<p>str_replace(string1,需要替换字符，替换成字符)</p>
				<p>SUBSTRING(string1,,)</p>
				<p>二.数值操作</p>
				<p>三.日期操作</p>
				<p>getdate() <br />得到当前时间,可以设置得到各种时间格式.<br />datepart(日期部分,日期) <br />取指定时间的某一个部分,年月天时分秒. <br />datediff(日期部分,日期1,日期2) <br />计算指定的日期1和日期2的时间差多少. <br />dateadd(日期部分,数值表达式,日期) <br />计算指定时间,再加上表达式指定的时间长度. </p>
				<p>--取前几天</p>
				<p>'dataadd(day,-10,getdate())'</p>
				<p>
				</p>
				<p>--取时间的某一个部分 <br />select datepart(yy,getdate()) --year <br />select datepart(mm,getdate()) --month <br />select datepart(dd,getdate()) --day <br />select datepart(hh,getdate()) --hour <br />select datepart(mi,getdate()) --min <br />select datepart(ss,getdate()) --sec </p>
				<p>--取星期几 <br /><br /><br />set datefirst 1 <br />select datepart(weekday,getdate()) --weekday <br /><br />--字符串时间 <br /><br />select getdate() -- '03/11/12' <br />select convert(char,getdate(),101) -- '09/27/2003' <br />select convert(char,getdate(),102) -- '2003.11.12' <br />select convert(char,getdate(),103) -- '27/09/2003' <br />select convert(char,getdate(),104) -- '27.09.2003' <br />select convert(char,getdate(),105) -- '27-09-2003' <br />select convert(char,getdate(),106) -- '27 Sep 2003' <br />select convert(char,getdate(),107) --'Sep 27, 2003' <br />select convert(char,getdate(),108) --'11:16:06' <br />select convert(char,getdate(),109) --'Sep 27 2003 11:16:28:746AM' <br />select convert(char,getdate(),110) --'09-27-2003' <br />select convert(char,getdate(),111) --'2003/09/27' <br />select convert(char,getdate(),112) --'20030927' <br />select rtrim(convert(char,getdate(),102))+' '+(convert(char,getdate(),108)) -- '2003.11.12 11:03:41' <br /><br />--整数时间 <br /><br />select convert(int,convert(char(10),getdate(),112)) -- 20031112 <br />select datepart(hh,getdate())*10000 + datepart(mi,getdate())*100 + datepart(ss,getdate()) -- 110646 <br /><br />--时间格式 "YYYY.MM.DD HH:MI:SS" 转换为 "YYYYMMDDHHMISS" <br /><br />declare @a datetime,@tmp varchar(20),@tmp1 varchar(20) <br />select @a=convert(datetime,'2004.08.03 12:12:12') <br />select @tmp=convert(char(10),@a,112) <br />select @tmp <br />select @tmp1=convert(char(10),datepart(hh,@a)*10000 + datepart(mi,@a)*100 + datepart(ss,@a)) <br />select @tmp1 <br />select @tmp=@tmp+@tmp1 <br />select @tmp <br /><br />--当月最后一天 <br /><br />declare <br />@tmpstr varchar(10) <br />@mm int, <br />@premm int, <br />@curmmlastday varchar(10) <br />begin <br />select @mm=datepart(month,getdate())--当月 <br />select @premm=datepart(month,dateadd(month,-1,getdate())) --上个月 <br />if (@mm&gt;=1 and @mm&lt;=8) <br />select @tmpstr=convert(char(4),datepart(year,getdate()))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01' <br />else if (@mm&gt;=9 and @mm&lt;=11) <br />select @tmpstr=convert(char(4),datepart(year,getdate()))+'.'+convert(char(2),datepart(month,dateadd(month,1,getdate())))+'.'+'01' <br />else <br />select @tmpstr=convert(char(4),datepart(year,dateadd(year,1,getdate())))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01' <br />select @curmmlastday=convert(char(10),dateadd(day,-1,@tmpstr),102) --当月最后一天 <br />end </p>
		</div>
<img src ="http://www.blogjava.net/os586/aggbug/70740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-20 11:43 <a href="http://www.blogjava.net/os586/archive/2006/09/20/70740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL 面试题</title><link>http://www.blogjava.net/os586/archive/2006/09/19/70463.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 19 Sep 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/19/70463.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/70463.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/19/70463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/70463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/70463.html</trackback:ping><description><![CDATA[
		<p>假设只有一个table，名为pages，有四个字段，id, url,title,body。里面储存了很多网页，网页的url地址，title和网页的内容，然后你用一个sql查询将url匹配的排在最前，title匹配的其次，body匹配最后，没有任何字段匹配的，不返回。<br /><br />就是上面这道面试题，让我想了一个下午，在网上找资料，最后用下面方法实现<br /></p>
		<p>SELECT *<br />FROM page where url like '%baidu%' or title like '%baidu%' or like ''<br />ORDER BY CHARINDEX('baidu', url) DESC, CHARINDEX('baidu', title) DESC, <br />      CHARINDEX('baidu', body) DESC<br /><br />但我感觉这种方法并不是最简单的，后来把这个方法发给面试的人，他给我了一种更简单方法，只要用基本的Sql语句就可以实现。代码如下<br /></p>
		<p>
				<br />select a.[id],a.mark from<br />(<br />select [page].[id],100 as mark from [page] where [page].[url] like '%baidu%'<br />union<br />select [page].[id],50 as mark from [page] where [page].[title] like '%baidu%'<br />union<br />select [page].[id],10 as mark from [page] where [page].[body] like '%baidu%'<br />) as a  order by mark desc<br /><br />用union 实现联合查询，在每个查询语句中定义一个临时变量mark 并给mark赋值，在最后的输出时采用mark来排序，这样实现真的好简单。其实这都考验我们对Sql的编成思想。</p>
<img src ="http://www.blogjava.net/os586/aggbug/70463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-19 11:28 <a href="http://www.blogjava.net/os586/archive/2006/09/19/70463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贴一道SQL面试题,希望大家相互讨论</title><link>http://www.blogjava.net/os586/archive/2006/09/19/70436.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Tue, 19 Sep 2006 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/19/70436.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/70436.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/19/70436.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/70436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/70436.html</trackback:ping><description><![CDATA[
		<font style="FONT-SIZE: 12px" face="Courier">给下面这样的一个表记录：<br /><br />------------------------------------<br /><p><span style="FONT-SIZE: 9pt; FONT-FAMILY: Courier">购物人      商品名称     数量<br />A            甲          2<br /></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: Courier"><font face="Courier New" size="2">B            乙          4<br />C            丙          1<br />A            丁          2<br />B            丙          5</font><br /><br /></span></p><p><span style="FONT-SIZE: 9pt; FONT-FAMILY: Courier">给出所有购入商品为两种或两种以上的购物人记录<br /></span></p></font>
<img src ="http://www.blogjava.net/os586/aggbug/70436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-19 10:07 <a href="http://www.blogjava.net/os586/archive/2006/09/19/70436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase数据库日志详解</title><link>http://www.blogjava.net/os586/archive/2006/09/11/68921.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Mon, 11 Sep 2006 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/11/68921.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68921.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/11/68921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68921.html</trackback:ping><description><![CDATA[
		<p>我们知道，SYBASE　SQL Server用事务（Transaction）来跟踪所有数据库的变化。事务是SQL　Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志（Transaction　Log），即系统表（Syslogs）。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要，我们进行数据库开发和维护必须熟知日志的相关知识。 
</p>
		<p>
				<strong>一、SYBASE　SQL Server 如何记录和读取日志信息</strong>
		</p>
		<p>SYBASE　SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时，SQL　Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后，它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中，直到别的数据页需要该内存时，该数据页才被写到磁盘上。若事务中的某条语句没能完成，SQL　Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。</p>
		<p>
				<b>二、日志设备</b>
				<br />
				<br />Log和数据库的Data一样，需要存放在数据库设备上，可以将Log和Data存放在同一设备上，也可以分开存放。一般来说，应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处：一是可以单独地备份Backup事务日志；二是防止数据库溢满；三是可以看到Log的空间使用情况。<br /><br />所建Log设备的大小，没有十分精确的方法来确定。一般来说，对于新建的数据库，Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁，则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外，还有其它因素影响Log大小，我们应该根据实际操作情况估计Log大小，并间隔一段时间就对Log进行备份和清除。 <br /><br /><b>三、日志的清除</b><br /><br />随着数据库的使用，数据库的Log是不断增长的，必须在它占满空间之前将它们清除掉。清除Log有两种方法：<br /><br /><strong>1.自动清除法<br /><br /></strong><br /><br />开放数据库选项 Trunc Log on Chkpt，使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预，由SQL　Server自动执行，并且一般不会出现Log溢满的情况；缺点是只清除Log而不做备份。<br /><br /><strong>2.手动清除法</strong><br /><br />执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志：</p>
		<p>
		</p>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<pre>dump transaction with truncate_only<br /><br />dump transaction with no_log </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令，这条命令写进事务日志时，还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况，使用这条命令有很大的危险性，SQL　Server会弹出一条警告信息。为了尽量确保数据库的一致性，你应将它作为“最后一招”。<br /><br />以上两种方法只是清除日志，而不做日志备份，若想备份日志，应执行“dump transaction database_name to dumpdevice”命令。<br /><br /><b>四、管理庞大的事务</b><br /><br />有些操作会大批量地修改数据，如大量数据的修改（Update）、删除一个表的所有数据（Delete）、大量数据的插入（Insert），这样会使Log增长速度很快，有溢满的危险。下面笔者给大家介绍一下如何拆分大事务，以避免日志的溢满。<br /><br />例如执行“update tab_a set col_a=0”命令时，若表tab_a很大，则此Update动作在未完成之前就可能使Log溢满，引起1105错误（Log Full），而且执行这种大的事务所产生的独占锁（Exclusive Table Lock），会阻止其他用户在执行Update操作期间修改这个表，这就有可能引起死锁。为避免这些情况发生，我们可以把这个大的事务分成几个小的事务，并执行“dump transaction”动作。 <br /><br />上例中的情况就可以分成两个或多个小的事务：<br /><br /></p>
		<p>
		</p>
		<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
				<tbody>
						<tr>
								<td class="code" bgcolor="#e6e6e6">
										<pre>update tab_a set col_a=0 where col_b&gt;x <br /><br />go<br /><br />dump transaction database_name with truncate_only <br /><br />go <br /><br />update tab_a set col_a=0 where col_b &lt;=x <br /><br />go <br /><br />dump transaction database_name with truncate_only <br /><br />go </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>这样，一个大的事务就被分成两个较小的事务。<br /><br />按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上，则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令，应该先执行“dump database”。以此类推，我们可以对表删除、表插入等大事务做相应的拆分。</p>
<img src ="http://www.blogjava.net/os586/aggbug/68921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-11 11:16 <a href="http://www.blogjava.net/os586/archive/2006/09/11/68921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一Sybase数据库的备份恢复的文章</title><link>http://www.blogjava.net/os586/archive/2006/09/11/68919.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Mon, 11 Sep 2006 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/11/68919.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68919.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/11/68919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68919.html</trackback:ping><description><![CDATA[对Sybase数据库的备份问题一直比较头痛,可能我对它的备份问题还是了解的不够.因此一直觉得使用起来较为繁琐.今天看了这篇文章,有一定的作用.不过文章当中还是没有介绍增量备份都相关的内容.有时间我可以补上.<br /><br /><p>Sybase数据库产品自从1987年问世以来，它的客户机/服务器(client/server)工作模式、分布处理的基础体系结构、完善的安全保密性能、高速快捷的运行方式、多平台跨操作系统的广泛应用等优点，迅速被IT界接受并推广应用。我们作为金融业的用户，也在1995年开始使用Sybase10版本。在具体的使用中，发现集中式的数据管理有其优点，就是数据风险范围大为缩小，但是作为Sybase的服务器一端，数据风险比较集中，如何做好数据库的数据备份，成为至关重要的问题。<br /><br />在实际应用中，我们总结出了两种全量备份方案：<br /><br /><strong>一、使用Sybase的Backup Server（备份服务器），做Dump备份</strong><br /><br />转储数据库（Dump database），就是为整个数据库（包括数据、表结构、触发器、游标、存储过程、事务日志等）做一次物理备份。转储数据库时，系统自动执行一次checkpoint，即将日志和数据从缓冲区拷贝到硬盘（只拷贝脏页），把已被分配的页（日志和数据）转储到设备。<br /><br />命令格式为：<br /><br />dump database 数据库名 to 设备文件名 with 参数<br /><br />如果备份到硬盘的文件上，可以不预先估算备份文件的大小，只要硬盘有足够的存储空间就可以。如果是备份到dds磁带上，那么就要估算一下备份后的大小，90米的dds磁带压缩存储空间为4G,120米的磁带压缩存储空间为8G，如果数据库的备份文件超过了这个尺寸，就要考虑多文件转储，使用stripe参数。<br /><br />命令格式为： 
</p><p>dump database 数据库名 to 设备文件名1 <br /><br />stripe on 设备文件名2 <br /><br />stripe on 设备文件名3……<br /><br />with 参数<br /><br />这种数据备份方式是将整个数据库的运行环境完整的复制一份，包括数据库的脏页和碎片，在使用load命令恢复时，只能恢复到同样大小的数据库中（数据和日志的大小都只能和原来完全一致），适用于在每天的日终营业网点下班后的日常备份。优点是数据库完整无误，缺点是不能直接查看备份内容。<br /><br /><strong>二、分数据结构和数据记录做两次备份</strong><br /><br />在一般情况下，生产机的数据库都比较庞大，而实验机则相对较小，难以在实验环境中以load命令恢复工作机的内容。所以，在工作实践中，我们摸索出了第二种全量备份方案。<br /><br /><strong>1、数据结构备份</strong><br /><br />在windows平台的Sybase SQL Server Manager（数据库管理）平台中选择ServeràGenerate ddl则产生整个数据库服务器的所有信息，如果选择databaseàgenerate ddl则产生所选定数据库的信息，以master库为例，产生的文件主要包括：config.ddl（配置）、devices.ddl（设备）、database.ddl（数据库）、logins.ddl（用户）、remote.ddl（远程）、cache.ddl（缓冲）、segment.ddl（）、group.ddl（用户组）、user.ddl（用户）、default.ddl（确省）、rule.ddl（规则）、udt.ddl、table.ddl（表）、view.ddl（视图）、proc.ddl（存储过程）、triger.ddl（触发器）。<br /><br /><strong>2、数据记录备份</strong><br /><br />将数据库各表以Sybase自代的bcp（bulk copy）工具的方式导成一定格式的文本文件，命令格式：<br /><br />bcp 表名 out 路径名 文件名 -c -t 分隔符 -u （用户名）-p（密码）-S（服务器名）<br /><br />如果将一个数据库中的所有表都做一个bcp备份，就需要针对每一个表都做一次bcp，在一般情况下，一个数据库有100多个表，工作量比较大。可以利用数据库中的系统表信息做一个bcp备份脚本。原理是每一个用户表在系统表中都有信息记载，可以通过isql语句查询得到。现举一例说明：<br /><br />1）、先编辑一个名为mkbcpout.sql的文件，内容如下：<br /><br /></p><p>select "echo bcp "+name+" out ……………………<br /><br />"+"bcp "+name+" out ./+"name+".table -c -t | -Uuser -Ppassword -S SERVER" from sysobjects where type=U<br /><br />go</p><p>2）、执行isql命令，以此文件作为输入，执行结果输出到另外一个文件里：</p><p>isql -Uuser -Ppassword -S server -I mkbcpout.sql -O bcpout</p><p>3）、对bcppout文件稍微修改，增加可执行权限</p><p>chmod +x bcpout</p><p>4）、执行bcpout，导出数据文本：</p><p>./bcpout</p><p><strong>3、数据库恢复</strong><br /><br />业务生产机可能为小型机，而实验开发环境的硬件环境为PC server，安装好win nt或SCO unix下的Sybase服务器后，根据需要创建空间足够大的数据库和tempdb（系统临时数据库），创建数据库用户，并将其更改为此数据库的所有者，要注意两点：1）此数据库允许bcp拷贝，2）此数据库自动清除log。命令格式为：<br /><br />1&gt; sp_dboption databasedbname ,"select into/bulkcopy",true<br /><br />2&gt; go</p><p>1&gt; sp_dboption databasename,"trunc log on chkpt",true<br /><br />2&gt; go<br /><br />上述两个配置可能与生产机的配置不同。<br /><br />然后以新创建的数据库用户登录，导入数据结构，注意要首先导入表结构，然后才是存储过程、触发器等等。命令格式：<br /><br />1、 isql -Uusername -Ppassword -I table.ddl -o error.log.table<br /><br />2、 isql -Uusername -Ppassword -I proc.ddl -o error.log.proc<br /><br />……<br /><br />为了提高bcp导入数据的速度，需要将比较大的表的索引和主键删除，否则的话，每bcp进一条数据，数据库都自动写一条log日志，记载此数据的上一条和下一条记录，确定本记录在此表中的准确位置，一是影响bcp速度，二是数据库的log飞速膨胀。数据库的自动清除log功能只有在一个事务结束后才起作用。</p><p>准备工作做完后，开始倒入数据记录。使用类似做bcpout的方法做一个bcpin的脚本，然后执行：</p><p>./bcpin |tee error.bcpin<br /><br />使用tee管道输出的目的是让计算机完整记录下倒入过程，自动存入error.bcpin文件中，待倒入结束后，我们只需要检查日志文件，不需要一直紧盯着计算机屏幕。<br /><br />所有工作做完之后，不要忘记重新将删除的主键和索引建上。<br /><br />如果有现成的数据库，只需要单纯地导入数据记录，则首先将数据库中所有用户表（也就是所有type="U"的表）清空，命令格式：<br /><br />1&gt; truncate table tablename<br /><br />2&gt; go<br /><br />当然最好也是利用做bcpout脚本的做一个truncate脚本，通过执行此脚本将所有用户表清空。然后的数据导入、处理索引和主键的过程与上面类似。<br /><br /><strong>三、利用做bcp备份脚本的方法做数据库碎片整理</strong></p><p>Sybase数据库作为联机事务处理应用服务器，每天应用程序都对数据库做大量的插入、修改和删除等操作，不可避免的在数据库的物理存储介质上留下页碎片和扩展单元碎片，从而影响数据库的存储效率和运行速度。具体表现为：业务繁忙时出现死锁（dead lock），数据库的输入/输出资源被大量占用，业务处理速度慢。其解决办法是：<br /><br />1、 清空数据库中的所有表，命令格式：isql -Uusername -Ppassword -I truncate.sql -o error.truncate<br /><br />2、 删除所有表的索引和主键：isql -Uusername -Ppassword -I dropindex.sql -o error.dropindex<br /><br />3、 导入数据：./bcpin<br /><br />4、 添加索引和主键：isql -Uusername -Ppassword -I addindex.sql -o error.addindex<br /><br />5、 更新数据库状态<br /><br />1&gt; update statistics tablename<br /><br />2&gt; go<br /><br />上述操作都是针对数据库中的所有用户表进行的，利用做bcp备份脚本的方法做出相应的脚本，使繁琐的数据库维护变得简便易行，还克服了直接使用isql语句操作风险大、没有操作日志的毛病。<br /><br />笔者在实际工作中，使用第一种方法对生产机做日常全量备份，日终通过unix的crontab定时批量作业（具体做法请参考《中国金融电脑》2001年第10期有关crontab的文章）bcp出全部数据。使用高档PC server 搭建模拟运行环境，在需要的情况下导入生产机数据，处理运行中后台server的各种问题，待研究出解决办法后再在生产机上做相应调整，这样做风险小，效果好。</p><img src ="http://www.blogjava.net/os586/aggbug/68919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-11 11:12 <a href="http://www.blogjava.net/os586/archive/2006/09/11/68919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL学习笔记之存取权限系统 </title><link>http://www.blogjava.net/os586/archive/2006/09/08/68534.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 08 Sep 2006 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/08/68534.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68534.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/08/68534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68534.html</trackback:ping><description><![CDATA[
		<p>最近一直比较喜欢MySQL,当时是因为PHP，不过后来发现在linux下配置mysql也是件很不错的事情，再到后来通过网上资料配置成功Oracle9,当然了配置好了，我觉得还是应该仔细的去研究一下：<br /></p>
		<p>也许我们刚装上mysql,无论是在linux，还是在windows下，它的权限系统问题是我们首先应该接触的<br /></p>
		<p>
				<strong>MySQL</strong>权限系统的主要功能是证实连接到一台给定主机的一个用户，并且赋予该用户在一个数据库上<strong>select</strong>、 <strong>insert</strong>、<strong>update</strong>和<strong>delete</strong>的权限。 </p>
		<p>附加的功能包括有一个匿名的用户和对于<strong>MySQL</strong>特定的功能例如<code>LOAD DATA INFILE</code>进行授权及管理操作的能力。<br /></p>
		<p>Mysql在安装成功后，默认的用户名是root，没有密码，当然了你自己可以在以后的学习过程中改掉它。<br /></p>
		<p>不过我还是先看了一下mysql与服务器的连接部分，如果安装完成，当然要试着进行一下连接了：<br /></p>
		<p>当你想要存取一个<strong>MySQL</strong>服务器时，<strong>MySQL</strong>客户程序一般要求你指定连接参数：你想要联接的主机、你的用户名和你的口令<br /></p>
		<p>shell&gt;mysql  [-h hostname] [-u username] [-ppassword]<br /></p>
		<p>其中<font face="Courier New">-h</font>, <code>-u</code>和<code>-p</code>选项的另一种形式是<code>--host=host_name</code>、<code>--user=user_name</code>和<code>--password=your_pass</code>。注意在<code>-p</code>或<code>--password=</code>与跟随它后面的口令之间<em>没有空格</em>。<br /></p>
		<p>在命令行上指定一个口令是不安全的！随后在你系统上的任何用户可以通过打类似这样的命令发现你的口令：<code>ps auxww<br /></code></p>
		<code>
				<p>对于命令行没有的联接参数，<code>mysql</code>使用缺省值： 
</p>
				<ul>
						<li>缺省主机名是<code>localhost</code>。 
</li>
						<li>缺省用户名是你的Unix登录名。 
</li>
						<li>如果没有<code>-p</code>，则没有提供口令。</li>
				</ul>
				<p>在Unix系统上，当你进行一个连接时，你可以指定要使用的不同的缺省值，这样你不必每次在你调用一个客户程序是在命令行上输入他们。这可以有很多方法做到： 
</p>
				<ul>
						<li>
								<a name="IDX120">
								</a>你能在你的主目录下<tt>“.my.cnf”</tt>的配置文件的<code>[client]</code>小节里指定连接参数。文件的相关小节看上去可能像这样： <pre>[client] 
host=host_name 
user=user_name 
password=your_pass</pre></li>
						<li>
								<pre>
										<p>口令的安全性问题：以一种暴露的可被其他用户发现的方式指定你的口令是不妥当的。当你运行客户程序时，你可以使用下列方法指定你的口令，还有每个方法的风险评估： </p>
										<ul>
												<li>使用一个在命令行上<code>-pyour_pass</code>或<code>--password=your_pass</code>的选项。这很方便但是不安全，因为你的口令对系统状态程序(例如<code>ps</code>)变得可见，它可以被其他的用户调用来显示命令行。(一般<strong>MySQL</strong>客户在他们的初始化顺序期间用零覆盖命令行参数，但是仍然有一个短暂间隔时间内参数值可见的。） </li>
												<li>使用一<code>个-p</code>或<code>--password</code>选项(没有指定<code>your_pass</code>值)。在这种情况下，客户程序请求来自终端的口令： <pre>shell&gt;mysql - u  user_name - p
Enter password: ********
</pre><p>客户回应<samp>“*”</samp>字符到作为输入你的口令的终端使得旁观者不能看见它。因为它对其他用户不可见，与在命令行上指定它相比，这样进入你的口令更安全。然而，这个输入一个口令的方法仅仅为你交互式运行程序是合适的。如果你想要从非交互式运行的一个脚本调用一个客户，就没有从终端输入入口令的机会。 </p></li>
												<li>
														<a name="IDX128">
														</a>在一个配置文件中存储你的口令。例如，你可你的主目录的<tt>“.my.cnf”</tt>文件中的<code>[client]</code>节列出你的口令： <pre>[client]
password=your_pass
</pre><p>如果你在<tt>“.my.cnf”</tt>里面存储口令，文件应该不是组或世界可读或可写的。保证文件的存取模式是<code>400</code>或<code>600</code>。见<a href="file:///H:/2004-important/mysql/mysql_manual/mysql_manual/manual_Installing.html#Option_files">4.15.4 选项文件</a>。 </p></li>
												<li>你可在<code>MYSQL_PWD</code>环境变量中存储口令，但是这个方法必须想到是极不安全的且应该不使用。<code>ps</code>的某些版本包括显示运行进程的环境的选项；如果你设定<code>MYSQL_PWD</code>，你的口令将对所有人是显而易见的，甚至在没有这样一个版本的<code>ps</code>系统上，假设没有其他方法观察到进程环境是不明智的。 </li>
										</ul>
										<p>总之，最安全的方法是让客户程序提示口令或在一个适当保护<tt>的“.my.cnf”</tt>文件中指定口令</p>
								</pre>
						</li>
				</ul>
		</code>
<img src ="http://www.blogjava.net/os586/aggbug/68534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-08 15:51 <a href="http://www.blogjava.net/os586/archive/2006/09/08/68534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL学习笔记之三种用户密码的修改 </title><link>http://www.blogjava.net/os586/archive/2006/09/08/68535.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 08 Sep 2006 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/08/68535.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68535.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/08/68535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68535.html</trackback:ping><description><![CDATA[
		<p>在学习mysql的过程中，我们经常会碰到怎样去修改mysql用户的密码，在mysql当中有三种修改用户密码的方法，大家可以按照自己的习惯来使用：<br /></p>
		<ul>
				<li>使用标准sql语句</li>
		</ul>
		<p>           shell&gt;mysql -u root -p mysql<br />           mysql&gt;update user set Password=PASSWORD('new_password') where User='root';<br />           mysql&gt;flush previliges;<br /></p>
		<ul>
				<li>使用set password命令：</li>
		</ul>
		<p>           mysql&gt;set password for root=PASSWORD('new_password');<br /></p>
		<ul>
				<li>mysqladmin <br /> shell&gt;mysqladmin -u root password 'new_password'</li>
		</ul>
		<p>此处我们只是在update语句和set password里面用PASSWORD()函数来对密码进行加密，而mysqladmin没有用，mysqladmin不必用password(),系统将会自动为其加密.<br /></p>
		<p>在用grant命令增加用户或者是修改权限时在指定密码时也不必使用PASSWORD()函数加密。</p>
<img src ="http://www.blogjava.net/os586/aggbug/68535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-08 15:51 <a href="http://www.blogjava.net/os586/archive/2006/09/08/68535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下安装MySQL数据库及其使用 </title><link>http://www.blogjava.net/os586/archive/2006/09/08/68532.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Fri, 08 Sep 2006 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/08/68532.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68532.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/08/68532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68532.html</trackback:ping><description><![CDATA[
		<h2> </h2>一、什麽是 MySQL <br /><br />MySQL （发音为 "My Ess Que Ell"）是 Tcx 公司（http://www.tcx.se）开发的一个多人使用、多执行绪的 SQL 资料库 Server。MySQL 主要的目标在快速、稳定和容易使用。 <br /><br />MySQL 可在此 http://www.mysql.net/ 取得。 <br /><br />二、MySQL 的安装 <br /><br />本文所使用的 MySQL 版本为 mysql-3.22.27.tar.gz（原始码档），作业环境为 RedHat6.0 ＋CLE0.8 。 <br /><br />MySQL 预设情况下会安装至 /usr/local 目录下，不过为了日後移除方便，建议将 mysql 独立安装在 /usr/local/mysql 目录。底下为安装 MySQL 的步骤： <br /><br />取得 mysql-3.22.27.tar.gz 後， 於 /usr/local 目录下解开：  <br /># cd /usr/local <br /># tar zxvf mysql-3.22.27.tar.gz <br /># cd mysql-3.22.27 <br />设定 configure 安装选项，选择安装目录 （prefix）以及支援中文 Big5 码（with-charset=big5）：  <br /># ./configure --prefix=/usr/local/mysql \ <br />#--with-charset=big5 <br />开始编译并安装：  <br /># make <br /># make install <br /># scripts/mysql_install_db <br />最後一个步骤是用来产生 MySQL grant tables（会建立一个 mysql 资料库和一些 tables，用来管理使用 MySQL 的授权资讯，也就是使用者有哪些使用资料库的权限）。 <br /><br />三、启动、停止 MySQL <br /><br />要启动 MySQL 的方法：（以本文将 MySQL 安装在 /usr/local/mysql 为例） <br /><br /># /usr/local/mysql/share/mysql.server start <br />注意在第一次执行前，须将 mysql.server 设成可执行（chmod 744 mysql.server），另外可将这行指令加在 /etc/rc.d/rc.local 档中，让 MySQL 在开机时自动启动。 <br /><br />要停止 MySQL 的方法： <br /><br /># /usr/local/mysql/bin/mysqladmin shutdown <br />如果你为 MySQL Administrator root 帐号（非作业系统的 root）设了密码，要停止 MySQL 则必须像下列这样做，MySQL 会询问你 root 的密码後才会执行 shutdown 的工作： <br /><br /># /usr/local/mysql/bin/mysqladmin -u root -p shutdown <br />四、管理与使用 MySQL 简介 <br /><br />在你开始前  <br />MySQL 提供了许多工具 （Client Tools）来与 MySQL 资料库 Server 连线，其中最主要的为 mysql 交谈式连线工具与 mysqladmin 公用程式，大部份时候使用者会用 mysql 来和资料库 Server 交谈。底下就以 mysql 连线工具来介绍如何维护与使用 MySQL。（以本文安装为例，mysql 工具位於 /usr/local/mysql/bin/mysql）。 <br /><br />mysql 的使用语法如下： <br /><br />mysql [-u username] [-h host] [-p[password]] [dbname] <br />MySQL 资料库有自己一套使用者帐号与权限管控方法，所以这边所指定的 username 与  password 是 MySQL 的使用者与密码，而不是作业系统的使用者与密码（当然任何使用者都能执行 mysql ，然後以 MySQL 的任何帐号进入使用） 。 <br /><br />在你第一次安装好 MySQL 时，MySQL 的管理帐号为 root，没有设定密码 （非作业系统的 root）。所以在开始前，请先照下列步骤为  root 设好密码： <br /><br />使用 mysql 与 MySQL 资料库 Server 连线：  <br /># /usr/local/mysql/bin/mysql -u root mysql <br />Reading table information for completion of table and column names <br />You can turn off this feature to get a quicker startup with -A <br /><br />Welcome to the MySQL monitor.  Commands end with ; or \g.  <br />Your MySQL connection id is 201 to server version: 3.22.27  <br /><br />Type 'help' for help.  <br /><br />mysql&gt; <br />在下了 mysql -u root  mysql 指令，指定以 root 帐号并开启 mysql 系统资料库，连线至 MySQL 後，会看到一些提示讯息与 mysql 工具的提示符号，以後大部份的工作皆在此提示符号下完成。 <br /><br />更改 MySQL系统管理者 root 密码：  <br />mysql&gt; update user set password=password('新密码') where user='root';  <br />Query OK, 0 rows affected (0.00 sec) <br />Rows matched: 2  Changed: 0  Warnings: 0 <br /><br />mysql&gt; FLUSH PRIVILEGES; <br />Query OK, 0 rows affected (0.00 sec) <br /><br />mysql&gt; quit <br />Bye <br />注意每个指令後要加上一个分号 ";" 才会让 mysql 开始执行。而第二道指令会让已载入记忆体的 mysql 系统资料库更新，最後离开 mysql 工具程式。 <br /><br />在更新 root 密码後，日後要与 MySQL 连线的方法为： <br /><br />mysql  -u root -p新密码 <br />或者是这样，让 mysql 询问 root 的密码： <br /><br />mysql  -u root -p <br />资料库维护  <br />接下来，我们以简单的通讯录资料库作为例子，来介绍如何用 mysql 工具程式来做资料库的维护（新增、授权、资料表维护等）。 <br /><br />首先，以 MySQL root 帐号连线後建立一 addbook 资料库：  <br /># /usr/local/mysql/bin/mysql -u root -p <br />Enter password: <br />Welcome to the MySQL monitor.  Commands end with ; or \g.  <br />Your MySQL connection id is 207 to server version: 3.22.27  <br /><br />Type 'help' for help.  <br /><br />mysql&gt; create databae addbook; <br />Query OK, 1 row affected (0.00 sec) <br />指定使用 addbook 资料库，并建立一个 friends 资料表：  <br />mysql&gt; use addbook; <br />Database changed <br /><br />mysql&gt; create  table friends ( <br />　　-&gt; name Char(15), <br />　　-&gt; telphone VarChar(20), <br />　　-&gt; icq Char(10), <br />　　-&gt; address VarChar(30) <br />　　-&gt; ); <br />Query OK, 0 rows affected (0.00 sec) <br />新增几笔资料，并查询看看：  <br />mysql&gt; insert into friends values( <br />　　-&gt; "maa",  "29016710", "46243046", "台北县新庄市" <br />　　-&gt; ); <br />Query OK, 1 row affected (0.00 sec) <br /><br />mysql&gt; insert into friends (name, icq, telphone, address ) Values ( <br />　　-&gt; "cxlin", "39425893", "7654321", "台北县" <br />　　-&gt; ); <br />Query OK, 1 row affected (0.01 sec) <br /><br />mysql&gt; select * from friends; <br />+-------+----------+----------+--------------+ <br />| name  | telphone | icq      | address      | <br />+-------+----------+----------+--------------+ <br />| maa   | 29016710 | 46243046 | 台北县新庄市 | <br />| cxlin | 7654321  | 39425893 | 台北县       | <br />+-------+----------+----------+--------------+ <br />2 rows in set (0.00 sec) <br /><br />第二个 insert 指令指定了资料栏位的插入顺序，用法较第一个为弹性，而第一个指令必须依资料表建立结构时的顺序插入资料。 <br /><br />更新、删除资料表记录：  <br />mysql&gt; update friends set address =  "桃园县" where name  = "cxlin"; <br />Query OK, 1 row affected (0.00 sec) <br />Rows matched: 1  Changed: 1  Warnings: 0 <br /><br />mysql&gt; select * from friends where name = "cxlin"; <br />+-------+----------+----------+---------+ <br />| name  | telphone | icq      | address | <br />+-------+----------+----------+---------+ <br />| cxlin | 7654321  | 39425893 | 桃园县  | <br />+-------+----------+----------+---------+ <br />1 row in set (0.00 sec) <br /><br />mysql&gt; delete from friends where name = "maa"; <br />Query OK, 1 row affected (0.01 sec) <br /><br />mysql&gt; select * from  friends; <br />+-------+----------+----------+---------+ <br />| name  | telphone | icq      | address | <br />+-------+----------+----------+---------+ <br />| cxlin | 7654321  | 39425893 | 桃园县  | <br />+-------+----------+----------+---------+ <br />1 row in set (0.00 sec) <br />最後，建好资料库与资料表後，把 addbook 资料库中所有资料表的使用权限（select、insert、update、delete）授权给 maa@localhost（再次提醒，此处的 maa 为 MySQL 的使用者帐号，而非作业系统的 maa 帐号）：  <br />mysql&gt; grant select, insert, update, delete <br />    -&gt; on addbook.* <br />    -&gt; to maa@localhost identified by '1234567'; <br />Query OK, 0 rows affected (0.00 sec) <br />之後，可用 maa 的身份进入 MySQL 存取 addbook 资料库： <br /><br /># /usr/local/mysql/bin/mysql -u maa -p addbook <br />Enter password: <br />Reading table information for completion of table and column names <br />You can turn off this feature to get a quicker startup with -A <br /><br />Welcome to the MySQL monitor. Commands end with ; or \g. <br />Your MySQL connection id is 211 to server version: 3.22.27 <br /><br />Type 'help' for help. <br /><br />mysql&gt; status <br />-------------- <br />./mysql  Ver 9.36 Distrib 3.22.27, for pc-linux-gnu (i686) <br /><br />Connection id:          26 <br />Current database:       addbook <br />Current user:           maa@localhost <br />Server version          3.22.27 <br />Protocol version        10 <br />Connection              Localhost via UNIX socket <br />UNIX socket             /tmp/mysql.sock <br />Uptime:                 2 hours 29 min 33 sec <br /><br />Threads: 11  Questions: 107  Slow queries: 0  Opens: 11  Flush tables: 1 <br /> Open 7 <br />-------------- <br /><br />收回资料库使用权限的方法如下（以 MySQL root 进入）：  <br />mysql&gt; revoke delete on addbook.* from maa@localhost; <br />Query OK, 0 rows affected (0.00 sec) <br /><br />mysql&gt; revoke all privileges on addbook.* from  maa@localhost; <br />Query OK, 0 rows affected (0.00 sec) <br />第二个指令用来收回全部的权限。 <br /><br />　 <br /><br />五、mysqladmin 公用程式的使用 <br /><br />mysqladmin 公用程式可用来维护 MySQL 比较一般性的工作（新增、删除资料库、设定使用者密码及停止 MySQL 等等），详细的说明可以使用 mysqladmin --help 来查看。（以本文的安装为例 mysqladmin  位於 /usr/local/mysql/bin/mysqladmin）。 <br /><br />新增资料库 dbtest  <br /># /usr/local/mysql/bin/mysqladmin -u root -p create dbtest <br />Enter password: <br />Database "dbtest" created. <br />删除资料库  <br /># /usr/local/mysql/bin/mysqladmin -u root -p drop dbtest <br />Enter password: <br />Dropping the database is potentially a very bad thing to do. <br />Any data stored in the database will be destroyed. <br /><br />Do you really want to drop the 'dbtest' database [y/N] <br />y <br />Database "dbtest" dropped <br />设定使用者密码（将 maa 的密码改为  7654321，mysqladmin 会先询问 maa 的原密码）  <br /># /usr/local/mysql/bin/mysqladmin -u maa -p password 7654321 <br />Enter password: <br /># <br />停止 MySQL 服务  <br /># ./mysqladmin -u root -p shutdown <br />Enter password: <br />注意，shutdown MySQL 後，必须由作业系统的 root 帐号执行下列指令才能启动 MySQL： <br /><br /> /usr/local/mysql/share/mysql/mysql.server start  <br />六、结语： <br /><br />MySQL 资料库的确是值得推广的一个产品，它的稳定性已经稳得大家的赞同，只要你曾经学习过 SQL Language（结构化查询语言），相信要摸熟 MySQL 的使用只消一两个小时的时间。如果搭配 PHP （Personal  HomePage Program）和 Apache Web Server，更可很轻松建构一个与资料库结合的动态 Web Site。如果再配合 phpMyAdmin 这个 Web 化的 MySQL 管理工具，建立 MySQL 的资料库和  MySQL 的管理将会更加方便。 <br /><br />参考资料与资源： <br /><br />http://www.tcx.se/  <br />MySQL 3.23 Reference Manual  <br />The Apache Software Foundation  <br />PHP3 PHP Hypertext Preprocessor  <br />phpMyAdmin  <img src ="http://www.blogjava.net/os586/aggbug/68532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-08 15:47 <a href="http://www.blogjava.net/os586/archive/2006/09/08/68532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天需要用到Dos下的查找命令,拿出来跟大家共享</title><link>http://www.blogjava.net/os586/archive/2006/09/06/68041.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/68041.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68041.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/68041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68041.html</trackback:ping><description><![CDATA[
		<p>需要查找扩展名为.doc的文件,并且把其作 为列表输出.<br /><br />dir *.doc /s /a &gt;d:\list.txt<br /><br />这个就可以完成了.<br /><br />详细的内容大家看下面的文档.<br /><br />DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]<br />  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]</p>
		<p>  [drive:][path][filename]<br />              指定要列出的驱动器、目录和/或文件。</p>
		<p>  /A          显示具有指定属性的文件。<br />  attributes   D  目录                R  只读文件<br />               H  隐藏文件            A  准备存档的文件<br />               S  系统文件            -  表示“否”的前缀<br />  /B          使用空格式(没有标题信息或摘要)。<br />  /C          在文件大小中显示千位数分隔符。这是默认值。用 /-C 来<br />              停用分隔符显示。<br />  /D          跟宽式相同，但文件是按栏分类列出的。<br />  /L          用小写。<br />  /N          新的长列表格式，其中文件名在最右边。<br />  /O          用分类顺序列出文件。<br />  sortorder    N  按名称(字母顺序)     S  按大小(从小到大)<br />               E  按扩展名(字母顺序)   D  按日期/时间(从先到后)<br />               G  组目录优先           -  颠倒顺序的前缀<br />  /P          在每个信息屏幕后暂停。<br />  /Q          显示文件所有者。<br />  /S          显示指定目录和所有子目录中的文件。<br />  /T          控制显示或用来分类的时间字符域。<br />  timefield   C  创建时间<br />              A  上次访问时间<br />              W  上次写入的时间<br />  /W          用宽列表格式。<br />  /X          显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式，<br />              短名称插在长名称前面。如果没有短名称，在其位置则<br />              显示空白。<br />  /4          用四位数字显示年</p>
		<p>可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)<br />来替代预先设定的开关。例如，/-W。</p>
<img src ="http://www.blogjava.net/os586/aggbug/68041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 15:37 <a href="http://www.blogjava.net/os586/archive/2006/09/06/68041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 问题集锦------之二</title><link>http://www.blogjava.net/os586/archive/2006/09/06/68018.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/68018.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68018.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/68018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68018.html</trackback:ping><description><![CDATA[
		<!--文章页大屏幕-STAR--> 
<table align="right" border="0"><tbody><tr><td><script language="javascript" src="http://tech.eyeah.cn/inc/ab_center.js"></script></td></tr></tbody></table><!--文章页大屏幕-END-->数据库sysbase，有数据库aa，库中有表aa01，aa02，aa03……aa20<br />怎么用bcp语句一次性导出所有表，变成aa01.txt,aa02.txt^^^^^aa20.txt文件。<br />各位大虾帮帮忙啊！！！！<br /><br /><br /><br />好像只能是写20条bcp语句来导出吧，可以把这20条bcp语句放在一个文本文件中，将扩展名改为.bat，执行这个文件即可。<br />bcp aa..aa01 out d:\bcpdata\aa01.txt -Ssybase -Usa -P -c -a<br />...<br />bcp aa..aa20 out d:\bcpdata\aa20.txt -Ssybase -Usa -P -c -a<br />如果想备份aa中的所有表，我一般这么做：<br />1.采用下面的SQL语句形成bcp命令(在master库中执行)<br />select "bcp aa.."+name+" out d:\bcpdata"+name+".txt -Ssybase -Usa -P -c -a" from sysobjects where type = 'U'<br />2.将执行完成的输出结果形成批处理命令<br />只需将形成的输出结果拷贝到拷贝记事本中，并更改扩展名为.bat即可<br />3.在DOS的提示符下执行形成的批处理文件<br /><img src ="http://www.blogjava.net/os586/aggbug/68018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 13:39 <a href="http://www.blogjava.net/os586/archive/2006/09/06/68018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 相关问题集锦------之一</title><link>http://www.blogjava.net/os586/archive/2006/09/06/68016.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/68016.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/68016.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/68016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/68016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/68016.html</trackback:ping><description><![CDATA[
		<p>1.Sybase怎样把一台服务器的数据库备份到另一台服务器当中?<br /><br />1.首先保证两台机器都安装了sybase的服务器版本；保证两台机器网络连接畅通<br />2.假定A机的服务及备份服务分别叫aaa,aaa_BS，B机的服务及备份服务分别叫bbb,bbb_BS<br />3.假定要将A机aaa服务中的生产库a_mydb备份到B机操作系统<br />方法：<br />启动A,B两机的备份服务<br />在A机sybase目录下的interfaces文件中添加B机备份服务bbb_BS的条目入口<br />按如下语法进行备份测试<br />isql连接到A机服务<br />isql -Usa -P密码 -Saaa<br />1&gt;dump database a_mydb to 'B机的路径及备份文件名' at bbb_BS<br />2&gt;go<br /><br /><br /><br /><br />2.怎样删除一个数据库设备?<br /><br />isql登录到sybase服务<br />1.首先确保没有任何数据在使用该设备<br />可以sp_helpdb查询所有数据库，看它使用了哪些设备<br />2.sp_dropdevice 设备名<br />删除无用的设备<br />3.手工删除对应的操作系统文件</p>
<img src ="http://www.blogjava.net/os586/aggbug/68016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 13:34 <a href="http://www.blogjava.net/os586/archive/2006/09/06/68016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 基础知识点总结-----有助于总体的学习Sybase数据库</title><link>http://www.blogjava.net/os586/archive/2006/09/06/67979.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/67979.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/67979.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/67979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/67979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/67979.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一讲  Sybase基础知识一、客户/服务器体系结构Sybase是一种建立在客户/服务器体系结构上的数据库管理系统。●什么是客户/服务器体系结构？从硬件角度看，客户/服务器体系结构是指将某项任务在两台或多台机器之间进行分配，其中客户机（Client）用来运行提供用户接口和前端处理的应用程序，服务器机（Server）提供客户机使用的各种资源和服务。从软件角度看，客户/服务器体系结构是把某项应用或软...&nbsp;&nbsp;<a href='http://www.blogjava.net/os586/archive/2006/09/06/67979.html'>阅读全文</a><img src ="http://www.blogjava.net/os586/aggbug/67979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 11:20 <a href="http://www.blogjava.net/os586/archive/2006/09/06/67979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Sybase数据库 定时备份的文章</title><link>http://www.blogjava.net/os586/archive/2006/09/06/67975.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/67975.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/67975.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/67975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/67975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/67975.html</trackback:ping><description><![CDATA[我从来没接触过SYBASE数据库，现在老总给我个任务，叫我给SYBASE数据库定时备份，我看了好多资料都不明白，主要是没个思路，不知道是要编程解决还是通过设置SYBASE数据库自己备份，急死我了  <br />我想写个备份的进程，定时备份，可是不知道SYBASE的接口是怎么样的，怎么与SYBASE数据库交互  <br />请大家帮我出出主意，了解这些的朋友请给个思路，谢谢了  <br />---------------------------------------------------------------  <br /> <br />如果是UNIX下的就通过使用crontab了。WIN平台下面有一个任务管理器。也可以相应使用。  <br />---------------------------------------------------------------  <br /> <br />看看bcp命令和dump，load命令了。有书的话。  <br />---------------------------------------------------------------  <br /> <br />sybase不提供定时备份功能，自己写脚本放到cron或计划任务  <br /> <br />建立批处理back.bat或sh脚本，脚本内容为  <br />isql  -Usa  -P  -STESTSVR–o  /sybase  /dump.log（用于产生日志，windows下指定window格式的路径）  –i  dump.sql    <br /> <br />备份工作通过isql调用备份脚本实现：    <br />   <br />isql  -Usa  -P  -STESTSVR–o  /sybase  /dump.log  –i  dump.sql    <br />   <br />为使sybase用户成功执行本操作，我们应同时将sybase的环境变量定制在dump.sh中，其主要命令可参考sybase用户的.profile文件。另外，本命令从外部读取的备份脚本dump.sql文件的内容如下：    <br />   <br />declare  @ddate  char(28)  /*  定义一个变量，用于备份的文件名称  */    <br />select  @ddate  =  '/sybase/backup/dbname'  +  convert(char(6),  getdate(),  12)  +  stuff(convert(char(5),  getdate(),  8),3,1,null)  +”.dmp”/*  将当前日期进行转换  */    <br />dump  database  test  to  @ddate    <br />dump  transaction  with  truncate_only    <br /> <br />go    <br />   <br />说明：该脚本将当前日期进行转换，形成备份的文件名，其格式为：  backupyymmddhhmi  <br /> <br /> <br />最后把批处理back.bat或sh分别加入计划任务或cron  <br />这里给出cron的方法，计划任务很容易，不说了  <br /> <br />①.定义权限并定制cron  job    <br /> UNIX系统中有一条命令crontab，通过它我们可以定制cron  job,它安排各命令在指定的时间间隔内执行，有定时器的功能。我们所制定的自动备份及自动检测方案就是用它来实现的。但是，并不是每个UNIX系统的用户都有权限使用它。    <br />HP  UNIX在默认情况下只有root,admin,uucp三个用户有权限使用，这时我们需要将数据库管理员sybase用户添加到cron.allow文件中。首先，应以root用户身份登录，到路径／var／adm／cron下确认无cron.deny文件，或该文件中无sybase这条记录。然后，编辑cron.allow文件，将sybase  用户添加进去，这样，sybase用户就有了定制cron  job的权限。      <br />以sybase用户登录后，执行crontab  –e  编辑cron  job,  例：    <br />   <br />00  18  *  *  *  /sybase/dump.sh    <br />   <br />其中，第一条命令的意思是在每天的18∶00开始自动执行脚本文件dump.sh，对数据库进行备份,  dump.sh  的编辑在后面讨论。第二条命令是在每月15日的21∶30自动执行脚本文件dbcc.sql，对数据库进行数据的一致性检测，其结果输出到文件dbcc.err中。当然，我们应该根据不同情况适当调整定义的工作时间。 <img src ="http://www.blogjava.net/os586/aggbug/67975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 11:04 <a href="http://www.blogjava.net/os586/archive/2006/09/06/67975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase 当中进行增量备份的几点注意事项</title><link>http://www.blogjava.net/os586/archive/2006/09/06/67973.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Wed, 06 Sep 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/09/06/67973.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/67973.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/09/06/67973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/67973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/67973.html</trackback:ping><description><![CDATA[Sybase 在进行增量备份的时候,需要注意以下几点:<br /><br />首先: 在建库的时候,必须把数据库设备与日志设备进行单独的处理,不能把数据库和日志建立在同样的设备上.这样不符合增量备份的要求.因为增量备份就是对数据库事务日志的备份.当然如果能够把索引设备单独分出会更好.<br /><br />其次: 在进行增量备份以前,最好做一次数据库的完全备份.这样以备数据库故障的发生导致数据库无法恢复.而其后可以进行数据的增量备份.<br /><br />第三:在进行数据库载入的时候: 特别是对数据库进行全部载入后,先不要对数据库进行online database操作,要把数据库和日志一并载入后再执行online操作.<br /><br />这样就不会提示 "dump device" is out of sequence 错误了.<br /><br /><img src ="http://www.blogjava.net/os586/aggbug/67973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-09-06 10:59 <a href="http://www.blogjava.net/os586/archive/2006/09/06/67973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Sybase的日志管理学习</title><link>http://www.blogjava.net/os586/archive/2006/07/13/58023.html</link><dc:creator>水煮三国</dc:creator><author>水煮三国</author><pubDate>Thu, 13 Jul 2006 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/os586/archive/2006/07/13/58023.html</guid><wfw:comment>http://www.blogjava.net/os586/comments/58023.html</wfw:comment><comments>http://www.blogjava.net/os586/archive/2006/07/13/58023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/os586/comments/commentRss/58023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/os586/services/trackbacks/58023.html</trackback:ping><description><![CDATA[SYBASE公司是世界著名的数据库厂家，其关系数据库产品SYBASE SQL Server在中国大中型企事业单位中拥有大量的用户。笔者在多年的使用过程中，总结出SYBASE数据库管理和维护的一些经验，现拿出来与大家分享。
<p>　　我们知道，SYBASE　SQL Server用事务（Transaction）来跟踪所有数据库的变化。事务是SQL　Server的工作单元。一个事务包含一条或多条作为整体执行的T-SQL语句。每个数据库都有自己的事务日志（Transaction　Log），即系统表（Syslogs）。事务日志自动记录每个用户发出的每个事务。日志对于数据库的数据安全性、完整性至关重要，我们进行数据库开发和维护必须熟知日志的相关知识。<br /><br /><br /><strong>一、SYBASE　SQL Server 如何记录和读取日志信息<br /><br /></strong>　　SYBASE　SQL Server是先记Log的机制。每当用户执行将修改数据库的语句时，SQL　Server就会自动地把变化写入日志。一条语句所产生的所有变化都被记录到日志后，它们就被写到数据页在缓冲区的拷贝里。该数据页保存在缓冲区中，直到别的数据页需要该内存时，该数据页才被写到磁盘上。若事务中的某条语句没能完成，SQL　Server将回滚事务产生的所有变化。这样就保证了整个数据库系统的一致性和完整性。<br /><br />　　<b>二、日志设备</b><br /><br />　　Log和数据库的Data一样，需要存放在数据库设备上，可以将Log和Data存放在同一设备上，也可以分开存放。一般来说，应该将一个数据库的Data和Log存放在不同的数据库设备上。这样做有如下好处：一是可以单独地备份Backup事务日志；二是防止数据库溢满；三是可以看到Log的空间使用情况。<br /><br />　　所建Log设备的大小，没有十分精确的方法来确定。一般来说，对于新建的数据库，Log的大小应为数据库大小的30%左右。Log的大小还取决于数据库修改的频繁程度。如果数据库修改频繁，则Log的增长十分迅速。所以说Log空间大小依赖于用户是如何使用数据库的。此外，还有其它因素影响Log大小，我们应该根据实际操作情况估计Log大小，并间隔一段时间就对Log进行备份和清除。 <br /><br />　　<b>三、日志的清除</b><br /><br />　　随着数据库的使用，数据库的Log是不断增长的，必须在它占满空间之前将它们清除掉。清除Log有两种方法：<br /><br />　　1.自动清除法<br /><br />　　开放数据库选项 Trunc Log on Chkpt，使数据库系统每隔一段时间自动清除Log。此方法的优点是无须人工干预，由SQL　Server自动执行，并且一般不会出现Log溢满的情况；缺点是只清除Log而不做备份。<br /><br />　　2.手动清除法<br /><br />　　执行命令“dump transaction”来清除Log。以下两条命令都可以清除日志：<br /><br />dump transaction with truncate_only<br />dump transaction with no_log <br /><br />　　通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令，这条命令写进事务日志时，还要做必要的并发性检查。SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况，使用这条命令有很大的危险性，SQL　Server会弹出一条警告信息。为了尽量确保数据库的一致性，你应将它作为“最后一招”。<br /><br />　　以上两种方法只是清除日志，而不做日志备份，若想备份日志，应执行“dump transaction database_name to dumpdevice”命令。<br /><br />　　<b>四、管理庞大的事务</b><br /><br />　　有些操作会大批量地修改数据，如大量数据的修改（Update）、删除一个表的所有数据（Delete）、大量数据的插入（Insert），这样会使Log增长速度很快，有溢满的危险。下面笔者给大家介绍一下如何拆分大事务，以避免日志的溢满。<br /><br />　　例如执行“update tab_a set col_a=0”命令时，若表tab_a很大，则此Update动作在未完成之前就可能使Log溢满，引起1105错误（Log Full），而且执行这种大的事务所产生的独占锁（Exclusive Table Lock），会阻止其他用户在执行Update操作期间修改这个表，这就有可能引起死锁。为避免这些情况发生，我们可以把这个大的事务分成几个小的事务，并执行“dump transaction”动作。 <br /><br />　　上例中的情况就可以分成两个或多个小的事务： <br /><br />update tab_a set col_a=0 where col_b&gt;x <br />go<br />dump transaction database_name with truncate_only <br />go <br />update tab_a set col_a=0 where col_b &lt;=x <br />go <br />dump transaction database_name with truncate_only <br />go <br /><br />　　这样，一个大的事务就被分成两个较小的事务。<br /><br />　　按照上述方法可以根据需要任意拆分大的事务。若这个事务需要备份到介质上，则不用“with truncate_only”选项。若执行“dump transaction with truncate_only”命令，应该先执行“dump database”。以此类推，我们可以对表删除、表插入等大事务做相应的拆分</p><img src ="http://www.blogjava.net/os586/aggbug/58023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/os586/" target="_blank">水煮三国</a> 2006-07-13 17:05 <a href="http://www.blogjava.net/os586/archive/2006/07/13/58023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>