posts - 13,comments - 3,trackbacks - 0
      公司LCS开通了对外和MSN通讯的供能,可老板要求员工只能和经过审批的人员通讯。跟踪Sql Server后发现解决之道,现分享给大家。
      先在LCS的数据库 rtc 增加一个Table 如mycontact, 只有一列 UserAtHost ,类型为 nvarchar 450,将公司允许的联络人汇入,然后修改名为
RtcpEnsureResourceExists 的 procedure 。以 下是修改过的,其中红色部分是新增的语句,xxx.com.cn是公司的网域名

---------------------------------------------------------------------------
--
--
CREATE procedure RtcpEnsureResourceExists
    @_UserAtHost    nvarchar(4000),
  
    @_ResourceId    ResourceId output
as
    set nocount on
    declare @Error int
    declare  @_contact          nvarchar(4000)
    --
    -- Check to see if the resource already exists; if not, insert it.
    --
    select @_ResourceId = ResourceId
      from Resource
     where UserAtHost = @_UserAtHost
 
    select @_contact=UserAtHost
     from mycontact
    where UserAtHost = @_UserAtHost
 
    if ((@_ResourceId is null) and (@_contact is not null)) or (@_UserAtHost like '%xxx.com.cn')  begin
        --
        -- Deadlock possibility:
        -- Unfortunately we have the potential for deadlock here.  If two
        -- connections have both acquired the shared lock on the row due
        -- to the query above, and the row does not exist, they both
        -- will try to escalate their shared lock to an exclusive lock in
        -- order to perform the following insert.  Preventing this by
        -- using with (updlock) on the select would not be a good thing
        -- however.  This is because the update lock would be held for the
        -- duration of the transaction (because we run at a high enough
        -- isolation level) thus preventing anyone from even selecting the
        -- row until our transaction was completed.  We explicitly choose
        -- the possibility of deadlock over the reduced concurrency.  Note
        -- that the possibility of deadlock is extremely rare -- two
        -- connections need to be ensuring that the same row exists at
        -- the same time when it doesn't exist.
        --
        insert Resource (UserAtHost) values (@_UserAtHost)
        set @Error = @@error
        if (@Error = 0) begin
            set @_ResourceId = scope_identity()
            return 0
        end
        --
        -- Unique key violation - row already exists, so select it again.
        --
        else if (@Error = 2627) begin
            select @_ResourceId = ResourceId
              from Resource
             where UserAtHost = @_UserAtHost
            if (@_ResourceId is null) begin
                exec dbo.DbRaiseError @@procid, 50120, @_UserAtHost
                return -1
            end
            else begin
                --
                -- Raise an error to indicate that Unique key violation was
                -- handled.
                --
                exec dbo.DbRaiseError @@procid, 50002
                return 0
            end
        end
        --
        -- Some other problem with inserting the row.
        --
        else begin
            exec dbo.DbRaiseError @@procid, 50001
            return -1
        end
    end
GO
posted @ 2006-10-13 12:44 Kevensun 阅读(205) | 评论 (0)编辑 收藏

在做 EXP 时出现如下错误 ,

 

EXP-00008: ORACLE 错误 1555 发生
ORA-01555: snapshot too old: rollback segment number 52 with name "RBS51" too small
汇出作业顺利终止 , 但含有警告

 

网上搜到的解法均是增加回滚段的大小 , 可是我已经增加的很大了 , 仍报这个错 . 看来是要导出的数据量太大 , 分段导出试试 , 修改 EXP 指令为 exp its/its@it tables=(BARCODE_INFO) file=(barcode2.dmp,barcode3.dmp,barcode4.dmp,barcode5.dmp,barcode6.dmp,barcode7.dmp,barcode8.dmp,barcode9.dmp,barcode10.dmp,barcode11.dmp)  filesize=2000m  constraints=n buffer=131072 recordlength=64000 triggers=n log=logsfis.log indexes=n compress=n feedback=1000 parfile=exp.txt

 

Parfile.txt

query="WHERE make_date BETWEEN TO_DATE ('2006-01-01 00:00:01','yyyy-mm-dd hh24:mi:ss') AND TO_DATE ('2007-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')"

其实 , 在导出的过程中仍遇到问题 , 后来取消了 direct=y 后正常 , 估计 direct=y 不能和 query 共存 .

posted @ 2006-09-15 18:17 Kevensun 阅读(5679) | 评论 (0)编辑 收藏

    看完 Oracle 提供的升级文档,按照上面讲的方法升级几次失败 . 经过自己多此实验 , 升级成功 , 现在将升级过程分享给大家

1.      安装 Oracle 10G 到一台 64 位系统上 , 不要创建 Database.

2.      将原来的 32 DB Shutdown, 将所有 Data 文件 Copy 64 位系统上

3.      32 位的初始化文件 Copy 64 系统正确的位置

