htbzwd 发表于 2018-9-13 08:07:31

oracle空表导不出来

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

页: [1]
查看完整版本: oracle空表导不出来