Oracle数据库配置中的常见错误代码和解决方案

  • 来源: 龙腾软件教程网 作者: 若水   2008-04-02/11:21
  • Oracle客户端网络配置:

     
    l 在Oralce产品安装完成后,为了与数据库服务器进行连接或者是两台数据库之间进行数据复制,则必须进行网络连接配置。


    l Oracle9i Net Service配置方法:


    Oracle9i Net Service的连接配置可以使用数据库实例ORACLE_SID,或者是使用Oracle9i的参数 SERVICE_NAMES。配置Oracle9i客户端与Oracle9i服务器端的连接,也是生成Oracle9i Net Service客户端网络配置文件tnsnames.ora,也可以编辑这个文件。
    tnsnames.ora文件在Window与Unix下的存储目录:
    Window NT/2000: D:/oracle/ora90/network/admin/tnsnames.ora
    UNIX:/home/app/oracle/product/9.0.1/network/admin/tnsnames.ora


    如果tnsnames.ora文件配置不正确,则错误信息会记录在连接日志信息文件中,其错误信息内容为:
    The error strutct:
    Nr err code:0
    Ns main err code:12560
    TNS -12560:TNS: 协议适配器出现错误
    ns secondary err code:0
    nt main err code:530
    tns-00530:协议适配器错误
    nt secondary err code:2
    nt OS err code:0


    在配置Oracle9i的连接配置中,其服务器端需要配置监听程序进程配置文件listener.ora,如果服务器端监听进程没有启动,则出现以下错误信息:



    在服务器中,tnsnames.ora默认是使用服务器名进行配置的,所以如果修改了机器名,则该文件同时需要修改,否则出现如下错误:


    络连接串(即tnsnames.ora文件中的HOST处)中使用的机器名和IP地址不存在,重新修改和重新连接即可。
    Oracle9i Net Service的向导工具进行配置:
    选择此选项以创建、修改、删除或重命名监听程序。监听程序是服务器中接收和响应客户机对数据库的连接请求的进程。使用配置有相同协议地址的连接描述符的客户机可以向监听程序发送连接请求。
    Oracle9i net Manager:
    可以定义简单名称来表示服务的位置,例如一个数据库,这些简单名称映射为连接描述符。他们包含服务的网络标识和位置。
    错误信息ORA-12560表示,在操作系统中找不到所定义的实例,在Oracle9i中,如果出现了此类错误,一般来说出错原因有两个,一是实例名被错误的修改,二是Oracle的服务没有正常启动。

    Oracle ORA-00903错误

    ORA-00903 invalid table name

    ORA-00903:无效的表名

    Cause A table or cluster name is invalid or does not exist. This message is also issued if an invalid cluster name or no cluster name is specified in an ALTER CLUSTER or DROP CLUSTER statement.

    Action Check spelling. A valid table name or cluster name must begin with a letter and may contain only alphanumeric characters and the special characters $, _, and #. The name must be less than or equal to 30 characters and cannot be a reserved word.

    原因:表名或簇名不存在或无效,当运行ALTER CLUSTER 或 DROP CLUSTER语句时,会出现此错误信息。

    方案:检查拼写是否正确。一个有效的表名或簇名必须以字母开头,只含有字母或数字,不能超过30个字符,可以包含一些特殊字符$, _, #。表名或簇名不能是关键字。

    案例一: 使用 DBMS_SQL包执行DDL语句

    The DBMS_SQL package can be used to execute DDL statements directly from PL/SQL.

    这是一个创建一个表的过程的例子。该过程有两个参数:表名和字段及其类型的列表。

    CREATE OR REPLACE PROCEDURE ddlproc (tablename varchar2, cols varchar2) AS
    cursor1 INTEGER;
    BEGIN
    cursor1 := dbms_sql.open_cursor;
    dbms_sql.parse(cursor1, 'CREATE TABLE ' || tablename || '( ' || cols || ' )', dbms_sql.v7);
    dbms_sql.close_cursor(cursor1);
    end;
    /
    SQL> execute ddlproc ('MYTABLE','COL1 NUMBER, COL2 VARCHAR2(10)');
    PL/SQL procedure successfully completed.
    SQL> desc mytable;
    Name Null? Type------------------------------- -------- ----COL1 NUMBERCOL2 VARCHAR2(10)

    注意:DDL语句是由Parese命令执行的。因此,不能对DDL语句使用bind变量,否则你就会受到一个错误信息。下面的在DDL语句中使用bind变量的例子是错误的。

    **** Incorrect Example ****
    CREATE OR REPLACE PROCEDURE ddlproc (tablename VARCHAR2,
    colname VARCHAR2,
    coltype VARCHAR2) AS
    cursor1 INTEGER;
    ignore INTEGER;
    BEGIN
    cursor1 := dbms_sql.open_cursor;
    dbms_sql.parse(cursor1, 'CREATE TABLE :x1 (:y1 :z1)', dbms_sql.v7);
    dbms_sql.bind_variable(cursor1, ':x1', tablename);
    dbms_sql.bind_variable(cursor1, ':y1', colname);
    dbms_sql.bind_variable(cursor1, ':z1', coltype);
    ignore := dbms_sql.execute(cursor1);
    dbms_sql.close_cursor(cursor1);
    end;
    /

    虽然在过程创建时,没有错误信息。但在运行时,你将得到错误信息"ORA-00903: invalid table name" 。

    SQL> execute ddlproc ('MYTABLE', 'COL1', 'NUMBER');

    begin ddlproc ('MYTABLE', 'COL1', 'NUMBER'); end;

    *

    ERROR at line 1:

    ORA-00903: invalid table name

    ORA-06512: at "SYS.DBMS_SYS_SQL", line 239

    ORA-06512: at "SYS.DBMS_SQL", line 25

    ORA-06512: at "SCOTT.DDLPROC", line 8

    ORA-06512: at line 1

    案例二:SQL*Plus 中的触发器错误

    你是如何发现dbms_error_code 数字的呢?我如何才能在SQL*Plus 中显示Oracle错误信息描述呢?#p#分页标题#e#

    第1行错误:

    ORA-04098: 'SYSTEM.LOG_ERRORS_TRIG'触发器无效,并且无法再次生效

    ORA-00903: 无效表明

    ORA错误可以在错误信息指南(technet.oracle.com上可以找到完全的文档)中找到。你列出的错误信息说的是SYSTEM ID拥有的名为LOG_ERRORS_TRIG的触发器无效了,因为触发器中参考了一个无效的表名。你需要找出触发器代码并从那里开始继续。

     

    ORA-01650:unable to extend rollback segment NAME by NUM intablespace NAME

    产生原因:上述ORACLE错误为回滚段表空间不足引起的,这也是ORACLE数据管理员最常见的ORACLE错误信息。当用户在做一个非常庞大的数据操作导致现有回滚段的不足,使可分配用的回滚段表空间已满,无法再进行分配,就会出现上述的错误。

    ORA-01652:unable to extend temp segment by num in tablespace name

    产生原因:ORACLE临时段表空间不足,因为ORACLE总是尽量分配连续空间,一但没有足够的可分配空间或者分配不连续就会出现上述的现象。

    ORA-01628:max # of extents num reached for rollback segment num

    产生原因:这种错误通常为一个回滚段和一个表空间已经达到MAXEXTENTS参数设置的极限。要注意的是这个MAXEXTENTS不是该回滚段或表空间的硬件极限,硬件极限取决于数据库创建时在init.ora文件中指定的DB_BLOCK_SIZE参数的值。

    ORA-01688:unable to extend table name.name partition NAME by NUM in tablespace NAME

    产生原因:指定的tablespace空间已经被占用满,无法扩展。

    Ora-03113 错误分析

    每一个DBA在进行数据库管理的过程中不可避免的要遇到形形色色的错误(ORA-1547 ,ORA-904,ORA-1578 ......)。有些错误由于频繁出现、原因复杂而被 Oracle DBA 们戏称之为"经典的错误"。其中ORA-3113 "end of file on communication channel" 就是这样的一个。

    我们可以简单的把这个错误理解为Oracle客户端进程和数据库后台进程连接中断。不过,导致这个错误的原因实际上有很多种:对数据库设置不当、任何能导致数据库后台进程崩溃的行为都可能产生这个错误。这个错误的出现还经常伴随着其它错误,比如说:
    ORA-1034 ORACLE not available
    
    此外,该错误出现的场景复杂,可能出现在:
    • 启动的Oracle的时侯
    • 试图创建数据库的时侯
    • 试图对数据库进行连接的时侯
    • 在客户端正在运行SQL/PL/SQL的时侯
    • 备份/恢复数据库的时侯
    • 其它一些情况下......

    在论坛上也时常可以看到初级DBA对这个问题的求救。在这里简单的对该问题进行一下整理。

    错误原因种种


    根据网络上大家反映的情况来看,错误原因大约有这些:
    • Unix核心参数设置不当
    • Oracle执行文件权限不正确/环境变量问题
    • 客户端通信不能正确处理
    • 数据库服务器崩溃/操作系统崩溃/进程被kill
    • Oracle 内部错误
    • 特定SQL、PL/SQL引起的错误
    • 空间不够
    • 防火墙的问题
    • 其它原因
    在开始解决问题之前,作如下几件事情:
    • 回忆一下在出现错误之前你都做了什么操作,越详细越好;
    • 查看 background_dump_dest 目录中的 alertSID.log 文件也是你必须要的事情;
    • Google 搜索一下,在互联网上有很多信息等着你去发现,不要什么都问别人。

    当然, 如果你找到了一些对你更有帮助的东西--这篇文档就不用看了 :-)


    错误原因情景分析

    1) Unix核心参数设置不当 / init参数设置不当

    如果数据库在安装过程中没有设定正确的操作系统核心变量,可能在安装数据库文件的时侯没甚么问题,在创建数据库的时侯常常会出现03113错误。和此有关的另一个原因是init.ora 参数文件中的processes参数指定了不合理的值,启动数据库导致错误出现(当然这个归根到底也是核心参数的问题).这个错误信息一般如下:

    ORA-03113: end-of-file on communication channel
    ORA-01034: ORACLE not available
    ORA-27101: shared memory realm does not exist

    解决办法有两个:

    • 修改核心参数,加大相应核心参数的值(推荐)
    • 减小init.ora参数的Processes的值。

    需要注意的是:

    • SEMMSL必须设定为至少要10 + '进程数的最大值'
    • SEMMNS 也依赖于每个数据库上的进程参数值。

    注:这个错误类型只在Unix平台上出现。在Windows上如果processes的值过大,则会出现类似如下的错误:


    ORA-00068: invalid value 24200001 for parameter max_rollback_segments,
    must be between 2
     and 65535 
    /* 此时指定的参数值超过了65535 */

    或者
    ORA-27102: out of memory

    /* 小于65535的一个大参数值 */

    在特定平台上更改核心参数可能会有差别,请参考Oracle Technet(http://otn.oracle.com) 上的安装文档。对特定Unix平台的安装文档也有对核心参数意义的解释。


    Init.ora 中的参数如果设置不当,会产生该错误。有经验表明:shared_pool_size 参数设置过小会出现错误,此外 timed_statistics=true 的设置也会带来问题。

     

    2) Oracle执行文件权限不正确/环境变量问题

    这个问题只出现在Unix平台上。常见情况是有的时侯管理员为了方便而使用 Unix 的 tar 命令处理过的压缩包进行的安装,或者是系统管理员指定了额外的 #p#分页标题#e#OS 用户也可以管理数据库却没有指定正确的环境变量。

    Oracle执行文件在$ORACLE_HOME/bin目录下,如果出现问题,应该用如下Unix类似命令来纠正:

    #chmod 7755 $ORACLE_HOME/bin/oracle 
    

    有的时侯要对 Oracle 软件进行 relink 操作。

    在Unix上通过cp拷贝安装的时候,常常会出现环境变量的问题,和个别执行程序连接问题。 LD_LIBRARY_PATH如果设置的不正确会导致问题,在这种情况下,需要对Oracle进行relink。如果可执行文件oralcle被破坏,也要对其relink。如果安装了并行服务器选项而 Distributed Lock Manager 没有安装或正确运行也会导致错误。

    3) 客户端通信不能正确处理

    3.1.SQL*Net驱动器的问题.

    如果使用的版本比较低的驱动器,请更换到新版本的驱动。SQL*Net 的驱动没有连接到Oracle可执行文件会导致错误。

    3.2.检查TCP/IP网络是否通畅;

    3.3.Windows平台的常见网络问题:

    在Windows平台创建数据库的时侯,如果出现该问题可以考虑用如下的方法:

    首先检查本地网络设置.查看网络上是否有同名的结点或有冲突的IP.如果问题依旧,可以保守的用下面的方法:
    • 禁用网卡:将本地连接状态改为禁用;
    • 将sqlnet.ora文件打开(以记事本形式)将nts验证注释掉:
      #SQLNET.AUTHENTICATION_SERVICES= (NTS) 
      
    • 创建数据库;
    • 创建成功后,恢复本地连接;

    4) 数据库服务器崩溃/操作系统崩溃/进程被异常的Kill

    在连接过程中,如果Oracle数据库的服务器崩溃或者数据库所在的操作系统崩溃,就会出现这 个错误,Oracle Server崩溃的原因可能因为主要后台进程死掉,被错误的进行了Kill操作。如果是这个原因还是比较容易解决的。此外,和OS有关的应用程序存在内存泄漏(或者有病毒)的时侯也会导致Oracle后台程序问题。推荐排错步骤:

    • 1、查看应用软件相关进程是否正常运行;
    • 2、 查看有无内存泄漏;
    • 3、 查杀病毒;
    • 4、 确定系统管理员没有进行误操作;
    • 5、 确定无黑客入侵行为;
    • 6、 其它不确定因素......

     

    5) Oracle 内部错误 / Bug

    如果查看background_dump_dest目录中的alert.log发现有ora-600/ora-07445等错误,可以到Metalink站点上查看具体信息及其解决方案。一般情况下要打软件补丁。

     

    6) 特定SQL、PL/SQL引起的错误

    尝试把SQL进行分开执行,也可以用SQL_TRACE来进行跟踪,找到导致问题的SQL语句。在SQLPlus下:

    ALTER SESSION SET sql_trace=TRUE;

    SQL语句中的非法字符和不合理的处理结果,甚至一些不可解释的原因偶尔会带来问题.

     

    7) 系统空间不够

    任何时侯都要确保数据库系统有足够的空间.如果 USER_DUMP_DEST和BACKGROUND_DUMP_DEST没有剩余空间的话,会导致此问题.此外,如果打开了审计,AUDIT目录要由足够的空间.如果激活了Trace的话,Trace目录要由足够的空间.Dave Wotton的文档表明,在对表进行插入数据的时侯,如果文件超过了2G (而文件系统有2G限制),会导致该问题.

     

    8) 防火墙的问题

    如果数据要通过防火墙,请联系系统管理员,询问是否对数据库数据进行了过滤或者是突然禁止了通信端口。如本地安装有个人防火墙,请检查本地设置。

     

    *) 其它方面说明

    导致这个错误的原因有很多种,上面列到的只是一些典型情况。去一些数据库技术论坛求助可能会得到更多帮助。比如说CNOUG(http://www.cnoug.org)等

    Error:ORA:-12545:因目标主机和对象不存在,连接失败
    错误代码ORA-12545表示网
    ERROR:ORA-12651:TNS:没有监听器
    该信息说明所要连接的服务器没有启动监听进程Listener(该进程为Oracle服务器上操作系统进程,监听进程没有启动时,服务器可以正常进行,但是客户端不能与服务器产生连接。这时可以在服务器使用操作系统命令lsnrctl正常起启动监听进程)具体方法如下:
    C:>lsnrctl start
    停止监听方法:
    C:>lsnrctl stop
    修改计算机名后则需要修改监听进程中的HOST,否则监听程序会出现以下错误:
    Tns-12545:因目标主机或者对象不存在,连接失败
    Tns-12560:tns:协议适配器错误
    Tns-00515: 因目标主机或者对象不存在,连接失败
    Error:1001:unknow error
    在Window NT/2000中,使用服务列表启动listener.ora服务时也会出现同样的错误信息:
    (对话框)进行意外中止
    这时,可以修改listener.ora中的下一列信息中HOST处的主机名:
    (ADDRESS=(PROTOCOL=TCP)(HOST=SUN4500)(PORT=1521))
    该名称必须与实际符合,重新启动监听程序即可。附:在listener.ora文件中,HOST处允许使用IP地址,这样修改机器名后就不会引起监听程序启动失败。
    此外在服务器与listener.ora文件统一目录中还有一个文件即:tnsnames.ora文件,此文件是用于两个服务器之间的连接配置,即Oracel分布式环境中的网络配置该文件的目录如下:
    Window NT/2000 D:\oracel\ora90\network\admin\tnsnames.ora
    UNIX: /home/app/oracle/product/9.0.1/network/admin/tnsnames.ora

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多