4.      oradim Create 一新的实例 ( Copy 过来的初始化参数文件 )

5.      修改初始化文件 , 增加 _SYSTEM_TRIG_ENABLED = false 参数

6.      Shutdown 64 Database

7.      Stratup nomount

8.      Create control file( 例如 , 你的要根据你的 DB 修改 )

CREATE CONTROLFILE REUSE DATABASE "T1" NORESETLOGS NOARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 32
    MAXINSTANCES 16
    MAXLOGHISTORY 1815
LOGFILE
    GROUP 1 'C:\oracle\product\10.1.0\oradata\orcl64\REDO03.LOG'  SIZE 1M, 
    GROUP 2 'C:\oracle\product\10.1.0\oradata\orcl64\REDO02.LOG'  SIZE 1M,
    GROUP 3 'C:\oracle\product\10.1.0\oradata\orcl64\REDO01.LOG'  SIZE 1M
DATAFILE
   'C:\oracle\product\10.1.0\oradata\orcl64\SYSTEM01.DBF',
    'C:\oracle\product\10.1.0\oradata\orcl64\RBS01.DBF',
   'C:\oracle\product\10.1.0\oradata\orcl64\USERS01.DBF',
   'C:\oracle\product\10.1.0\oradata\orcl64\TEMP01.DBF',
   'C:\oracle\product\10.1.0\oradata\orcl64\TOOLS01.DBF',
   'C:\oracle\product\10.1.0\oradata\orcl64\INDX01.DBF',
   'C:\oracle\product\10.1.0\oradata\orcl64\DR01.DBF'
9.
      Shutdown immediate

10.  Startup upgrade

11.  SPOOL catoutw.log

12.  SET ECHO ON;

13.  SQL>@C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlirp.sql;

14.  SPOOL OFF;

15.  Shutdown immediate

16.  SET ECHO OFF;

17.  Startup

18.  SQL>@C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlrp.sql;

19.Shutdown immediate
20.再次修改初始参数文件,删除参数 _SYSTEM_TRIG_ENABLED = false
21.Startup
升级完成

posted @ 2006-09-08 17:53 Kevensun 阅读(1312) | 评论 (0)编辑 收藏
     摘要: Oracle 8.1.7.4 升级 Oracle 10.2     Oracle 提供了升级工具让用户可以将 Database 从低版本升级到更高的版本 ,8i 可以直接升级到 10G ...  阅读全文
posted @ 2006-09-07 17:32 Kevensun 阅读(1808) | 评论 (0)编辑 收藏
           前一段时间听同事将网上有免费电话,一直没时间去证实.今天晚上没事,该看的新闻都看了,于是上
 http://www.redvip.net下载了软件,安装相当简单.安装完后需要简单的注册,需要输入密码,手机号码,及介绍人的VIP号,输了我同事的号码92691190,为了保险其间,输手机号时用了要换掉的手机号码(没钱在里面,以免被奸商扣钱),结果,换好旧卡刚开机,就收到了验证码,输了进去,报告错误.就知道奸商骗钱.再仔细看了一下收到的码,少输了一个又1,再来一次,通过了验证,显示注册成功.立刻进入redvip软件,画面相当简单,点开我的帐户,已经有本质区5元钱在里面了.试着打了一下家里的电话,"有电话啦",家里的电话铃响了,应该OK了.赶快用QQ通知了所有在线的朋友,一方面告诉他们好消息,一方面,他们注册,可以为我带来5元的介绍费,呵呵.
posted @ 2006-06-10 23:35 Kevensun 阅读(156) | 评论 (0)编辑 收藏

几经周折,公司的Skype pbx终于正常运做了.公司员工可以用公司内线电话通过Skype pbx免费拨到母公司的电话网,出差员工,合作伙伴也可利用Skype免费拨到公司的电话系统,公司员工,也可以通过内线电话,利用Skype pbx拨Skype Out拨到全球几乎所有传统电话上,而费用仅需要0.17元每分钟,相比高昂的传统电话费要低很多倍.如果真正利用起来,公司的长途电话应该可以省去多一半,可惜大陆没有买Skype Out点数的地方,用同事的信用卡在moneybookers上买了好多次,均无法支付,不知何时这么先进的设备才能真正为公司省钱呀.

posted @ 2006-04-15 14:16 Kevensun 阅读(371) | 评论 (0)编辑 收藏

Oracle Database的主机被异常关机,重新启动电脑,Database报ORA-27101 shared memory realm does not exist 错误.看来是service损坏啦.删除Service再建一新的,看看效果如何.
C:\>oradim -delete -sid sfis
C:\>oradim -new -sid sfis -startmode auto -pfile d:\pfile\initsfis.ora
重新启动Service,启动成功.

posted @ 2006-03-31 09:05 Kevensun 阅读(832) | 评论 (0)编辑 收藏
  引言:

