Oracle数据库常见错误总结(一)

实际项目实践过程中,经常会遇到一些形如“ORA-XXXX”的Oracle错误提示,此时,我们便会打开百度、Google,搜索相关技术解决方案。本系列博文的目的就在于,对常见的Oracle错误提示进行总结,不断完善。


ORA-12560

这里写图片描述

ORA-12560: TNS: protocol adapter error(SQLPLUS)
ORA-27101: shared memory realm does not exist(PL/SQL Developer)

(1)原因分析
在path环境变量中Oracle_home设置在client之后、且PL/SQL Developer设置正确的ORACLE_HOME和OCI DLL,使用sqlplus出现ORA-12560错误,PL/SQL Developer出现ORA-27101错误。

(2)解决方法(之一): 将ORACLE_HOME/bin放在CLIENT_HOME/bin之前,sqlplus命令和PL/SQL Developer均可正常使用。

(3)解决方法(之二): 数据库链接字符串有误,修改连接字符串。


ORA-28001

这里写图片描述

解决方法(之一):
这个问题是由于Oracle 11G的新特性所致, Oracle 11G创建用户时缺省密码过期限制是180天, 如果超过180天用户密码未做修改则该用户无法登录。可通过:
SELECT * FROM dba_profiles WHERE profile=’DEFAULT’ AND resource_name=’PASSWORD_LIFE_TIME‘;
语句查询密码的有效期设置,LIMIT字段是密码有效天数。

在密码将要过期或已经过期时可通过ALTER USER 用户名 IDENTIFIED BY 密码;语句进行修改密码,密码修改后该用户可正常连接数据库。长久对应可通过ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED语句将口令有效期默认值180天修改成“无限制”。出于数据库安全性考虑,不建议将PASSWORD_LIFE_TIME值设置成UNLIMITED,建议客户定期修改数据库用户口令。


ORA-01659

ORA-01659 无法分配超出5(或者其他数字)的MINEXTENTS** 

(1)原因:表空间已满

(2)解决方法:使用SQLPLUS登陆命令修改,或进入Oracle Enterprise Manager Console手工修改ALTER DATABASE DATAFILE ‘C:\SDE.dbf’ AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED 或ALTER TABLESPACE SDE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED


客户端连接Oracle报错

这里写图片描述

这里写图片描述

(1)问题分析

   关于这个问题,其出现的机会还是比较大。
   而且网上关于这个问题的回答也基本上有两种不同的解决方式。

   **http://www.cnblogs.com/shunyao8210/archive/2011/11/16/2251302.html
   http://heisetoufa.iteye.com/blog/287714**

看完后,发现解决的方式有些混乱,竟然授权用户有NETWORK SERVICE或Authenticated Users,而授权的目录有ORACLE_CLIENT,也有ORACLE_HOME,即,其实网络上有4种解决方式(2种授权用户与2种目录授权的组合),让人不知所措。

(2)问题探索
为此,我在我的电脑上进行了验证,过程如下:

(一)、软件环境:
(1) 操作系统:Windows 7 64位;
(2) Oracle环境:Oracle Server 64位,Oracle Client 64位。

(二)、实验步骤:

1. 对ORACLE_CLIENT授权

(1) 设置NETWORK SERVICE用户拥有oracle client目录的读取和执行、列出文件内容、读取、写入权限后,重启IIS。
结果:错误提示依旧存在。
(2)使用Authenticated Users用户赋予其上述权限后,重启IIS,错误消失。

此时,ORACLE_HOME没有对NETWORK_SERVICE和Authenticated Users用户赋予上述权限。

2 对ORACLE_HOME授权

(1) 设置NETWORK SERVICE用户拥有oracle HOME目录的读取和执行、列出文件内容、读取、写入权限后,重启IIS,错误提示“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”,去掉ORACLE_HOME目录对NETWORK SERVICE用户的授权;
(2)使用Authenticated Users用户赋予其上述权限后,重启IIS,出现如下新的错误提示:

这里写图片描述

3. 重新添加ORACLE_CLIENT对Authenticated Users用户的授权,保留ORACLE_HOME目录的权限配置,
测试结果:错误消失,访问正常!

4.  去掉ORACLE_HOME目录的权限配置,保留ORACLE_CLIENT对Authenticated Users用户的授权,
测试结果:错误消失,访问正常!

结论:
1. 只需对ORACLE_CLIENT对Authenticated Users用户的授权,与ORACLE_HOME及其用户权限是否配置无关!
2. 对于网络上提供的:“将ORACLE_HOME目录赋予NETWORK_SEVICE用户相应权限、并将NETWORK_SEVICE用户加到用户组Administrator里” 的做法,在我的电脑上测试未通过。

这里写图片描述


