一聚教程网:一个值得你收藏的教程网站

热门教程

Oracle数据库常见问题汇总

时间:2022-06-29 10:02:07 编辑:袖梨 来源:一聚教程网

1、  PLSQL连接数据库提示监听程序无法识别当前监听描述符中请求的服务

修改listener.ora为:
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = F:oracleproduct10.2.0db_1)
      (PROGRAM = extproc)
    )
     (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = F:oracleproduct10.2.0db_1)
      (SID_NAME = orcl)
    )  配置此处监听后,
 
  )
 
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )
保存文件,然后重新启动监听服务TNSListener就可以了 !

原因:主动跟被动的关系
1.是让listener主动加载服务
原因是 添加
    (SID_DESC =
      (SID_NAME = orcl)
      (ORACLE_HOME = /data/cache1/oracleDB/oracle/product/10.2.0/db_2)
    )
后,在使用lsnrctl start监听程序时会将listener的服务注册到进程监视器(pmon)中
2.listener被动加载服务
如果没有该内容,那么由实例的pmon进程在listener中注册服务,对listener来讲,就是被动了。
这也就是为什么先启动监听后启动数据库能够正常连接的,反之不行的原因了。

2、  PLSQL启动提示编码不一致问题,错误提示

   Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results. 

Note: you can set the client character set through the NLS_LANG environment variable or the NLS_LANG registry key in HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0.

打开注册表,通过命令regedit。找到到文中提示的路径,发现NLS_LANG键的值为:

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

修改为:SIMPLIFIED CHINESE_CHINA.AL32UTF8即可

3、 连接sqlplus提示“数据库未打开”

执行alter database open 也提示数据库未打开,或者提示 dbf,pnc文件丢失

错误原因:数据文件被删除

解决办法:

alter database datafile ‘数据文件路径’ offline drop;

alter database open;

如果被删除的是当前日志文件,就只能通过归档日志恢复,如果归档日志毁坏就只能重装了

4、 ORA-04091: table is mutating, trigger/function may not see it 分析和解决办法

错误的原因
该错误是在编写trigger时常遇到的问题,其根本原因是由于对本表的操作造成的.ORACLE DB里默认在写TRIGGER的时候把本表锁死,不允许对其进行操作,当对某个表T进行update时,在trigger的body或trigger调用的存储过程又有对update表的查询,这时常会碰到该错误。

治标的解决办法
利用自治事物进行解决。
自治事物的概念:就是在subprogram里进行事物的提交不影响主程序的事务,同样主程序的提交或回滚都不影响子程序的commit,即子程序的事物和主程序的事物完全独立。
示例:
SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);
     表已创建。

SQL> CREATE OR REPLACE TRIGGER TR_T
2   AFTER DELETE ON T
    --referencing old as old_value 保存旧值
     --new as new_value 保存新值
3   FOR EACH ROW
4   DECLARE V_COUNT NUMBER;
5   --PRAGMA AUTONOMOUS_TRANSACTION;
6   BEGIN
7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
8     COMMIT;
9   END TR_DEL_CABLE;
10   /

触发器已创建

SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);
已创建 1 行。

SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);
已创建 1 行。

SQL> COMMIT;
提交完成。

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;
ID MC                TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
1 111111             20080802 11:07:36
2 222222             20080802 11:07:43

SQL> DELETE FROM T WHERE ID=1;
DELETE FROM T WHERE ID=1
*
第 1 行出现错误:
ORA-04091: 表 TEST.T 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "TEST.TR_T", line 4
ORA-04088: 触发器 'TEST.TR_T' 执行过程中出错


SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

ID MC                TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
1 111111             20080802 11:07:36
2 222222             20080802 11:07:43

SQL> CREATE OR REPLACE TRIGGER TR_T
2   AFTER DELETE ON T
3   FOR EACH ROW
4   DECLARE V_COUNT NUMBER;
5   PRAGMA AUTONOMOUS_TRANSACTION;
6   BEGIN
7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
8     COMMIT;
9   END TR_DEL_CABLE;
10   /

触发器已创建
SQL> DELETE FROM T WHERE ID=1;
已删除 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

ID MC                TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
2 222222             20080802 11:07:43
1 111111             20080802 11:08:32
(注:此前有人说可以通过把NEW OLD中的值放到local变量或package变量中可以避免此类错误,但我尝试过很多,还是照样抛出该错误,故将值存到变量中的方法不可行。)

治本的办法
首先自治事务必须慎用,因为一个DML可能会产生许多个独立的事物,这很容易引发死锁,ASKTOM上对AUTONOMOUS_TRANSACTION的看法是:唯一的用途就是作审计日志,其他一概不该使用。
治本的办法就是彻底废除trigger,把相应的处理逻辑放到存储过程中。

5、sysdba用户无法进入系统

如果是系统管理员,并且在计算机管理用户组里面属于ORA_DBA,可以直接在命令行键入sqlplus / as sysdba 进入系统

   如果机器上有多个实例,以管理员身份也可能进不去,需要设置 set ORACLE_SID=实例SID

   如果sqlplus命令不认,需要设置环境变量,一般不会有此问题,可以查看 echo %PATH

   Window7上oracle安装会在开始里面多一个SQL命令行菜单项,没有命令行编辑器,也不会设置sqlplus服务项,可以通过查找cmd调出命令行编辑器,但是sqlplus不会认

 

热门栏目