【转载】Oracle常见问题及解决办法_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
5
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 5160 | 回复: 4   主题: 【转载】Oracle常见问题及解决办法        下一篇 
红与黑
注册用户
等级:上尉
经验:644
发帖:51
精华:1
注册:2013-2-25
状态:离线
发送短消息息给红与黑 加好友    发送短消息息给红与黑 发消息
发表于: IP:您无权察看 2013-2-25 17:55:08 | [全部帖] [楼主帖] 楼主

启动oracle报ORA-01092错误解决方法
启动oracle报ORA-01092错误
执行startup报下面错误;

SQL> startup
ORA-01092: ORACLE instance terminated. Disconnection forced
Process ID: 1358
Session ID: 170 Serial number: 5


查看日志${ORACLE_BASE}/diag/rdbms/ora88/ora88/alert/log.xml报错信息如下:

< /msg>
< msg time='2010-04-22T17:20:12.913+08:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='ATAE131' host_addr='10.137.3.152' module='sqlplus@ATAE131 (TNS V1-V3)'
pid='31101'>
<txt>Errors in file /opt1/oracle/diag/rdbms/ora88/ora88/trace/ora88_ora_31101.trc:
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
</txt>
< /msg>
< msg time='2010-04-22T17:20:12.913+08:00' org_id='oracle' comp_id='rdbms'
client_id='' type='UNKNOWN' level='16'
host_id='ATAE131' host_addr='10.137.3.152' module='sqlplus@ATAE131 (TNS V1-V3)'
pid='31101'>
<txt>Error 704 happened during db open, shutting down database
</txt>
< /msg>


原因是因为:oracle 10201升级到10204后出现的问题
解决方法如下:

SQL> startup upgrade


重建数据字典表

SQL> @?/rdbms/admin/catupgrd.sql


编译失效对象

SQL> @?/rdbms/admin/utlrp.sql
SQL> @?\rdbms\admin\catalog.sql
SQL>shutdown immediate
SQL>startup


数据库启动成功

删除数据库用户失败,报“ORA-01940”
问题描述
删除数据库用户失败,系统显示如下错误信息:

SQL> drop user username cascade;
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected


说明:
username表示数据库用户名。
原因分析
查看数据库的联机错误码:

oracle@MDSPyun168:~> oerr ora 01940
01940, 00000, "cannot drop a user that is currently connected"
// *Cause: Attempt was made to drop a user that is currently logged in.
// *Action: Make sure user is logged off, then repeat command.


从错误码的信息看该数据库用户有session连接到数据库。
解决方法
1. 以oracle用户登录数据库所在机器。
2. 以sysdba用户连接数据库。

% sqlplus / as sysdba


3. 查询该用户的session。

SQL> select username, sid, serial# from v$session;


系统显示如下信息:

SQL> select username, sid, serial# from v$session;
USERNAME SID SERIAL#
------------------------------ ---------- ----------
USERDB1 402 191
SYS 404 333
CBEDB1 405 7
CBEDB1 406 2
USERNAME SID SERIAL#
------------------------------ ---------- ----------
SYSDB 426 150
USERDB1 427 176


4. 删除该用户的session。

SQL> alter system kill session 'sid,serial#';


说明:

sid、serial#应该填写3实际查询出来的结果。


5. 查看session的状态,验证session是否被删除。

SQL> select saddr, sid, serial#, paddr, username,status from v$session where username is not null;


• 如果用户的session状态status值为inactive,说明没有被删除。请执行4。
• 如果用户的session状态status值为killed,说明已经删除。
6. 删除该用户。

SQL> drop user username cascade;


删除用户成功,系统显示如下信息:

User dropped.


删除数据库用户过程报ORA-01940解决办法发表于:2012-09-14 15:06 浏览 (46 ) 标签:
删除数据库用户过程中有用户连接数据库导致无法删除的错误

问题提出:

SQL〉DROP USER USER1 CASCADE
ERROR:ORA-01940: cannot drop a user that is currently connected


由于当前用户正连接到数据库,所以无法删除
解决办法:
1、查询此用户的会话进程,

SQL〉SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME='USER1';
SID SERIAL#
---------- ----------
24 25341
86 18117


2、结束此用户的所有会话

SQL>ALTER SYSTEM KILL SESSION '24,25341';
System altered.
SQL>ALTER SYSTEM KILL SESSION '86,18117';
System altered.


3、删除用户

SQL〉DROP USER USER1 CASCADE;


删除oracle数据库中的用户时ORA-01940的解决方法

ORA-01940:cannot drop a user that is currently connected


问题如题:
解决方法:
1.查询此用户的会话进程;

2.结束此用户的会话进程;

1 ALTER SYSTEM KILL SESSION '126,1147';