ORA-08002

ORA-08002:序列XXXX尚未在此进程中定义

(1)现象分析:
select sequence.currval from dual 时报“ORA-08002: 序列XXXX尚未在此进程中定义”。

(2)原因分析:未定义该序列;未初始化新定义的序列。

(3)解决方案:
在已经正确定义该序列前提下,使用sequence.nextval进行序列初始化

这里写图片描述

PS:在序列作为自增长字段的使用场景中,有时候会出现一个问题:即,将机器A上表的数据拷贝到另一个机器B上,而机器B上该表的序列值没有被扩大、仍然保持数据表拷贝过来之前的值,那么会出现“ORA-00001”错误提示。因为B机器上某个依赖序列新增、且该字段有唯一性约束时,生成得值在数据表中已经存在,这时会违反唯一性约束。


ORA-12154

ORA-12154: TNS: 无法解析指定的连接标识符

原因分析:

(1) 出现以上错误提示出现的原因之一,是在一台电脑上同时安装了oracle客户端和数据库服务,并且是先安装客户端,再安装数据库服务造成的,如果先安装数据库服务,再安装客户端就不会出现这种情况了;
(2) tnsnames.ora配置有误;
(3) 数据库链接字符串有误;

解决方法(之一) :
(1)配置Oracle服务端Net Manager,或者直接将Oracle客户端的tnsnames.ora拷贝到服务端对应目录;
(2)在path目录中,将client的bin目录放在ORACLE_HOME之前,且在使用PL/SQL Developer时,将其Connection的ORACLE_HOME配置为Client的主目录;


ORA-28002

ORA-28002: the password will expire within 7 days
原因分析:

    Oracle 11G 普通用户有个180天的缺省密码周期,用户在安装完数据库后未对口令过期策略进行调整,当快过期的时候即会出现此提示。

解决方法(之一) :
(1) 查看当前用户的profile;
SELECT username,PROFILE FROM dba_users;
(2) 查看其profile的有效期设置;
SELECT * FROM dba_profiles s WHERE s.profile=\’DEFAULT\’
AND resource_name=\’PASSWORD_LIFE_TIME\’;
(3) 修改密码有效期为“无限制“;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
(4) 修改后,还没有被提示ORA-28002警告的帐户不会再碰到同样的提示;已经被提示的帐户必须使用alter user USERNAME identified by NEWPASSWORD再改一次密码。


ORA-00119

这里写图片描述

解决方法(之一) :
(1) 文本文件打开tnsnames.ora,找到ADDRESS;    
(2) 打开数据库安装时创建的初始化pfile文件,将其中的local_listener的value改为上述ADDRESS地址;
(3) 使用下述命令创建spfile: 
    startup pfile='D:\app\Mike\admin\orcl\pfile\init.ora.112620141540’;
    create spfile from pfile ='D:\app\Mike\admin\orcl\pfile\init.ora.112620141540’;
(4) 退出重新登录即可

BadImageFormatException. This will occur when running in 64 bit mode with the 32 bit Oracle client components installed

Stackoverflow给出的说法:

You’re using System.Data.OracleClient. This namespace has been deprecated and will be removed in a future version of .NET. Perhaps you are using a 32-bit version of that? It is also not part of the Oracle client, so whether you are using a 32-bit or 64-bit Oracle client is irrelevant.

http://stackoverflow.com/questions/24104210/badimageformatexception-this-will-occur-when-running-in-64-bit-mode-with-the-32 给出的解决方法,解决了Windows Server 2008 R2、64位Oracle Server、AnnyCPU编译模式的问题。

参考:http://blog.csdn.net/leshami/article/details/6396989


ORA-32004

ORA-32004: 指定了废弃/过时的参数

这里写图片描述

原因分析:
根据提示,可以看出是该版本的数据库在启动时(具体来说,是启动到nomount阶段检查参数时),发现有些参数设置已经过时,故出现ORA—32004错误(警告)。

解决办法:

