時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
在將每天的DMP邏輯備份導入到一個數(shù)據(jù)庫的過程中,在導數(shù)據(jù)之前的不能刪除用戶操作出現(xiàn)下面的錯誤:
OS:linux
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
SQL> drop user test cascade;
drop user test cascade
*
第 1 行出現(xiàn)錯誤:
ORA-01940: cannot drop a user that is currently connected
解決:
查找原因,是由于在原來DMP邏輯備份中test用戶下的數(shù)據(jù)中存在job,由于在導入數(shù)據(jù)時這些job已經(jīng)開始執(zhí)行,所以造成在進程中存在
該test用戶執(zhí)行JOB任務(wù)的會話,說明該用戶正在被使用,所以該用戶是不能被drop掉的
下面的ORA-01940錯誤的復現(xiàn)過程:
創(chuàng)建測試表
drop table test1
select * from test1
create table test1 (datetime date);
創(chuàng)建一個自定義過程
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
創(chuàng)建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登陸系統(tǒng),刪除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
#p#副標題#e#
查看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、殺掉執(zhí)行JOB任務(wù)的會話進程;
alter system disconnect session ’sid,serial#’ immediate;
或者Alter system kill session ’sid,serial#’;
或者
SQL> drop user aa;
drop user aa
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
SQL> select sid,serial# from v$session
2? where username='AA';
SID??? SERIAL#
---------- ----------
136?? 33
SQL> alter system kill session '136,33';
System altered.
2、通過設(shè)置在初始文件中設(shè)置初始參數(shù)JOB_QUEUE_PROCESSES=0來使Oracle會殺掉CJQ0及相應(yīng)job進程;
修改init.ora文件,然后重新啟動數(shù)據(jù)庫,或者執(zhí)行ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 0;
修改過初始參數(shù) 設(shè)置JOB_QUEUE_PROCESSES=0之后,重新啟動數(shù)據(jù)庫之后,進行邏輯備份的導入操作,先刪除用戶,此時刪除成功!
原文地址 http://it.kswchina.com/Oracle/zh/445448.html
關(guān)鍵詞標簽:ORA-01940錯誤
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法