公司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 阅读(215) |
评论 (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 阅读(5687) |
评论 (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 阅读(1320) |
评论 (0) |
编辑 收藏
摘要: Oracle 8.1.7.4
升级
Oracle 10.2
Oracle
提供了升级工具让用户可以将
Database
从低版本升级到更高的版本
,8i
可以直接升级到
10G
...
阅读全文
posted @
2006-09-07 17:32 Kevensun 阅读(1821) |
评论 (0) |
编辑 收藏
前一段时间听同事将网上有免费电话,一直没时间去证实.今天晚上没事,该看的新闻都看了,于是上
http://www.redvip.net下载了软件,安装相当简单.安装完后需要简单的注册,需要输入密码,手机号码,及介绍人的VIP号,输了我同事的号码92691190,为了保险其间,输手机号时用了要换掉的手机号码(没钱在里面,以免被奸商扣钱),结果,换好旧卡刚开机,就收到了验证码,输了进去,报告错误.就知道奸商骗钱.再仔细看了一下收到的码,少输了一个又1,再来一次,通过了验证,显示注册成功.立刻进入redvip软件,画面相当简单,点开我的帐户,已经有本质区5元钱在里面了.试着打了一下家里的电话,"有电话啦",家里的电话铃响了,应该OK了.赶快用QQ通知了所有在线的朋友,一方面告诉他们好消息,一方面,他们注册,可以为我带来5元的介绍费,呵呵.
posted @
2006-06-10 23:35 Kevensun 阅读(165) |
评论 (0) |
编辑 收藏
几经周折,公司的Skype pbx终于正常运做了.公司员工可以用公司内线电话通过Skype pbx免费拨到母公司的电话网,出差员工,合作伙伴也可利用Skype免费拨到公司的电话系统,公司员工,也可以通过内线电话,利用Skype pbx拨Skype Out拨到全球几乎所有传统电话上,而费用仅需要0.17元每分钟,相比高昂的传统电话费要低很多倍.如果真正利用起来,公司的长途电话应该可以省去多一半,可惜大陆没有买Skype Out点数的地方,用同事的信用卡在moneybookers上买了好多次,均无法支付,不知何时这么先进的设备才能真正为公司省钱呀.
posted @
2006-04-15 14:16 Kevensun 阅读(378) |
评论 (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 阅读(840) |
评论 (0) |
编辑 收藏
引言:
上星期天晚上10点,同事打电话到家了,反映数据库的TNS时通时断,严重影响生产。判断应该是内存用完造成用户无发连接造成。可是我在星期天上午才将内存由1.5G增加到4G。无论如何没办法在家解决,只好告诉上夜班的同事每半小时将网卡中断一次,以便让产线可以使用。
星期一上班,打开boot.ini,发现在内存增加后没有加 /3G开关。加上/3G参数,重新启动电脑,过了约半小时,产线反应问题复现---Ora-012500错误。看来没有彻底解决。在网上查找异常原因,发现原因是虽然内存有4G,但Oracle能用的只有2G(需要做一些修改才能超越此限制,但时间不允许),而我的SGA用了1.5G, 在独占模式下,每一个session将单独分配2M左右的内存,300个Session需要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降低到1G,Shutdown Database,再Startup,问题解决。
posted @
2006-03-14 20:47 Kevensun 阅读(5811) |
评论 (0) |
编辑 收藏
引言:
年前公司的生产数据库的一个index的block损坏,此index有约90G,rebuilt之后仍然是坏的,决定借春节放假期间删除重新index, 花费了整个假期重建了所有Index,删除了旧的Tablesapce.
开春上班,以为万事大吉,结果更惨。生产部门反应数据库很慢。用Spotlight监控DB,发现CPU使用率高达100%,之前CPU使用率平均只有30%。开始怀疑Index的存储参数被我改的不够优化了。于是不断的修改DB的各个参数,结果收效甚微。请教总公司的资深DBA,她老人家通过VNC连线看了好几天,说:“你的IO很高,数据库的负担很重,这是正常的。你刚做这一行,认为存储参数影响DB效能很正常,不过以我的经验,这些参数根本不影响DB效能。”我说可是在之前很好,是我重建Index之后才这样的。她说:“现在和之前的使用量相同吗?你能确定使用量相同吗?环境是在变化的。”她这样说我也没法,只好自己动手丰衣足食。
那天是星期五,比较少事,于是静下心来寻找问题点。打开Spotlight,看Top session,看那一个Session占CPU最多。找到CPU使用率最高的Session,查看其SQL,发现是一Select语句,看看这条Sql是否有全表扫描,发现没有用到Index.立刻用Toad建立了相应Index,查看Spotlight,发现CPU使用率降低啦!趁热打铁,再找,有找到一条,再建Index,再看Spotlight,CPU使用率已经降低到之前的平均水平。再询问生产单位,反映已经恢复到之前的水平
posted @
2006-03-14 20:45 Kevensun 阅读(1136) |
评论 (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 阅读(2548) |
评论 (2) |
编辑 收藏