由于该错误(警告)是因为 “参数设置已经过时”,故通过如下步骤解决:
(1) 启动到nomount阶段,查看alert日志:如D:\app\Mike\diag\rdbms\orcl\orcl\alert\ log.xml;
(2) 找到对应的提示,如
![这里写图片描述](http://img.blog.csdn.net/20160721100103062)
(3) 修改参数值、或解决错误

关于Oracle数据库常见错误这部分内容,会在后续工作中陆续更新。

学海无涯,分享快乐,快乐分享!

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
调试经验: 1. 编译包时,如果出现编译错误(PL/SQL developer中包名出现红叉),可通过以下语句查看: SELECT   name,line, POSITION, text     FROM user_errors    WHERE NAME = 'INITTEST' ORDER BY SEQUENCE; 2. 上述语句中,引号中的包名(如,INITTEST)一定要大写,否则查不到 另外,PL/SQL中的包分为包规范(包的定义)和包体(包的实现)两部分,是PL/SQL编程的基本单元。 虽然名

DB2数据库的学习及总结 - 2016-07-23 19:07:12

                                                                                                                                                   db2命令 给db2用赋权的命令 db2 grant dbadm on database to user dsp #导出数据库结构会生成一个faldb20160224.sql文件  db2look -d udep -
对于PL/SQL这种基本上面向过程的语言来讲,子程序(过程和函数)就是其核心所在了。 整个解决方案可通过组织、调用由过程和函数构成的模块来实现。 在“Divide and conquer”(分而治之)的编程世界中,子程序就是程序员手中的兵器,用的越熟练越好。 --代码 13.1 创建过程示例CREATE OR REPLACE PROCEDURE newdept ( p_deptno dept.deptno%TYPE, --部门编号 p_dname dept.dname%TYPE, --部门名称 p_loc
调试nocopy功能时,为了看到实际效果,设置了一个比较大的循环次数,结果悲剧了: 运行了近1个小时没出结果,电脑死机(任务管理器都打不开);无奈只能强行关机,开机时间又特别长,一度让我以为系统崩溃。 看来,PL/SQL developer下调试这种暴力计算的程序风险很高啊,我在Eclipse下调试Java程序时从来没碰到过这种造成电脑死机的情况。 不过,这章的内容实用性很强,死机也值了(有点心疼电脑了 ) -代码13.11 使用%Type定义形式参数CREATE OR REPLACE PROCEDURE
Less - 54 Challenge-1 Test Sourse Code Solution Less - 55 Challenge-2 Test Sourse Code Solution Less - 56 Challenge-3 Test Sourse Code Solution Less - 57 Challenge-4 Test Sourse Code Solution Less - 58 Challenge-5 Test Sourse Code Solution Less - 59 Chall

CentOS7安装配置hadoop2.7.2 - 2016-07-23 18:07:08

linux 虚拟机配置 系统配置: 虚拟机:一个master(Master.Hadoop),两个slave(Slave1.Hadoop, Slave2.Hadoop) 网络设置:我使用的是桥接的方式 内存:每个虚拟机配置4G内存 分区:手动配置 软件选择:最小安装,注意选择开发工具 用户设置:密码都设置为:hadoophadoop, 不创建任何用户,操作时使用root直接进行 安装完后各个虚拟机的ip配置(参考用) 主机 ip地址 master.hadoop 192.168.200.30 slave1.h
最近写的项目中有用到数据库,写了不少蛋疼的sql语句,每次都是好几行代码,而且每次都是重复的没有一点技术含量的代码,虽然也有不少基于sqlite的封装,不过用起来还是感觉不够面向对象! 为了不再写重复的代码,花了几天时间,基于SQLite3简单封装了下,实现了一行代码解决增删改查等常用的功能!并没有太过高深的知识,主要用了runtime和KVC: 首先我们创建个大家都熟悉的Person类,并声明两个属性,下面将以类此展开分析 @interface Person : NSObject @property (

MySQL原来也有内存数据库 - 2016-07-23 18:07:20

以前只知道MySQL可以做分库分表,支持多种数据库引擎。这次听了来自台湾的MySQL专家Ivan Tu的讲座,有两点印象深刻,一是MySQL具有丰富的高可用方案,二是MySQL也有内存数据库,即MySQL Cluster CGE。Ivan形象的将内存数据库比喻成浅浅的盘子,而传统的MySQL磁盘存储方式比喻成深深的瓶子。 另外,也探讨了MySQL作为开源数据库,和Oracle数据库的关系。MySQL并行发展企业版和社区版,企业版增加了很多企业级的特性,如安全,备份和恢复,监控,以及CGE(电信运营商版)。
CleverCode研究了一下,怎么kill掉慢的sql语句。 1 单个kill mysql show processlist; mysql kill 251; #批量kill 1)查找Lockd语句 mysql -uroot -p123456 -h 192.1.20.101 -e "show processlist" | grep -i 'Locked' locked_log.txt 2)组合kill for line in `cat locked_log.txt | awk '{print $1}'`
前段时间把项目中的JPA从EclipseLink换成Hibernate。这其中遇到了很多问题,也记录了一部分在其他的文章中。这里介绍一个UT中遇到的问题。 当时的测试是忘H2数据库中插入多项数据,然后用Query的方式删除,assert读出来的数据是null。这个测试用例在EclipseLink下面是可以通过的,但换成Hibernate之后发现数据仍然可以读出这个数据。 测试用例如下: @Test public void shouldRemovesAllFmReportFromDb () { FmRepo