Shrink Data files in Oracle

Сперва надо пожать таблицы

  1.  
  2. DECLARE
  3. CURSOR tbn IS SELECT * FROM dba_tables WHERE TABLESPACE_NAME = 'USERS';
  4. tabname tbn%ROWTYPE;
  5. BEGIN
  6. OPEN tbn;
  7. LOOP
  8. FETCH tbn INTO tabname;
  9. EXIT WHEN tbn%NOTFOUND;
  10. EXECUTE IMMEDIATE 'ALTER TABLE ' || tabname.OWNER || '.' || tabname.TABLE_NAME || ' ENABLE ROW MOVEMENT';
  11. EXECUTE IMMEDIATE 'ALTER TABLE ' || tabname.OWNER || '.' || tabname.TABLE_NAME || ' SHRINK SPACE COMPACT';
  12. EXECUTE IMMEDIATE 'ALTER TABLE ' || tabname.OWNER || '.' || tabname.TABLE_NAME || ' SHRINK SPACE';
  13.  
  14. END LOOP;
  15. CLOSE tbn;
  16. EXCEPTION
  17. WHEN OTHERS THEN
  18. dbms_output.put_line(tabname.OWNER || '.' || tabname.TABLE_NAME);
  19. END;
  20.  

Теперь пожать тейблспейс и физические файлы

  1.  
  2. SELECT
  3. 'ALTER DATABASE DATAFILE ''' ||
  4. file_name ||
  5. ''' RESIZE ' ||
  6. CEIL ( (NVL (hwm, 1) * dbats.block_size) / 1024 / 1024) ||
  7. 'M;' shrink_datafiles
  8. FROM
  9. dba_data_files dbadf,
  10. (
  11. SELECT
  12. file_id, MAX (block_id + blocks - 1) hwm
  13. FROM
  14. dba_extents
  15. GROUP BY
  16. file_id
  17. )
  18. dbafs
  19. WHERE dbadf.file_id = dbafs.file_id(+)
  20. AND CEIL (blocks * dbats.block_size / 1024 / 1024) - CEIL ( (NVL (hwm, 1) * dbats.block_size) / 1024 / 1024) > 0;
  21.  

Результат - набор команд для ужатия БД.

Последние изменения на 09:48 10 февраля 2016