oracle空表导不出来

时间:2021-12-09 07:38:06

在oracle 11g r2中,使用exp有时候会导不出空的表,原因是这些表没有分配空间,手工分配空间即可导出。

----查询当前用户下的所有空表:
select table_name from user_tables where NUM_ROWS=0;

----查询DB_YWYH用户所有未分配Extent的表:

SELECT * FROM DBA_TABLES WHERE OWNER='DB_YWYH'
AND TABLE_NAME NOT IN
(
SELECT T.SEGMENT_NAME
FROM DBA_SEGMENTS T
WHERE OWNER='DB_YWYH'
)


----①使用添加一条记录然后再删除这条数据,此表就可以导出了,此方法太笨拙。
----②使用ALLOCATE EXTENT可以为数据库对象分配Extent。其语法如下:
alter table aTabelName allocate extent


-----如果有很多表都没有分配空间,则用一下方法解决
-----构建批量分配Extent语句

SELECT 'ALTER TABLE '||TABLE_NAME||' ALLOCATE EXTENT;' 

FROM DBA_TABLES 

WHERE OWNER='DB_YWYH'
AND TABLE_NAME NOT IN
(
SELECT T.SEGMENT_NAME
FROM DBA_SEGMENTS T
WHERE OWNER='DB_YWYH'
)

导致空表未及时分配空间的原因是oracle 11g 新增了一个参数:DEFERRED_SEGMENT_CREATION,含义是段延迟创建,默认是true,表示你新建了一个表T1,并且没有向其中插入数据,那么这个表不会立即分配Extent,也就是不占数据空间,只有当你insert数据后才分配空间。这样可以节省少量的空间。