ORA-14452的出现原因解析及解决方法
2014-03-26 23:46
239 查看
在删除临时表时遇到了ORA-14452错误:ORA-14452: attempt to create , alert or drop an index on temporary table already in use。第一次碰到这种情况,问题解决过后,为了加深理解,特意参考网上资料,做了下面实验重现错误出现的场景,以及应该如何解决.
会话级临时表
由于实验需要两个或多个会话配合,所以使用SET SQLPROMPT来标识会话,如下所示,SESSION 1与SESSION 2:
Step 1:在会话1中创建了会话级的临时表TMP_TEST
Step 2:打开另外一个会话2,在这个会话里面操作临时表TMP_TEST,插入数据。
Step 3: 在会话1中删除临时表时,就会出现ORA-14452错误。
Step 4: 如果在会话2中先清空数据,然后去会话1中删除表则可顺利完成
事务级临时表
Step 1: 在会话1中创建事务级全局临时表。
Step 2:在会话2中插入一条记录。
Step 3: 在会话3中删除全局临时表时就会报错
Step 4: 在会话2中提交后,即可在会话1中删除全局临时表。
SESSION 2 >COMMIT;
Commit complete.
总结:不管事务级还是会话级的临时表,都需要所有会话解除绑定,才能DROP,解除绑定的办法就是清空每个会话的数据.清空数据的办法:事务级别的临时表:COMMIT/TRUNCATE TABLE;会话级的临时表:TRUNCATE TABLE ;但是很多时候,如果出现了这种错误,但是我们不知道是那个用户的那个会话没有解除绑定,那么此时要如何解决呢?你可以用下面SQL语句来查询那个会话没有解除绑定,然后杀掉会话进程。
或者你使用下面步骤一步一步的去定位那个会话没有解除绑定。
Step 1、先从DBA_OBJECTS/ALL_OBJECTS /USER_OBJECTS中查询到该表的OBJECT_ID:
SELECT OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME='TMP_TEST'
Step 2、根据查到的OBJECT_ID知道使用该表的SESSION:
SELECT * FROM V$LOCK WHERE ID1=&OBJECT_ID;
Step 3、在从v$session视图中查到该session的SID和SERIAL#:
SELECT * FROM V$SESSION WHERE SID=&SID;
Step 4、杀掉这些进程:
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
参考资料:
http://blog.itpub.net/70612/viewspace-1034301/
会话级临时表
由于实验需要两个或多个会话配合,所以使用SET SQLPROMPT来标识会话,如下所示,SESSION 1与SESSION 2:
Step 1:在会话1中创建了会话级的临时表TMP_TEST
SQL> SET SQLPROMPT "SESSION 1 >" SESSION 1 >CREATE GLOBAL TEMPORARY TABLE TMP_TEST 2 ( NAME VARCHAR2(12) ) ON COMMIT PRESERVE ROWS; Table created. SESSION 1 >INSERT INTO TMP_TEST VALUES('Kerry'); 1 row created. SESSION 1 >COMMIT; Commit complete. SESSION 1 >SELECT * FROM TMP_TEST; NAME ------------ Kerry
Step 2:打开另外一个会话2,在这个会话里面操作临时表TMP_TEST,插入数据。
SQL> SET SQLPROMPT "SESSION 2 >" SESSION 2 >SELECT * FROM TMP_TEST; no rows selected SESSION 2 >INSERT INTO TMP_TEST VALUES('Jimmy'); 1 row created. SESSION 2 >SELECT * FROM TMP_TEST; NAME ------------ Jimmy
Step 3: 在会话1中删除临时表时,就会出现ORA-14452错误。
SESSION 1 >TRUNCATE TABLE TMP_TEST; Table truncated. SESSION 1 >DROP TABLE TMP_TEST; DROP TABLE TMP_TEST * ERROR at line 1: ORA-14452: attempt to create, alter or drop an index on temporary table already in use
Step 4: 如果在会话2中先清空数据,然后去会话1中删除表则可顺利完成
SESSION 2 >TRUNCATE TABLE TMP_TEST; Table truncated. SESSION 1 >DROP TABLE TMP_TEST; Table dropped.
事务级临时表
Step 1: 在会话1中创建事务级全局临时表。
SESSION 1 >CREATE GLOBAL TEMPORARY TABLE TMP_TEST 2 ( NAME VARCHAR2(12) ) ON COMMIT DELETE ROWS; Table created. SESSION 1 >INSERT INTO TMP_TEST 2 VALUES('Kerry'); 1 row created. SESSION 1 >SELECT * FROM TMP_TEST; NAME ------------ Kerry SESSION 1 >COMMIT;
Step 2:在会话2中插入一条记录。
SESSION 2 >INSERT INTO TMP_TEST VALUES('Jimmy'); 1 row created. SESSION 2 >SELECT * FROM TMP_TEST; NAME ------------ Jimmy
Step 3: 在会话3中删除全局临时表时就会报错
SESSION 1 >SELECT * FROM TMP_TEST; no rows selected SESSION 1 >TRUNCATE TABLE TMP_TEST; Table truncated. SESSION 1 >DROP TABLE TMP_TEST; DROP TABLE TMP_TEST * ERROR at line 1: ORA-14452: attempt to create, alter or drop an index on temporary table already in use
Step 4: 在会话2中提交后,即可在会话1中删除全局临时表。
SESSION 2 >COMMIT;
Commit complete.
总结:不管事务级还是会话级的临时表,都需要所有会话解除绑定,才能DROP,解除绑定的办法就是清空每个会话的数据.清空数据的办法:事务级别的临时表:COMMIT/TRUNCATE TABLE;会话级的临时表:TRUNCATE TABLE ;但是很多时候,如果出现了这种错误,但是我们不知道是那个用户的那个会话没有解除绑定,那么此时要如何解决呢?你可以用下面SQL语句来查询那个会话没有解除绑定,然后杀掉会话进程。
SELECT SID, SERIAL# FROM V$SESSION V WHERE SID IN (SELECT SID FROM V$LOCK L, DBA_OBJECTS O WHERE L.ID1 = O.OBJECT_ID AND O.OBJECT_NAME =UPPER('TMP_TEST') ); ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
或者你使用下面步骤一步一步的去定位那个会话没有解除绑定。
Step 1、先从DBA_OBJECTS/ALL_OBJECTS /USER_OBJECTS中查询到该表的OBJECT_ID:
SELECT OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_NAME='TMP_TEST'
Step 2、根据查到的OBJECT_ID知道使用该表的SESSION:
SELECT * FROM V$LOCK WHERE ID1=&OBJECT_ID;
Step 3、在从v$session视图中查到该session的SID和SERIAL#:
SELECT * FROM V$SESSION WHERE SID=&SID;
Step 4、杀掉这些进程:
ALTER SYSTEM KILL SESSION 'SID, SERIAL#';
参考资料:
http://blog.itpub.net/70612/viewspace-1034301/
相关文章推荐
- ORA-14452的出现原因解析及解决方法(转)
- ORA-14452的出现原因解析及解决方法
- 将Ofbiz的数据库改为Oracle,运行时出现 ORA-01843: 无效的月份 错误 的原因及解决方法
- Win8系统经常出现DNS解析错误的四种原因及解决方法介绍
- Oracle出现ora-12154无法解析指定连接标识符的解决方法
- 出现 JSP页面中使用JSTL标签无法解析 错误的原因及解决方法
- IN 查询时出现ORA-01795:列表中的最大表达式数为1000解决方法
- windows7下启动mysql服务出现服务名无效的原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- ORA-01109 错误解决方法(我的原因是电脑非法断电造成的)
- 详细讲解ORA-04030的产生原因及解决方法
- 交换机出现err-disable的原因及解决方法
- core文件出现“is not a core dump: File format not recognized”的原因和解决方法(看/proc/pid/limits)
- tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法
- 使用cgminer挖矿出现HW error可能的原因及解决方法
- 使用jdbc-odbc桥读取SQLServer数据库的ntext字段出现乱码的原因与解决方法
- Win10系统windows hello出现闪退的原因及解决方法图文教程
- 出现 java.net.MalformedURLException: no protocol 异常的原因及解决方法
- 编译时,出现ln软连接错误原因及解决方法
- springmvc form表单提交报400错误,出现400错误的原因及解决方法: