oracle的一些故障处理

这里汇总了一些在使用Oracle过程中遇到的问题及解决办法,一方面做为笔记帮助自己以后更快速处理问题,一方面分享处理供大家互相学习。

⚪SP2-0667: Message file sp1.msb not found

出错原因:
crontab里面的脚本,通常读取的是默认的环境变量,PATH里面不包含oracle数据库的路径。

解决办法:

1
vim ~/.bashrc

把一下内容填写其中

1
2
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH

注意,ORACLE_HOME的路径要是你计算机中oracle真实的安装地址

环境变量设置完成,执行 source ~/.bashrc 使其生效。

⚪ORA-12162: TNS:net service name is incorrectly specified

一般出现这种错误,基本都是环境变量配置有问题,要么是没有配置正确的ORACLE_SID、ORACLE_HOME,要么是监听配置环境变量和.bash_profile环境变量配置不一致。

这里检查发现,是操作系统环境变量没有配置ORACLE_SID

因此,我们配置一下 ~/.bashrc ,在其中添加ORACLE_SID

1
export ORACLE_SID=erp

注意:ORACLE_SID的值要根据自己安装oracle时设置的为准

⚪ORA-04021: timeout occurred while waiting to lock object

情景描述:

Oracle中本来有个用户NC63PM_PEIXUN1,我把这个用户名更改为了NC63PM_PEIXUN2(更改方法请参考【Oracle更改用户名和密码】),之后我想按照旧的用户名再创建一个用户,但是创建的用户的SQL语句执行了十五分钟还没执行完,并报如下的错误:

ORA-04021: timeout occurred while waiting to lock object

解决办法

查看是否被锁表了

1
2
3
> SELECT object_name,machine,s.sid,s.serial#
> FROM v$locked_object l,dba_objects o ,v$session s
> WHERE l.object_id=o.object_id AND l.session_id=s.sid;

发现没有被锁表

查看锁表

使用 DBA_DDL_LOCKS视图获得DDL锁定信息

1
> SELECT * FROM dba_ddl_locks;

发现有两条关于 NC63PM_PEIXUN1 用户的锁定信息

通过 session_id 找到对应的锁表信息

1
> SELECT sid,serial#,status FROM v$session a WHERE a.sid in (829,392);

注:因我是kill掉这两条信息后才截的图,所以 STATUS 才为 KILLED 的。

kill这两条锁表

1
2
> ALTER SYSTEM KILL SESSION '392, 5049';
> ALTER SYSTEM KILL SESSION '829, 25287';

再次执行创建用户的脚本就能顺利执行。