3.删除用户;

1 DROP USER username CASCADE;


无人连接却删除不了oracle用户(报ORA-01940错误?)
ORACLE数据库大量生成trace文件排查过程
现场彩铃业务环境,创建有USDP测试用数据库用户ring,割接前需要drop掉该用户并重新创建用户,创建应用数据库环境。SYS登陆数据库sqlplus后执行SQL>drop user ring cascade;
遇到如下错误:

反复尝试各种方法drop该用户,每次都遇到相同的报错,提示该用户正在使用。提单到oracle原厂,其专家提供以下方法尝试drop该用户:

SQL>alter user ring account lock;


再次执行SQL>drop user ring cascade, 发现可以成功的把ring用户drop掉了。
取数据库AWR报告,检查发现EVENT中top 1 是row cache wait;研发怀疑存在某个应用进程在不断的尝试链接数据库,现场检查了业务相关的所有网元中与数据库相关的配置部分,并没有发现错误的账号/密码配置内容。

研发提供方案在数据库部署触发器,检测是是哪个网元在不断的尝试连接数据库。如下:
1. 登录sys执行如下脚本,过几分钟看一下表logonaudittable并保存数据

2. 在logonaudittable有数据后执行如下命令删除触发器及新建的表

drop TRIGGER tr_log_errors;
drop table TABLE logonaudittable;


从logonaudittable表中发现反复尝试连接数据库的客户端信息如下;

EVENT SID SERIAL# TIMESTAMP USERNAME OSUSERID MACHINENAME IP
LOGERR 1006 36385 5/21/2012 1:38:11 AM   aipcti FC1A 192.168.108.133
LOGERR 1007 12729 5/21/2012 1:38:11 AM   aipcti FC1A 192.168.108.133
LOGERR 1007 12734 5/21/2012 1:38:11 AM   aipcti FC1A 192.168.108.133


192.168.108.133 是现网CTI主机的fabric平面地址,业务应用上考虑CTI到数据库的链接是由Aplogic来发起的。所以首先需要检查aplogic的配置。登陆WEB配置台检查,确认aplogic连接数据库对应的用户名,密码是完全正确的。需要继续排查是哪个进程在反复发起到数据库的连接。
root用户登陆CTI主机(192.168.108.133)检查主机与外部网元建链情况:

< /home/aipcti/icddir/config>netstat -anp | grep 192.168.108.133
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 192.168.108.133:427 0.0.0.0:* LISTEN -
tcp 0 0 192.168.108.133:8849 0.0.0.0:* LISTEN 4079/netcheck
tcp 0 0 192.168.108.133:8888 0.0.0.0:* LISTEN 3854/icdcomm
tcp 1 0 192.168.108.133:33066 192.168.108.155:8080 CLOSE_WAIT 4071/ui
tcp 0 0 192.168.108.133:58160 192.168.108.135:1521 TIME_WAIT -
tcp 0 0 192.168.108.133:57913 192.168.108.135:1521 TIME_WAIT -
udp 0 0 192.168.108.133:32770 0.0.0.0:* 4057/fep
udp 0 0 192.168.108.133:32771 0.0.0.0:* 4057/fep
-
< /home/aipcti/icddir/config>


我们注意到蓝色字体部分显示,有大量的异常链接请求从133主机发送到135主机(数据库服务器ip),并且这些连接始终处于“TIME_WAIT”状态,表明链接无法成功建立。观察其他链接(如下),我们可以确认该连接是由aplogic进程发起,在133主机与135主机间建立了连接。

tcp 0 0 192.168.108.133:59347 192.168.108.135:1521 ESTABLISHED 4063/aplogic


然而对于蓝色字体部分的链接,netstat –anp 命令却无法看到是哪个进程发起的请求。问题的
定位一时陷入了僵局。

排除了CTI主机业务应用的问题,考虑该主机上是否有其他程序在跑,��比CTI主机1和CTI主机2,发现只有CTI主机1上存在这样的问题。比较两者的配置发现CTI主机1上除了业务程序外还安装有WAS应用程序。并且该应用程序处于运行状态。由此怀疑问题出在WAS上。使用维护助手登陆WAS配置管理页面,检查配置发现WAS确实配置有老的数据库账号(ring).修改数据库账号并重启WAS进程后,执行netstat –anp |grep 192.168.108.133发现没有了异常的链接,相关情况如下:

