ORA-01940错误的解决过程
2008-12-16 16:04
393 查看
在将每天的DMP逻辑备份导入到一个数据库的过程中,在导数据之前的不能删除用户操作出现下面的错误:
OS:linux
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
SQL> drop user test cascade;
drop user test cascade
*
第 1 行出现错误:
ORA-01940: cannot drop a user that is currently connected
解决:
查找原因,是由于在原来DMP逻辑备份中test用户下的数据中存在job,由于在导入数据时这些job已经开始执行,所以造成在进程中存在
该test用户执行JOB任务的会话,说明该用户正在被使用,所以该用户是不能被drop掉的
下面的ORA-01940错误的复现过程:
创建测试表
drop table test1
select * from test1
create table test1 (datetime date);
创建一个自定义过程
create or replace procedure MYPROC as
begin
for i in 1..100000 loop
insert into TEST1(datetime) values(sysdate);
end loop;
end;
PL/SQL procedure successfully completed
创建JOB,每天1440分钟,即每5分钟运行test过程一次
declare
job number;
begin
sys.dbms_job.submit
(job => job,
what =>'MYPROC;',
next_date => sysdate,
interval => 'sysdate+(1/1440)*5');
commit;
end;
PL/SQL procedure successfully completed
运行JOB
SQL> begin
2 sys.dbms_job.run(241);
3 end;
4 /
PL/SQL procedure successfully completed
此时需要删除用户daimin时,就会报下面的错误
以sys登陆系统,删除daimin用户
--查看daimin用户下的job
SQL> select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
2 from dba_jobs where schema_user='DAIMIN';
JOB WHAT INTERVAL TO_CHAR(NEXT_DATE,'YYYY-MM-DDH
---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------
241 MYPROC; sysdate+(1/1440)*5 2008-12-16 10:10:03
查看正在运行的JOB
SQL> select * from dba_jobs_running;
SID JOB FAILURES LAST_DATE LAST_SEC THIS_DATE THIS_SEC INSTANCE
---------- ---------- ---------- ----------- ---------------- ----------- ---------------- ----------
1619 241 2008-12-16 10:25:51 0
查看daimin用户的活动会话
SQL> select sid,serial#,username,program,machine,status
2 from v$session
3 where username='DAIMIN'
4 AND STATUS='ACTIVE';
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---------- ---------- ------------------------------ ------------------------------------------------ ---------------------------------------------------------------- --------
1619 2360 DAIMIN plsqldev.exe STAPLES/DELLF98P-10QC ACTIVE
--以sys用户下来删除daimin用户,会报下面的错误
SQL> drop user daimin cascade;
drop user daimin cascade
ORA-01940: cannot drop a user that is currently connected
试图删除job
SQL> begin
2 FOR r_job IN (select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
3 from dba_jobs where schema_user='DAIMIN'
4 ) LOOP
5 dbms_job.REMOVE(r_job.job);
6 end loop;
7 commit;
8 end;
9 /
begin
FOR r_job IN (select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
from dba_jobs where schema_user='DAIMIN'
) LOOP
dbms_job.REMOVE(r_job.job);
end loop;
commit;
end;
ORA-23421: job number 241 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 171
ORA-06512: at line 5
分析错误:因为以sys用户来删除daimin用户下的JOB,所以会报错
解决方法:
1、杀掉执行JOB任务的会话进程;
alter system disconnect session 'sid,serial#' immediate;
或者Alter system kill session 'sid,serial#';
2、通过设置在初始文件中设置初始参数JOB_QUEUE_PROCESSES=0来使Oracle会杀掉CJQ0及相应job进程;
修改init.ora文件,然后重新启动数据库,或者执行ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
修改过初始参数 设置JOB_QUEUE_PROCESSES=0之后,重新启动数据库之后,进行逻辑备份的导入操作,先删除用户,此时删除成功!!
参考网页:
http://www.linux-cn.com/html/database/Oracle/20070423/9927.html http://www.itpub.net/thread-271792-1-1.html http://hi.baidu.com/oracle_10g/blog/item/0137c1bf1acbe10919d81fd9.html http://www.ixdba.net/article/59/1826.html
OS:linux
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
SQL> drop user test cascade;
drop user test cascade
*
第 1 行出现错误:
ORA-01940: cannot drop a user that is currently connected
解决:
查找原因,是由于在原来DMP逻辑备份中test用户下的数据中存在job,由于在导入数据时这些job已经开始执行,所以造成在进程中存在
该test用户执行JOB任务的会话,说明该用户正在被使用,所以该用户是不能被drop掉的
下面的ORA-01940错误的复现过程:
创建测试表
drop table test1
select * from test1
create table test1 (datetime date);
创建一个自定义过程
create or replace procedure MYPROC as
begin
for i in 1..100000 loop
insert into TEST1(datetime) values(sysdate);
end loop;
end;
PL/SQL procedure successfully completed
创建JOB,每天1440分钟,即每5分钟运行test过程一次
declare
job number;
begin
sys.dbms_job.submit
(job => job,
what =>'MYPROC;',
next_date => sysdate,
interval => 'sysdate+(1/1440)*5');
commit;
end;
PL/SQL procedure successfully completed
运行JOB
SQL> begin
2 sys.dbms_job.run(241);
3 end;
4 /
PL/SQL procedure successfully completed
此时需要删除用户daimin时,就会报下面的错误
以sys登陆系统,删除daimin用户
--查看daimin用户下的job
SQL> select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
2 from dba_jobs where schema_user='DAIMIN';
JOB WHAT INTERVAL TO_CHAR(NEXT_DATE,'YYYY-MM-DDH
---------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------
241 MYPROC; sysdate+(1/1440)*5 2008-12-16 10:10:03
查看正在运行的JOB
SQL> select * from dba_jobs_running;
SID JOB FAILURES LAST_DATE LAST_SEC THIS_DATE THIS_SEC INSTANCE
---------- ---------- ---------- ----------- ---------------- ----------- ---------------- ----------
1619 241 2008-12-16 10:25:51 0
查看daimin用户的活动会话
SQL> select sid,serial#,username,program,machine,status
2 from v$session
3 where username='DAIMIN'
4 AND STATUS='ACTIVE';
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---------- ---------- ------------------------------ ------------------------------------------------ ---------------------------------------------------------------- --------
1619 2360 DAIMIN plsqldev.exe STAPLES/DELLF98P-10QC ACTIVE
--以sys用户下来删除daimin用户,会报下面的错误
SQL> drop user daimin cascade;
drop user daimin cascade
ORA-01940: cannot drop a user that is currently connected
试图删除job
SQL> begin
2 FOR r_job IN (select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
3 from dba_jobs where schema_user='DAIMIN'
4 ) LOOP
5 dbms_job.REMOVE(r_job.job);
6 end loop;
7 commit;
8 end;
9 /
begin
FOR r_job IN (select job,what,interval,to_char(next_date, 'yyyy-mm-dd hh24:mi:ss ')
from dba_jobs where schema_user='DAIMIN'
) LOOP
dbms_job.REMOVE(r_job.job);
end loop;
commit;
end;
ORA-23421: job number 241 is not a job in the job queue
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.DBMS_IJOB", line 529
ORA-06512: at "SYS.DBMS_JOB", line 171
ORA-06512: at line 5
分析错误:因为以sys用户来删除daimin用户下的JOB,所以会报错
解决方法:
1、杀掉执行JOB任务的会话进程;
alter system disconnect session 'sid,serial#' immediate;
或者Alter system kill session 'sid,serial#';
2、通过设置在初始文件中设置初始参数JOB_QUEUE_PROCESSES=0来使Oracle会杀掉CJQ0及相应job进程;
修改init.ora文件,然后重新启动数据库,或者执行ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
修改过初始参数 设置JOB_QUEUE_PROCESSES=0之后,重新启动数据库之后,进行逻辑备份的导入操作,先删除用户,此时删除成功!!
参考网页:
http://www.linux-cn.com/html/database/Oracle/20070423/9927.html http://www.itpub.net/thread-271792-1-1.html http://hi.baidu.com/oracle_10g/blog/item/0137c1bf1acbe10919d81fd9.html http://www.ixdba.net/article/59/1826.html
相关文章推荐
- oracle错误(四) ORA-04088: 触发器 'SL.CMS_CHANNEL_TRI' 执行过程中出错的解决办法
- 解决导入过程中出现的ORA-02289错误
- 一次 ORA-00600错误 参数[6749]的解决过程
- 由中间件连接引起的ora-01940错误的解决
- 调用远程数据库的存储过程出现“ORA-02064不支持分布式操作”错误的解决方法
- ORA-600(17069)错误的解决过程
- ORA-01589错误的解决过程
- 这周一个ORACLE问题的解决过程(ORA-12560:TNS:协议适配器错误! )
- ORA-00600 [2662]错误解决过程
- oracel故障数据恢复 - ora-01033错误解决过程.
- oracle安装过程中出现ORA-12705和ORA-01264错误解决方法
- ORA-00603错误解决过程
- ORACLE 存储过程的创建以及ORA-06502:PL/SQL:数字或值错误的解决方法
- ora-00201,ora-00202错误的解决过程
- Ora-27100错误解决过程
- Ora-27100错误解决过程
- ORA-08103错误的解决过程
- “ORA-01940:无法删除当前已连接的用户”错误的解决
- informatica 抛出ora-12592 :包错误 排查过程和解决办法
- 一次ora-12560错误的解决过程!