上星期天晚上10点,同事打电话到家了,反映数据库的TNS时通时断,严重影响生产。判断应该是内存用完造成用户无发连接造成。可是我在星期天上午才将内存由1.5G增加到4G。无论如何没办法在家解决,只好告诉上夜班的同事每半小时将网卡中断一次,以便让产线可以使用。

 星期一上班,打开boot.ini,发现在内存增加后没有加 /3G开关。加上/3G参数,重新启动电脑,过了约半小时,产线反应问题复现---Ora-012500错误。看来没有彻底解决。在网上查找异常原因,发现原因是虽然内存有4G,但Oracle能用的只有2G(需要做一些修改才能超越此限制,但时间不允许),而我的SGA用了1.5G, 在独占模式下,每一个session将单独分配2M左右的内存,300Session需要600M,显然,内存已经不够用了。

 根据以上分析,解决方法当然有3种,一是修改系统参数,让Oracle能够使用超过2G的内存,这需要在测试环境测过才可在正式环境进行,解决问题优先,这个以后再试。第二是减小为每一个会话分配的内存大小,以能连接更多的用户。三是减小SGA的大小。第二个方法其实很简单,先停止oracle服务和TNS服务,再运行以上命令
C:\oracle\ora81\bin>orastack oracle.exe 500000
Dump of file oracle.exe
Current Reserved Memory per Thread = 1048576
Current Committed Memory per Thread = 4096
New Reserved Memory per Thread = 500000
C:\oracle\ora81\bin>orastack tnslsnr.exe 500000

Dump of file tnslsnr.exe

Current Reserved Memory per Thread = 1048576
Current Committed Memory per Thread = 4096
New Reserved Memory per Thread = 500000
重新启动oracle服务和TNS服务,打开数据库。不过这个也没做过,需要测试。看来降低SGA最简单。打开init.ora文件,将SGA降低到1GShutdown Database,Startup,问题解决。

posted @ 2006-03-14 20:47 Kevensun 阅读(5790) | 评论 (0)编辑 收藏
  引言:

     年前公司的生产数据库的一个indexblock损坏,此index有约90Grebuilt之后仍然是坏的,决定借春节放假期间删除重新index, 花费了整个假期重建了所有Index,删除了旧的Tablesapce.

     开春上班,以为万事大吉,结果更惨。生产部门反应数据库很慢。用Spotlight监控DB,发现CPU使用率高达100%,之前CPU使用率平均只有30%。开始怀疑Index的存储参数被我改的不够优化了。于是不断的修改DB的各个参数,结果收效甚微。请教总公司的资深DBA,她老人家通过VNC连线看了好几天,说:“你的IO很高,数据库的负担很重,这是正常的。你刚做这一行,认为存储参数影响DB效能很正常,不过以我的经验,这些参数根本不影响DB效能。”我说可是在之前很好,是我重建Index之后才这样的。她说:“现在和之前的使用量相同吗?你能确定使用量相同吗?环境是在变化的。”她这样说我也没法,只好自己动手丰衣足食。

     那天是星期五,比较少事,于是静下心来寻找问题点。打开Spotlight,看Top session,看那一个SessionCPU最多。找到CPU使用率最高的Session,查看其SQL,发现是一Select语句,看看这条Sql是否有全表扫描,发现没有用到Index.立刻用Toad建立了相应Index,查看Spotlight,发现CPU使用率降低啦!趁热打铁,再找,有找到一条,再建Index,再看SpotlightCPU使用率已经降低到之前的平均水平。再询问生产单位,反映已经恢复到之前的水平
posted @ 2006-03-14 20:45 Kevensun 阅读(1121) | 评论 (1)编辑 收藏

引言:

数据库突然报: ORA-01654: unable to extend index BO.INDEX_indexname by 311072 in tablespace 错误,上网查原因,发现解决之道只有一个,就是增加tablespace的大小.因我的database的tablespace已经足够大了,最后发现不是tablespace不足,而是参数错误.现归纳解决此问题的方法如下.

方法1:

   当出现类似错误时,首先检查tablespace的空间是否足够大,如果不够大,说明tablespace的空间不够扩展了,这时候需要将tablespace的datafile的size变大,方法很简单我就不讲了,或增加新的datafile到此tablespace中,使用alter tablespace mytablespace add datafile 'XXX' size xxxx就OK啦.

方法2:

   这就是我这此遇到的问题.我的datafile的size为2000m,而我的index的next extent为2G,pct increase为50,这样一来下一个要扩展的extent为3G,而我的datafile的Size为2G,故无发找到连续3G的空间,当然会出错.

   问题找到了,解决当然很简单,修改next extent 为128k,pct increase为0,问题解决. 
            不知道是谁设定的,真是个低级错误.

posted @ 2006-03-14 20:44 Kevensun 阅读(2509) | 评论 (2)编辑 收藏
仅列出标题  下一页