常用Oracle表数据删除有如下两种方式:
1、delete from tablename;
2、trancate table tablename;
这两种方式都能达到删除数据的效果,但在Oracle空间回收的机制中,这两种方式有着不同的区别;
使用drop方式删除表中数据,能够回收数据所占用的数据块,但使用delete方式删除表中数据,
是无法回收数据块,数据块仍然占用着磁盘空间。我们可以通过如下方式查看表所占用的数据块:
新建表并插入数据:create table T as select * from dba_objects;
select count(*) from user_extents where segment_name='T';如果如下:
COUNT(*)
----------
23
一共23个数据块,我们使用delete删除数据后再看结果:
COUNT(*)
----------
23
通过结果可以看出,数据块并没有被回收掉,我们再通过执行alter table T move看看结果:
COUNT(*)
----------
1
这时,数据块被回收了。
但这样就会引入索引失败的潜在问题,我们来模拟这种情况的发生:
SQL>CREATE TABLE T AS SELECT * FROM DBA_OBJECTS;
SQL>CREATE INDEX T_IDX ON T(OBJECT_ID);
我们先看索引未失效时的状态:
SQL>select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T_IDX';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
T_IDX NORMAL SYSTEM TABLE VALID
使索引失效:
SQL>ALTER TABLE T MOVE;
SQL>select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='T_IDX';
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
T_IDX NORMAL SYSTEM TABLE UNUSABLE
SQL>INSERT INTO T VALUES(VALUE);
这时,索引状态变成了UNUSABLE,插入数据导致Oracle抛出了ORA-01502错误。
从上面的MOVE操作到导致ORA-01502错误,个人理解如下:
MOVE操作类似磁盘碎片整理,操作后,将断断续续的无有的碎片空间回收,并对整个磁盘文件空间系统重新整理,这样肯定
会涉及到数据块的移动,但并未同步将表关联的索引对象所引用的数据块做更新,这就意味着此时这个索引对应的数据块其实已经出错了。
所以我们需要重建索引,使用如下命令修复:
SQL>alter session set skip_unusable_indexes=false;
SQL>alter index T_IDX rebuild;
如果数据文件满了也会导致这个错误。
另,Oracle中还有很多地方需要用到rebuild,sync,像对象分析,数据压缩等等。
分享到:
相关推荐
Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法
使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查。使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查 使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查
离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法,在解决ORA-01033的过程中,又出现ORA-01145 * 第 1 行出现错误: ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机 接着的解决步骤
oracle数据库ora-01152和ora-01110的解决办法
错误描述:oracle远程连接服务器出现 ORA-12170 TNS:连接超时 错误检查:有很多是oracle自身安装的问题,但是我这里服务器配置正常,监听正常,服务正常,远程可以ping通服务器。 这里主要是防火墙问题,解决办法: ...
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Drop goldengate用户时,报ORA-00604 ORA-20782 ORA-06512错误
oracle启动失败,ORA-00702报错,windows,linux系统下解决办法
ORA-12541 TNSno listener 的解决方案 ORA-12541 TNSno listener 的解决方案
本人在工作中,从测试库往正式库中复制记录,用select for update 报错:ORA-01480:STR 绑定值的结尾 Null字符缺失 ,遂上网查找,都说是有非法字符(半个引号) 或者长度超长造成的。根据本人分析,应该不是上述原因...
用oracle数据库新建连接时遇到ora-12505,此问题解决后又出现ora-12519错误,郁闷的半天,经过一番折腾问题解决,下面小编把我的两种解决方案分享给大家,仅供参考。 解决方案一: 今天工作时在新建连接的时候遇到...
oracle网络配置(listener_ora-sqlnet_ora-tnsnames_ora).mht
关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明
ORA-00704,ORA-39700问题解决
客户端进行连接的时候,系统不定期出现ora-12520,ora-12516的连接问题, 问题解决方案建议: 1、增加process和session的连接数。 2、检查连接的应用,是不是有没有释放的连接。 3、将修改参数local_listener中的vip为...
oracle的ORA-12514错误 解决办法
ORA-32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL>alter system set control_files=’/u01/app/oracle/oradata/prod/...
ORACLE ORA-00132 ORA-00214
Oracle数据库报错ORA-00904: 标识符无效问题解决办法,有可能是字段名或者表名写错了,也有可能是