< /home/aipcti/icddir/bin>netstat -an |grep 192.168.108.133
tcp 0 0 192.168.108.133:427 0.0.0.0:* LISTEN
tcp 0 0 192.168.108.133:8849 0.0.0.0:* LISTEN
tcp 0 0 192.168.108.133:8888 0.0.0.0:* LISTEN
tcp 0 0 192.168.108.133:8888 192.168.108.155:45599 ESTABLISHED
tcp 0 0 192.168.108.133:34135 192.168.108.135:1521 ESTABLISHED
tcp 0 0 192.168.108.133:34134 192.168.108.135:1521 ESTABLISHED
udp 0 0 192.168.108.133:427 0.0.0.0:*
udp 0 0 192.168.108.133:32890 0.0.0.0:*


导致ring用户一直无法drop掉的根本原因在于WAS依然使用ring账户链接数据库。检查数据库/opt/oracle/diag/rdbms/instancename/SID/trace/ 下已经不再大量产生trace文件,制作ARW报告检查确认EVENT中top 1 已经不再是row cache wait了。如下; 至此可以确认问题解决。

Event Waits Time(s) Avg wait (ms) % DB time Wait Class
db file sequential read 105,302 816 8 50.29 User I/O
DB CPU 687 42.38
log file sync 54,104 49 1 3.01 Commit
SQL*Net message to client 1,174,626 1 0 0.08 Network
db file scattered read 226 1 4 0.05 User I/O


不过这里还有个疑问,为何通过netstat –anp 命令查看主机与外部网元链接情况时无法检测到是WAS发起这些链接的呢?

总结:
在数据库部署触发器,检查是哪个客户端在反复尝试建立链接是解决这个问题的关键。之前有尝试过多次探寻到底是哪个网元/进程还在连接数据库,一直没有找到很好的方法,曾经重启数据库��主机,业务各个组件都无法解决。
附件: ORACLE数据库大量生成trace文件问题排查.docx ( 106.56 KB ,11 downs )
从v$session中可以看到吧!对这个事情太有印象了,国内某局点遇到过,忘记修改WAS连接数据库的密码,导致数据库hang住。 回复

等级:
2楼刘建军发表于2012-05-28 11:49
Oracle 11g引入了用户登陆数据库失败后延迟一段时间再次尝试的机制。在某些特定应用场景下,此机制将导致row cache entry被持续的延迟而锁住,进而引起dc_users上对某些用户或schema的的row cache lock。严重时引起整个数据库hang住。 bug 7715339 回复

回复 刘建军 发表于 2012-05-28 11:49
Oracle 11g引入了用户登陆数据库失败后延迟一段时间再次尝试的机制。在某些特定应用场景下,此机制将导致row cache entry被持续的延迟而锁住,进而引起dc_users上对某些用户或schema的的row cache lock。严重时引起整个数据库hang住。 bug 7715339

v$session看不到,用户名都不存在啦,连不上来啊。 回复

等级:
4楼罗晓明发表于2012-05-28 14:03
回复 刘建军 发表于 2012-05-28 11:49
Oracle 11g引入了用户登陆数据库失败后延迟一段时间再次尝试的机制。在某些特定应用场景下,此机制将导致row cache entry被持续的延迟而锁住,进而引起dc_users上对某些用户或schema的的row cache lock。严重时引起整个数据库hang住。 bug 7715339
用户名或密码错误, v$session看不到,通过登录触发器才能锁定IP 回复

等级:
5楼李捷发表于2012-06-11 19:23
“有大量的异常链接请求从133主机发送到135主机(数据库服务器ip),并且这些连接始终处于“TIME_WAIT”状态,表明链接无法成功建立”

能否详细解释一下这个机制,为何TIME_WAIT 就表明链接无法成功建立 回复

询语句
1.如果查询的结果记录很多,可以查看前N条结果记录。

select TABLE_NAME,TABLESPACE_NAME,OWNER from DBA_TABLES where rownum <21;


2.条件设置查询。

oracle如何设置输出显示效果?
1. 设置显示的宽度。
使用默认的显示宽度,发现显示有点混乱。

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR
---------------- ---------- ---------- ----------------
USERNAME STATUS
------------------------------ --------
000000013DE1BEF0 938 628 0000000140804890
SYS ACTIVE


设置显示宽度后的效果要整齐很多。可以使用“set linesize 1000” 或“set line 1000”

SQL> set linesize 1000
SQL> /
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000013DE1BEF0 938 628 0000000140804890 SYS ACTIVE
0000000140EBA398 941 89 0000000140806890 SYSDB INACTIVE


2. 设置列的宽度
对于字符型的字段可以 使用“col 字段 format a50”

3. 设置页面显示的量
设置页面的大小可以使用“set pagesize 10” 。

如何踢出访问数据库的用户?
应用场景
在数据库管理中,不希望有一些不速之客访问我的数据库,这时候管理员需要把这些不俗之客踢出出去。
查看谁在访问我的数据库
执行命令“select saddr,sid,serial#,paddr,username,status from v$session where username is not null;” 可用查看谁在访问我的数据库。

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF52378 513 20 000000011B7FD8A0


删除访问数据库用户的Session
删除该用户的session。

SQL> alter system kill session 'sid,serial#';


说明:

sid、serial#应该填写实际查询出来的结果。


5. 查看session的状态,验证session是否被删除。

SQL> select saddr, sid, serial#, paddr, username,status from v$session where username is not null;


• 如果用户的session状态status值为inactive,说明没有被删除。
• 如果用户的session状态status值为killed,说明已经删除。
操作示例

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF52378 513 20 000000011B7FD8A0 CBEDB1 INACTIVE
SQL> alter system kill session '513,20';
System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF52378 513 20 000000011B9D7A18 CBEDB1 KILLED
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF52378 513 22 000000011B7FD8A0 CBEDB1 INACTIVE
SQL> alter system kill session '513,22';
System altered.
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF62728 519 3 000000011B8048A0 SYSDB INACTIVE
000000011BFC3D48 555 5 000000011B7FC8A0 SYS ACTIVE


如何根据数据库用户的Session信息获取操作系统的PID信息

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF4F830 512 10 000000011B7FE8A0 SYSDB INACTIVE
000000011BF5A550 516 33 000000011B7FD8A0 CBEDB1 INACTIVE
SQL> select spid from v$process where addr = (select paddr from v$session where sid=&sid);
Enter value for sid: 516
old 1: select spid from v$process where addr = (select paddr from v$session where sid=&sid)
new 1: select spid from v$process where addr = (select paddr from v$session where sid=516)
SPID
------------------------
11499
SQL> !ps -ef |grep 11499
oracle 11499 11487 0 13:11 ? 00:00:00 oraclemdspdb (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 12423 27930 44 13:13 pts/2 00:00:00 /bin/bash -c ps -ef |grep 11499
oracle 12425 12423 99 13:13 pts/2 00:00:00 grep 11499
SQL> select spid from v$process where addr = (select paddr from v$session where sid=512);
SPID
------------------------
5163
SQL> select spid from v$process where addr = (select paddr from v$session where sid=519);
SPID
------------------------
31864
SQL> !ps -ef |grep 31864
oracle 14287 27930 44 13:15 pts/2 00:00:00 /bin/bash -c ps -ef |grep 31864
oracle 14290 14287 66 13:15 pts/2 00:00:00 grep 31864
oracle 31864 1 0 12:48 ? 00:00:00 oraclemdspdb (LOCAL=NO)


从操作系统层面kill掉登录用户的Session

SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF5A550 516 33 000000011B7FD8A0 CBEDB1 INACTIVE
000000011BF62728 519 3 000000011B8048A0 SYSDB INACTIVE
000000011BFC3D48 555 5 000000011B7FC8A0 SYS ACTIVE
SQL> select spid from v$process where addr = (select paddr from v$session where sid=516);
SPID
------------------------
11499
SQL> !kill -9 11499
SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USERNAME STATUS
---------------- ---------- ---------- ---------------- ------------------------------ --------
000000011BF62728 519 3 000000011B8048A0 SYSDB INACTIVE
000000011BFC3D48 555 5 000000011B7FC8A0 SYS ACTIVE




赞(0)    操作        顶端 
zarhoo
注册用户
等级:上士
经验:306
发帖:0
精华:0
注册:2016-12-27
状态:离线
发送短消息息给zarhoo 加好友    发送短消息息给zarhoo 发消息
发表于: IP:您无权察看 2017-2-9 14:13:41 | [全部帖] [楼主帖] 2  楼

学习了,好详细



赞(0)    操作        顶端 
469526031
注册用户
等级:上士
经验:253
发帖:1
精华:0
注册:2017-1-3
状态:离线
发送短消息息给469526031 加好友    发送短消息息给469526031 发消息
发表于: IP:您无权察看 2017-2-9 17:33:16 | [全部帖] [楼主帖] 3  楼

学习一下



赞(0)    操作        顶端 
15623083652
注册用户
等级:上士
经验:286
发帖:0
精华:0
注册:2016-12-27
状态:离线
发送短消息息给15623083652 加好友    发送短消息息给15623083652 发消息
发表于: IP:您无权察看 2017-2-10 11:53:49 | [全部帖] [楼主帖] 4  楼

学习学习



赞(0)    操作        顶端 
327793768
注册用户
等级:上士
经验:314
发帖:0
精华:0
注册:2016-12-27
状态:离线
发送短消息息给327793768 加好友    发送短消息息给327793768 发消息
发表于: IP:您无权察看 2017-2-10 14:22:14 | [全部帖] [楼主帖] 5  楼

学习了



赞(0)    操作        顶端 
总帖数
5
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论