当使用Oracle数据库管理企业数据或者商业数据时,应用开发人员、用户和DBA(Database Administrator,数据库管理员)可能会遭遇不同类型的失败。失败不同,Oracle所提供的处理方法也有所不同。有些失败需要DBA进行恢复,而有些失败不需要任何用户进行干预。Oracle失败包括语句失败、用户错误、进程失败、网络失败、例程失败和介质失败六种类型,下面简述下语句失败以及解决方法。
1.1.1语句失败
语句失败是指处理SQL语句出现逻辑失败。当出现语句失败时,Oracle Server会自动回退失败的SQL语句,并且会给用户返回错误代码和错误消息。通过查看错误代码和错误消息,应用开发人员和DBA可以确定错误原因,并解决这些错误。下面介绍常用的语句失败及其解决方法。
1.应用逻辑错误
应用逻辑错误主要是指SQL语句的编写错误,例如在未连接到数据库的情况下执行SQL语句。改类错误应该由应用开发人员解决,而不是DBA的责任。错误示例如下:
SQL>UPDATEempsetsal=1000WHEREempno=7788;
SP2-0640:未连接
为了防止出现上述错误,首先需要以正确的用户连接到Oracle数据库,然后再执行相应的SQL语句。解决示例如下:
D:\>sqlplus sys/oracle as sysdba(本地)
已连接。
SQL>UPDATEempSETsal=1000WHEREempno=7788;
已更新1行。
2.输入错误数据
输入错误数据是指用户试图输入违反约束规则的错误数据。假定在EMP.SAL列(emp.表名,SAL.列名)上定义了CHECK约束,并且该CHECK约束要求工资必须在800~5000之间,如果在执行INSERT语句或UPDATE语句时输入的工资值不在该范围内,那么执行SQL语句会出现失败。错误示例如下:
SQL> update emp set sal=6000 where empno=7788;
update emp set sal=6000 where empno=7788
*
第一行出现错误:
ORA-02290:违反检查约束条件(SCOTT.SYS_C005298)
为了解决错误数据的输入问题,应该仔细核对要输入的数据,然后输入正确的数据重新执行语句。解决示例如下:
SQL> update emp set sal=6000 where empno=7788;
已更新1行。
3.执行未授权操作
执行未授权操作是指数据库用户试图执行未被授权的数据库操作。假定SMITH用户不具备SELECT ANY TABLE系统权限,并且在SCOTT.EMP表上不具备任何对象权限,那么当该用户访问SCOTT.EMP表时将会显示错误信息。错误示例如下:
SQL> create user smith identified by oracle;
用户已创建。
SQL> alter user smith account unlock;
用户已更改。(给用户解锁)
SQL> grant create session to smith;
授权成功。(授予连接会话权限)
D:\>sqlplus smith/oracle
SQL> select ename,sal from scott.emp where deptno=10;
select ename,sal from scott.emp where deptno=10
*
第1行出现错误:
ORA-00942:表或视图不存在
如上所示,因为SMITH用户在scott.emp表上不具备任何权限,所有当查询该表时会显示错误信息。为了解决这种错误,应该为用户授予必需的权限。解决示例如下:
D:\>sqlplus sys/oracle as sysdba
SQL> grant select on scott.emp to smith;
授权成功。
D:\>sqlplus smith/oracle
SQL> select ename,sal from scott.emp where deptno=10;
ENAMESAL
---------- ----------
CLARK2450
KING5000
MILLER1300
4.超出空间配额
超出空间配额是指用户在特定表空间上所需实际空间超过了该用户在该表空间上可占用的最大空间。假定smith用户在user01表空间上具有1m的空间配额,并且其对象已经在user01表空间上占用了900k的空间,如果该用户要建立的新表所需空间超过200K,那么建表将会出现失败。错误示例如下:
SQL> create tablespace user01
2datafile 'E:\oracle\product\10.2.0\oradata\orcl\user01.dbf' size200M;
表空间已创建。(创建表空间)
SQL> alter user smith quota unlimited on user01;
用户已更改。(授予用户使用表空间权限)
SQL> grant create table to smith;
授权成功。(授予用户创建表权限)
create table temp(cola int,colb int) storage(minextents 4)
*
第1行出现错误:
ORA-01536:超出表空间’USERO1’的空间限额
为了解决这种错误,应该以DBA身份登录到数据库,使用ALTER USER语句为用户分配更多的空间配额,然后重新执行相应语句。解决示例如下:
D:\>sqlplus sys/oracle as sysdba
SQL>alter user smith quota100mon user01;
用户已更改。
D:\>sqlplus smith/oracle
SQL> create table temp(cola int,colb int) storage(minextents 4);
表已创建。
5.表空间无足够空间
表空间无足够空间是指当SQL操作需要从表空间分配空间时,表空间没有足够剩余空间所导致的错误。当用户执行Create Table语句、INSERT语句或UPDATE语句、使用SQL*Loader装载数据时,可能会导致在表空间中分配区。如果表空间没有足够的剩余空进啊,那么分配区将会失败。错误示例如下:
SQL> insert /*+append*/ into sales value (select * from temp);
Insert /*+append*/ into sales value (select * from temp)
第一行出现错误:
ORA-01653:表SMITH.SALES无法通过8 (在表空间USER01中)扩展
如上所示,当用户试图将TEMP表数据装载到SALES表时,因为表空间USER01没有足够的剩余空间,从而导致了以上错误。从技术角度讲,DBA应该确保表空间具有足够空间,以避免出现该类错误。但如果出现了这种错误,DBA应该扩展表空间。解决示例如下:
SQL> conn system/oracle
SQL> alter tablespace user01 add datafile ‘d:\demo\ser01_2.dbf’ size10mautoexend on next10m;
SQL> conn smith/oracle
已连接。
SQL> insert /*+append*/ into sales value (select * from temp);
已创建280000行。
《待续》
SQL>create table temp(cola int,colb int) storage(minextents 4);