打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle收缩表空间主要命令
userphoto

2024.04.21 浙江

关注

本脚本主要用于回收表空间,收缩数据文件 —By Firsouler

  1. set verify off
  2. column file_name format a50 word_wrapped
  3. column smallest format 999,990 heading "Smallest|Size|Poss."
  4. column currsize format 999,990 heading "Current|Size"
  5. column savings format 999,990 heading "Poss.|Savings"
  6. break on report
  7. compute sum of savings on report
  8. column value new_val blksize
  9. select value from v$parameter where name = 'db_block_size';
  10. /
  11. select file_name,
  12. ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
  13. ceil( blocks*&&blksize/1024/1024) currsize,
  14. ceil( blocks*&&blksize/1024/1024) -
  15. ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
  16. from dba_data_files a,
  17. ( select file_id, max(block_id+blocks-1) hwm
  18. from dba_extents
  19. where tablespace_name='USERS' group by file_id ) b
  20. where a.file_id = b.file_id(+) and a.tablespace_name='USERS' order by savings desc;
  21. --输出修改语句
  22. column cmd format a75 word_wrapped
  23. select 'alter database datafile '''||file_name||''' resize ' ||
  24. ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) || 'm;' cmd
  25. from dba_data_files a,
  26. ( select file_id, max(block_id+blocks-1) hwm
  27. from dba_extents where tablespace_name='TEST'
  28. group by file_id ) b
  29. where a.file_id = b.file_id(+)
  30. and ceil( blocks*&&blksize/1024/1024) -
  31. ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0 and tablespace_name='TEST';

查找占用数据文件高水位的对象

  1. -- FINDEXT.SQL 显示详细的块号 位置
  2. -- This script lists all the extents contained in that datafile,
  3. -- the block_id where the extent starts,
  4. -- and how many blocks the extent contains.
  5. -- It also shows the owner, segment name, and segment type.
  6. -- Input: FILE_ID from DBA_DATA_FILES or FILE# from V$DATAFILE
  7. SET ECHO OFF
  8. SET PAGESIZ 25
  9. column file_name format a50
  10. select file_name, file_id from dba_data_files order by 2;
  11. ttitle -
  12. center 'Segment Extent Summary' skip 2
  13. col ownr format a8 heading 'Owner' justify c
  14. col type format a8 heading 'Type' justify c trunc
  15. col name format a30 heading 'Segment Name' justify c
  16. col exid format 990 heading 'Extent#' justify c
  17. col fiid format 9990 heading 'File#' justify c
  18. col blid format 99990 heading 'Block#' justify c
  19. col blks format 999,990 heading 'Blocks' justify c
  20. -- lisst top 30 high datafile block_id
  21. select * from (select owner ownr, segment_name name,PARTITION_NAME, segment_type type, extent_id exid, file_id fiid, block_id blid, blocks blks
  22. from dba_extents
  23. where tablespace_name ='TEST'
  24. order by block_id desc) where rownum<=30;
  25. -- SHRINK_DATAFILE.SQL 输入收缩大小,如果无法收缩,列出需要移动的对象
  26. -- This script lists the object names and types that must be moved in order to resize a datafile to a specified smaller size
  27. -- Input: FILE_ID from DBA_DATA_FILES or FILE# from V$DATAFILE
  28. -- Size in bytes that the datafile will be resized to
  29. SET SERVEROUTPUT ON
  30. DECLARE
  31. V_FILE_ID NUMBER;
  32. V_BLOCK_SIZE NUMBER;
  33. V_RESIZE_SIZE NUMBER;
  34. BEGIN
  35. V_FILE_ID := &FILE_ID;
  36. V_RESIZE_SIZE := &RESIZE_FILE_TO;
  37. SELECT BLOCK_SIZE INTO V_BLOCK_SIZE FROM V$DATAFILE WHERE FILE# = V_FILE_ID;
  38. DBMS_OUTPUT.PUT_LINE('.');
  39. DBMS_OUTPUT.PUT_LINE('.');
  40. DBMS_OUTPUT.PUT_LINE('.');
  41. DBMS_OUTPUT.PUT_LINE('OBJECTS IN FILE '||V_FILE_ID||' THAT MUST MOVE IN ORDER TO RESIZE THE FILE TO '||V_RESIZE_SIZE||' BYTES');
  42. DBMS_OUTPUT.PUT_LINE('===================================================================');
  43. DBMS_OUTPUT.PUT_LINE('NON-PARTITIONED OBJECTS');
  44. DBMS_OUTPUT.PUT_LINE('===================================================================');
  45. for my_record in (
  46. SELECT DISTINCT(OWNER||'.'||SEGMENT_NAME||' - OBJECT TYPE = '||SEGMENT_TYPE) ONAME
  47. FROM DBA_EXTENTS
  48. WHERE (block_id + blocks-1)*V_BLOCK_SIZE > V_RESIZE_SIZE
  49. AND FILE_ID = V_FILE_ID
  50. AND SEGMENT_TYPE NOT LIKE '%PARTITION%'
  51. ORDER BY 1) LOOP
  52. DBMS_OUTPUT.PUT_LINE(my_record.ONAME);
  53. END LOOP;
  54. DBMS_OUTPUT.PUT_LINE('===================================================================');
  55. DBMS_OUTPUT.PUT_LINE('PARTITIONED OBJECTS');
  56. DBMS_OUTPUT.PUT_LINE('===================================================================');
  57. for my_record in (
  58. SELECT DISTINCT(OWNER||'.'||SEGMENT_NAME||' - PARTITION = '||PARTITION_NAME||' - OBJECT TYPE = '||SEGMENT_TYPE) ONAME
  59. FROM DBA_EXTENTS
  60. WHERE (block_id + blocks-1)*V_BLOCK_SIZE > V_RESIZE_SIZE
  61. AND FILE_ID = V_FILE_ID
  62. AND SEGMENT_TYPE LIKE '%PARTITION%'
  63. ORDER BY 1) LOOP
  64. DBMS_OUTPUT.PUT_LINE(my_record.ONAME);
  65. END LOOP;
  66. END;
  67. /

移动相关对象命令参考

注意,使用move 时,索引会失效,也会锁表,一定要提前规划和沟通,切勿随意操作。

  1. --LOB字段 move
  2. alter table edc_exchange.edc move tablespace TS_EDC2015 lob(XML_CLOB) store as edclob(tablespace TS_EDC2015);
  3. --分区表move(举例说明)
  4. alter table scott.obj_part move partition p201212 tablespace test;
  5. alter table scott.obj_part move subpartition p20121231 tablespace test;
  6. --重建相关索引
  7. alter index EDC_EXCHANGE.SYS_C00117331 rebuild tablespace TS_EDC2015;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29487349/viewspace-2952005/,如需转载,请注明出处,否则将追究法律责任。                                             

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Alter table move compress是如何工作的?
ORACLE表空间及其维护
如何清除Oracle控制文件中的无用记录,例如v$archived
数据文件SCN的一致性问题
oracle可以存放多大数据量数据,多少条数据
oracle 表空间_Oracle技术教程_Oracle_数据库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服