ORA-00000 to ORA-00877
ORA-00000: 正常的成功的完成(操作)
ORA-00000: normal, successful completion
原因1: 正常执行完成。
Normal exit.
- 状态: 部分验证。
分析: 此异常多数为程序没有执行SQL语句或者说成功执行完SQL语句,但人为或因逻辑有误,非要使用相关方法程序去获取Oracle的错误信息,得到此异常,实质是Oracle告知没有异常产生,猜测是异常信息的默认值为这个。目前发现以下两种情况:
存储过程、PL/SQL块等,使用sqlerrm获取异常,如下例所示。【已验证】
declare v_sqlcode number; v_sqlerrm varchar2(4000); begin /* …… 相关执行代码 …… */ v_sqlcode := sqlcode; v_sqlerrm := sqlerrm; dbms_output.put_line('本次的异常code:' || v_sqlcode || chr(10) || '本次的异常信息:' || v_sqlerrm); exception when others then rollback; v_sqlcode := sqlcode; v_sqlerrm := sqlerrm; dbms_output.put_line('本次的异常code:' || v_sqlcode || chr(10) || '本次的异常信息:' || v_sqlerrm); end; /
使用OCI的C程序中,用erhms()函数(OCIErrorGet())获得Oracle错误信息。【未验证,网络汇总】
措施: 无。【如果是人为需要获取该异常,则不用做任何操作;如果是逻辑有误,那么需要调整不去此异常或者在遇到此异常时将其屏蔽去掉。】
None
原因2: hosts文件配置错误。
- 状态: 未验证,网络汇总。
- 分析: 这种错误通常由于数据库是复制过来的,hosts文件中的ip对应的host name和当前的主机名不一致导致甚至hosts文件丢失,都会导致数据库startup时报此错。
措施: 校验hosts文件是否有错或缺失,进行修改或补充。
hosts文件在不同系统中所处的目录:
Windows XP/2000/Vista/7/8/8.1/10 ==> C:\windows\system32\drivers\etc\ Linux及其他类Unix操作系统 ==> /etc/
ORA-00001: 违反唯一约束条件 (string.string=>[拥有者].[约束名])
ORA-00001: unique constraint (string.string) violated
原因1: UPDATE或INSERT语句试图插入重复的键。对于在DBMS MAC模式下配置的Trusted Oracle,如果在不同级别存在重复条目,您可能会看到此信息。
An UPDATE or INSERT statement attempted to insert a duplicate key. For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.
- 状态: 已验证。
分析: 如下例所示,此异常一般为违反作用于表上的唯一约束或者主键约束导致,它们限制了表的一列或多列值的唯一性,不能插入重复数据。
-- 创建测试表 create table ora_00001_1( a char(24) /*primary key*/, -- 亦可加注释内信息实现添加主键约束 b number /*unique*/, -- 亦可加注释内信息实现添加唯一约束 -- 增加主键约束 constraint ora_00001_1_a primary key (a) -- 亦可加注释内信息实现添加唯一约束 /*, constraint ora_00001_1_b unique (b)*/ ); -- 亦可加注释内信息实现添加主键约束 /*alter table ora_00001_1 add constraint ora_00001_1_a primary key (a);*/ -- 增加唯一约束 alter table ora_00001_1 add constraint ora_00001_1_b unique (b); -- 插入测试数据 insert into ora_00001_1(a, b) values ('1',1); insert into ora_00001_1(a, b) values ('2',2); commit; -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_A); insert into ora_00001_1(a, b) values ('1',3); -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_B) insert into ora_00001_1(a, b) values ('3',2); -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_A) update ora_00001_1 set a = '1' where a = '2'; -- ORA-00001: 违反唯一约束条件 (C##LY.ORA_00001_1_B) update ora_00001_1 set b = '2' where b = '1';
措施: 删除唯一约束限制或不插入重复值。
Either remove the unique restriction or do not insert the key.
如果分析确定此处唯一约束或主键约束不需要,那么则可使用下面语句删除约束
-- 查询约束与索引信息 select a.owner 约束所有者, a.constraint_name 约束名, case a.constraint_type when 'P' then 'Primary key' when 'U' then 'Unique key' when 'C' then 'Check constraint on a table' when 'R' then 'Referential integrity' when 'V' then 'With check option, on a view' when 'O' then 'With read only, on a view' when 'H' then 'Hash expression' when 'F' then 'Constraint that involves a REF column' when 'S' then 'Supplemental logging' else 'unkown' end 约束类型, b.table_name 表名, b.column_name 列名, c.index_name 索引名, c.uniqueness 是否唯一索引/*, d.table_name 表名, d.column_name 列名*/ from user_constraints a, user_cons_columns b, user_indexes c/*, user_ind_columns d*/ where a.constraint_name = b.constraint_name and a.index_name = c.index_name /*and c.index_name = d.index_name*/ and a.owner = b.owner and a.owner = c.table_owner and a.owner = &"[拥有者]" and a.constraint_name = &"[约束名]"; -- 由于如果约束对应的唯一索引若是事先手工创建的,那么在删除约束时索引不会被删除,Oracle之后自动删除自己隐式创建的索引。 -- 因此加上drop index,可确保一定将索引删除。 alter table [表名] drop constraint [约束名] drop index; -- 如果是主键约束,有可能遇到有用作外键的情况,那么在删除时仍会报=>ORA-02273: 此唯一/主键已被某些外键引用 -- 报错后了解是否有问题,是否需去除此主键和外键,然后可考虑用下面语句删除主键约束,会同时删除外键约束 alter table [表名] drop constraint [约束名] cascade drop index; alter table [表名] drop primary key cascade drop index;
如果分析确定是值重复,那么需排查表数据与预执行的SQL语句的重复值冲突、同一个事务内执行的SQL语句之间的重复值冲突,去掉重复值的插入或更新。
- 备注:
- 唯一约束与主键约束的同:
- 都通过唯一索引来限制约束列的唯一性,确保任何使表中约束的列在行与行之间存在重复值的操作失败
- 若无事先创建好唯一索引,都会在创建唯一约束或主键约束时隐式创建同名的唯一约束
- 有约束必定有索引(无法在保持约束存在的情况下删除索引=>ORA-02429: 无法删除用于强制唯一/主键的索引)
- 有索引不一定有约束(只删除约束但不删除索引则仍然会限制索引列的值的唯一性)
- 唯一约束与主键约束的异:
- 唯一约束允许在该列或多列上存在NULL值,但主键约束不能存在NULL值
- 一个表只能创建一个主键约束,但可创建多个唯一约束
- 唯一约束与主键约束的同:
ORA-00017: 会话被要求设置跟踪事件
ORA-00017: session requested to set trace event
原因1: 当前会话被要求通过另一个会话设置一个跟踪事件
The current session was requested to set a trace event by another session.
- 状态: 来源ORA12_ERRMG。
措施: 内部使用;无需操作。
This is used internally; no action is required.
ORA-00018: 超出最大会话数
ORA-00018: maximum number of sessions exceeded
原因1: 所有会话状态对象都在使用中
All session state objects are in use.
- 状态: 部分验证。
- 分析: 很明显,系统中所有会话数目已经达到设置的SESSIONS值,因此准备要创建的会话无法成功创建,而这个会话包括有用户建立连接至数据库是产生的会话、后台进程产生的会话以及各类涉及到硬解析处理数据字典基表的DML、DDL语句产生的递归会话。
措施: 增加SESSIONS初始化参数值。【是否需要增加SESSIONS值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the SESSIONS initialization parameter.
如果判断确定是由于SESSIONS值过小导致,则需修改增大此参数值【已验证】:
alter system set 参数名=参数值 [comment='注释'] [deferred] [scope=memory|spfile|both] [sid='sid|*']; /* comment='注释',修改时可添加注释,会在V$PARAMETER视图的update_comment字段看到内容,和参数值生效情况保存一致; deferred,指定参数修改是否只对以后的会话生效(对当前建立的会话无效,包括执行此修改的会话),部分参数必须加此参数; scope=both,表示修改会立即生效且会修改spfile文件以确保数据库在重启后也会生效如果(以spfile启动此项为缺省值); scope=memory,表示修改会立即生效但不会修改spfile文件,因此重启后失效(以pfile启动此项为缺省值,且只可设置这个值); scope=spfile,表示只修改spfile文件,在重启实例后才生效(以spfile启动且为静态参数则必须设置此项值); sid='sid|*',默认是sid=*,可改为在集群环境中的一个指定的实例值。 */ -- 查看"ALTER SYSTEM修改模式"列值,根据结果进行修改 select name 参数名, case type when 1 then 'Boolean' when 2 then 'String' when 3 then 'Integer' when 4 then 'Parameter file' when 5 then 'Reserved' when 6 then 'Big integer' else 'unknown' end 参数类型, value "会话级(若可修改)或实例级参数值", display_value 展示值, isses_modifiable "是否可用ALTER SESSION修改", case issys_modifiable when 'IMMEDIATE' then '无论pfile还是spfile启动,都可用"alter system set ' || name || '=&' || '新的参数值;"更改参数并立即生效。' when 'DEFERRED' then '无论pfile还是spfile启动,都要用"alter system set ' || name || '=&' || '新的参数值 deferred;"更改参数并将在之后的会话中生效。' when 'FALSE' then case a.is_spfile when 0 then '使用pfile启动,需手动修改pfile文件中对应参数值再重启。' else '使用spfile启动,可用"alter system set ' || name || '=&' || name || ' scope=spfile;"更改参数。更改将在后续的实例中生效(当前数据库需重启)。' end else '?' end "ALTER SYSTEM修改模式", isinstance_modifiable "是否不同实例间值可不同" from v$parameter, (select count(1) is_spfile from v$parameter t where t.name = 'spfile' and t.value is not null) a where name = 'sessions';
如果判断确定SESSIONS值合理,则需分析确定产生大量会话的原因,是否相关程序代码建立了连接未释放?或者其它原因等。【待完善】
备注: 参数SESSIONS:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 派生公式: 【?~11gR1】="(1.1 * PROCESSES) + 5)"; 【11gR2~12cR2】="(1.5 * PROCESSES) + 22" |
可修改(不用重启及时生效) | 【?~11gR2】="否"; 【12cR1~12cR2】="可用ALTER SYSTEM修改" |
取值范围 | 【?~11gR1】="1~2^31"; 【11gR2~12cR2】="1~2^16(即1~65536)" |
基础参数 | 是 |
SESSIONS指定可以在系统中创建的最大会话数。因为每次登录都需要一个会话,所以这个参数有效地确定了系统中最大并发用户数。您应该始终将此参数显式设置等于最大并发用户数的估计值+后台进程数+递归会话数(大约占总数的10%)。
Oracle使用此参数的默认值作为其最小值。 将SESSIONS值设置成[1~默认值)不会触发错误,因为Oracle会忽略此值直接使用默认值。
ENQUEUE_RESOURCES和TRANSACTIONS参数的默认值派生自SESSIONS。因此,如果增加SESSIONS的值,则应考虑是否也调整ENQUEUE_RESOURCES和TRANSACTIONS的值。 (请注意,从Oracle Database 10g release 2(10.2)起,ENQUEUE_RESOURCES已被废弃。)
在共享服务器环境中,PROCESSES的值可能相当小。因此,Oracle建议您将SESSIONS的值调整为大约1.1 *总连接数。
ORA-00019: 超出最大许可会话数
ORA-00019: maximum number of session licenses exceeded
原因1: 所有许可会话都在使用中。
All licenses are in use.
- 状态: 部分验证。
- 分析: 很明显,系统中并发用户会话已经达到设置的LICENSE_MAX_SESSIONS值,因此准备要创建的用户会话无法创建。
措施: 增大LICENSE_MAX_SESSIONS初始化参数的值。【是否需要增加LICENSE_MAX_SESSIONS值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the LICENSE MAX SESSIONS initialization parameter.
- 如果判断确定是由于LICENSE_MAX_SESSIONS值过小导致,则需修改增大此参数值,【详情参见ORA-00018=>原因1=>措施,将SQL语句中
name = 'sessions'
修改为name = 'license_max_sessions'
即可】 - 如果判断确定LICENSE_MAX_SESSIONS值合理,则需分析确定产生大量会话的原因,是否相关程序代码建立了连接未释放?或者其它原因等。【待完善】
- 如果判断确定是由于LICENSE_MAX_SESSIONS值过小导致,则需修改增大此参数值,【详情参见ORA-00018=>原因1=>措施,将SQL语句中
备注: 参数LICENSE_MAX_SESSIONS:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 0 |
可修改(不用重启及时生效) | 可用ALTER SYSTEM修改 |
取值范围 | 0~许可会话数 |
基础参数 | 否 |
Oracle实时应用集群 | 多个实例可以具有不同的值,但是安装数据库的所有实例的总和应小于或等于该数据库许可的会话总数。 |
LICENSE_MAX_SESSIONS指定允许的并发用户会话的最大数量。达到此限制后,只有具有RESTRICTED SESSION权限的用户才能连接到数据库。无法连接的用户收到表示系统达到最大容量的警告消息。
零值表示不强制执行并发使用(会话)许可。如果将此参数设置为非零数字,则可能还需要设置LICENSE_SESSIONS_WARNING(请参阅“LICENSE_SESSIONS_WARNING”)。
不要同时启用并发使用许可和用户许可,即LICENSE_MAX_SESSIONS与LICENSE_MAX_USERS两参数值至少一个要设置为零。
ORA-00020: 超出最大进程数(string=>[最大进程数])
ORA-00020: maximum number of processes (string) exceeded
原因1: 所有进程状态对象都在使用中。
All process state objects are in use.
- 状态: 部分验证。
- 分析: 很明显,系统中进程数已经达到设置的PROCESSES值,因此准备要创建的用户会话无法创建。
措施: 增加PROCESSES初始化参数的值。【是否需要增加PROCESSES值还需进行判断,是否是由于此值过小而现实场景需要更大的值?】
Increase the value of the PROCESSES initialization parameter.
- 如果判断确定是由于PROCESSES值过小导致,则需修改增大此参数值,【详情参见ORA-00018=>原因1=>措施,将SQL语句中
name = 'sessions'
修改为name = 'processes'
即可】 - 如果判断确定PROCESSES值合理,则需分析确定产生大量进程的原因,是否相关程序代码建立了连接未释放?或者其它原因等。【待完善】
- 如果判断确定是由于PROCESSES值过小导致,则需修改增大此参数值,【详情参见ORA-00018=>原因1=>措施,将SQL语句中
备注: 参数PROCESSES:
属性 | 描述 |
---|---|
参数类型 | Integer |
默认值 | 【?~10gR2】="40~操作系统依赖数"; 【11gR1~11gR2】="100"; 【12cR1~12cR2】="该值是派生的,它通常取决于警报日志中报告的核心数。" |
可修改(不用重启及时生效) | 否 |
取值范围 | 6~操作系统依赖数 |
基础参数 | 是 |
Oracle实时应用集群 | 多个实例可以具有不同的值。 |
PROCESSES指定可以同时连接到Oracle的最大操作系统用户进程数。它的值应允许所有后台进程运行,如锁,作业队列进程和并行执行进程。
该参数派生了SESSIONS和TRANSACTIONS参数的默认值。因此,如果更改PROCESSES的值,则应评估是否要调整这些派生参数的值。
ORA-00021: 会话附加到一些其他过程上;无法切换会话
ORA-00021: session attached to some other process; cannot switch session
原因1: 用户会话当前正由其他用户使用。
The user session is currently used by others.
- 状态: 未验证。
措施: 不要切换到附加到其他进程的会话。
Do not switch to a session attached to some other process.
ORA-00022: 会话ID无效;拒绝访问
ORA-00022: invalid session ID; access denied
原因1: 指定的会话不存在或者调用者没有访问权限。
Either the session specified does not exist or the caller does not have the privilege to access it.
- 状态: 未验证。
措施: 指定您具有访问权限的有效会话ID,即您拥有该会话ID或具有CHANGE_USER权限。
Specify a valid session ID that you have privilege to access, that is either you own it or you have the CHANGE_USER privilege.
ORA-00023: 会话引用进程私有内存;无法分离会话
ORA-00023: session references process private memory; cannot detach session
原因1: 试图在当前会话包含对进程专用内存的引用时分离当前会话。
An attempt was made to detach the current session when it contains references to process private memory.
- 状态: 未验证。
措施: 如果会话具有打开的网络连接,非常大的上下文区域或操作系统权限,该会话就可能包含对进程内存(PGA)的引用。为了允许分离,可能需要关闭会话的数据库链接和/或游标。始终禁止使用操作系统权限脱离会话。
A session may contain references to process memory (PGA) if it has an open network connection, a very large context area, or operating system privileges. To allow the detach, it may be necessary to close the session's database links and/or cursors. Detaching a session with operating system privileges is always disallowed.
ORA-00024: 在单进程模式下不允许登录多个进程
ORA-00024: logins from more than one process not allowed in single-process mode
原因1: 尝试从不同的进程登录多次,ORACLE以单进程模式启动。
Trying to login more than once from different processes for ORACLE started in single-process mode.
- 状态: 未验证。
措施: 请从其它进程注销。
Logoff from the other process.
ORA-00439: 未启用功能: 【功能名】
ORA-00439: feature not enabled: string
原因1: 指定的功能未启用。
The specified feature is not enabled.
- 状态: 已验证。
- 分析: 当前数据库未具备此功能,无法使用。
措施: 不要尝试使用此功能。
Do not attempt to use this feature.
- 哎,哥们,实在想用此项功能,那就换高版本换企业版之类有这个功能的数据库吧。
- 如果是别人库导过来的,嗯,它的库鄙视了下你的库,擦把汗告诉别人导出时指定下低版本。