运维联盟俱乐部

 找回密码
 立即注册
查看: 1648|回复: 1

[技术专题] segment advisor

[复制链接]
  • TA的每日心情
    开心
    2023-8-9 11:05
  • 发表于 2021-9-28 11:23:23 | 显示全部楼层 |阅读模式
    1.段指导需要的权限
    对数据库进行空间分析,主要是看表和索引的碎片回收率,建议使用oracle的段指导,如果不是sysdba,则需要授权,或者直接使用sys用户
    1. grant advisor to zhyu;
    复制代码
    2.自动段指导是否开启
    自动维护任务使用默认的窗口和调度,如果开启,可以直接查询分析过的任务
    1. select client_name,window_group ,status from dba_autotask_client;

    2. CLIENT_NAME                               WINDOW_GROUP            STATUS
    3. ----------------------                   ------------------ ------------------------------ --------
    4. auto optimizer stats collection      ORA$AT_WGRP_OS         ENABLED
    5. auto space advisor                         ORA$AT_WGRP_SA         ENABLED
    6. sql tuning advisor                          ORA$AT_WGRP_SQ         ENABLED
    复制代码
    指导任务可以针对以下类型进行操作
    1. select * from dba_advisor_definitions;

    2. ADVISOR_ID ADVISOR_NAME                     PROPERTY
    3. ---------- ------------------------------ ----------
    4.          1 ADDM                                    1
    5.          2 SQL Access Advisor                         303
    6.          3 Undo Advisor                            1
    7.          4 SQL Tuning Advisor                         935
    8.          5 Segment Advisor                          67
    9.          6 SQL Workload Manager                    0
    10.          7 Tune MView                                  31
    11.          8 SQL Performance Analyzer                 935
    12.          9 SQL Repair Advisor                         679
    13.         10 Compression Advisor                           3
    14.         11 SPM Evolve Advisor                         935
    15.         12 Statistics Advisor                         935
    复制代码
    3.手动运行段指导
    对单表或者多表做段分析
    如果是多个表,则相应添加dbms_advisor.create_object行修改对应得表名就可以了。
    1. DECLARE

    2. taskname varchar2(100);
    3. taskdesc varchar2(128);
    4. task_id number;
    5. object_id number;
    6. timeLimit varchar2(25);
    7. numDaysToRetain varchar2(25);
    8. objectName varchar2(100);
    9. objectType varchar2(100);

    10. BEGIN
    11. taskname := 'SEGMENTADV_01';
    12. taskdesc :='SEGMENTADV';
    13. numDaysToRetain :='30';
    14. dbms_advisor.create_task('Segment Advisor',taskname,taskdesc,NULL);
    15. dbms_advisor.create_object( task_name => taskname, object_type => 'TABLE', attr1 => 'ZHYU', attr2 => 'OBJS', attr3 => ' ', attr4 => NULL, attr5 => NULL,object_id => object_id);
    16. dbms_advisor.set_task_parameter(taskname, 'RECOMMEND_ALL', 'TRUE');
    17. dbms_advisor.set_task_parameter(taskname, 'DAYS_TO_EXPIRE', numDaysToRetain);
    18. END;

    19. DECLARE
    20. taskname varchar2(100);
    21. BEGIN
    22. taskname := 'SEGMENTADV_01';
    23. dbms_advisor.reset_task(taskname);
    24. dbms_advisor.execute_task(taskname);
    25. END;
    复制代码
    对表空间进行段分析
    如果是多个表空间,则相应添加dbms_advisor.create_object行修改对应得表空间名就可以了。
    1. DECLARE
    2.     taskname varchar2(100);
    3.     taskdesc varchar2(128);
    4.     task_id number;
    5.     object_id number;
    6.     timeLimit varchar2(25);
    7.     numDaysToRetain varchar2(25);
    8.     objectName varchar2(100);
    9.     objectType varchar2(100);

    10. BEGIN
    11.     taskname := 'SEGMENTADV02';
    12.     taskdesc := 'SEGMENTADV';
    13.     numDaysToRetain :='30';
    14.     dbms_advisor.create_task('Segment Advisor',taskname,taskdesc,NULL);
    15.     dbms_advisor.create_object( task_name => taskname, object_type => 'TABLESPACE', attr1 => 'TBS_PIS_DATA01', attr2 => 'NULL', attr3 => NULL, attr4 => NULL, attr5 => NULL, object_id => object_id);
    16.     dbms_advisor.set_task_parameter(taskname, 'RECOMMEND_ALL', 'TRUE');
    17.     dbms_advisor.execute_task(taskname);
    18. END;

    复制代码
    4.查询运行状态
    1. set lines 200
    2. col DESCRIPTION for a50
    3. SELECT TASK_NAME,
    4.         DESCRIPTION,
    5.         STATUS,
    6.         EXECUTION_START,
    7.         EXECUTION_START
    8. FROM DBA_ADVISOR_TASKS
    9. WHERE ADVISOR_NAME = 'Segment Advisor'
    10. ORDER BY 4 DESC;
    复制代码
    5.查询任务结果
    dba_advisor_xxx 视图保存了结果;dba_advisor_tasks可以查看task的状态,确定其是否完成;dba_advisor_findings
    一个更好的办法是使用
    DBMS_SPACE.ASA_RECOMMENDATIONS
    1. SELECT
    2.         'Segment Advice --------------------------'
    3.                 || CHR(10)
    4.                 || 'TABLESPACE_NAME  : '
    5.                 || tablespace_name
    6.                 || CHR(10)
    7.                 || 'SEGMENT_OWNER    : '
    8.                 || segment_owner
    9.                 || CHR(10)
    10.                 || 'SEGMENT_NAME     : '
    11.                 || segment_name
    12.                 || CHR(10)
    13.                 || 'ALLOCATED_SPACE  : '
    14.                 || allocated_space
    15.                 || CHR(10)
    16.                 || 'RECLAIMABLE_SPACE: '
    17.                 || reclaimable_space
    18.                 || CHR(10)
    19.                 || 'RECOMMENDATIONS  : '
    20.                 || recommendations
    21.                 || CHR(10)
    22.                 || 'SOLUTION 1       : '
    23.                 || c1
    24.                 || CHR(10)
    25.                 || 'SOLUTION 2       : '
    26.                 || c2
    27.                 || CHR(10)
    28.                 || 'SOLUTION 3       : '
    29.                 || c3 Advice
    30. FROM
    31.         TABLE(dbms_space.asa_recommendations('TRUE', 'TRUE', 'FALSE'));
    复制代码
    1. SET TERMOUT     OFF
    2. SET ECHO        OFF
    3. SET FEEDBACK    OFF
    4. SET HEADING     ON
    5. SET LINESIZE    200
    6. SET PAGESIZE    3000
    7. SET TIMING      OFF
    8. SET TRIMSPOOL   ON
    9. SET VERIFY      OFF
    10. CLEAR COLUMNS BREAKS COMPUTES
    11. CLEAR COLUMNS BREAKS COMPUTES

    12. col tablespace_name format a30 heading 'ts_name'
    13. col segment_owner format a30 heading 'seg_owner'
    14. col segment_name format a30 heading 'seg_name'
    15. col allocated_space for 999,999,999,999 heading 'allo_mb'
    16. col reclaimable_space for 999,999,999,999 heading 'used_mb'
    17. col reclaimable_space for 999,999,999,999 heading 'recl_mb'

    18. BREAK ON report
    19. COMPUTE sum OF allo_mb  ON report
    20. COMPUTE sum OF recl_mb  ON report

    21. SELECT
    22. tablespace_name
    23. ,segment_owner
    24. ,segment_name
    25. ,setment_type
    26. ,round(allocated_space/1024/1024,0) allo_mb
    27. ,roud(used_space/1024/1024,0) used_mb
    28. ,round(reclaimable_space/1024/1024,0) recl_mb
    29. FROM
    30. TABLE(dbms_space.asa_recommendations('TRUE', 'TRUE', 'FALSE'));
    复制代码
    1. set markup html on spool on
    2. SPOOL ADVISOR.HTML
    3. set pagesize 200
    4. set echo on

    5. select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message
    6. from dba_advisor_findings af, dba_advisor_objects ao
    7. where ao.task_id = af.task_id
    8. and ao.object_id = af.object_id;
    9.   
    10. select tablespace_name, segment_name, segment_type, partition_name,
    11. recommendations, c1 from
    12. table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));

    13. spool off
    14. set markup html off spool off
    复制代码

    7.执行段指导时,会不停重复这两个sql_id
    1. SQL> select sid,serial#,sql_id,program,event,blocking_session from v$session where sid=2653;
    2.       2653        43327 7wgks43wrjtrz sqlplus@p0-cnpic-db1 (TNS V1-V3)                     db file sequential read

    3. Elapsed: 00:00:00.00
    4. SQL> /
    5.       2653        43327 8szmwam7fysa3 sqlplus@p0-cnpic-db1 (TNS V1-V3)                     gc cr request

    6. SQL> select sql_fulltext from v$sql where sql_id='&sql_id';
    7. Enter value for sql_id: 8szmwam7fysa3
    8. old   1: select sql_fulltext from v$sql where sql_id='&sql_id'
    9. new   1: select sql_fulltext from v$sql where sql_id='8szmwam7fysa3'
    10. insert into wri$_adv_objspace_trend_data select timepoint,  space_usage, space_a
    11. lloc, quality from  table(dbms_space.object_growth_trend(:1, :2, :3, :4, NULL, N
    12. ULL,  NULL, 'FALSE', :5, 'FALSE'))

    13. SQL> select sql_fulltext from v$sql where sql_id='&sql_id';
    14. Enter value for sql_id: 7wgks43wrjtrz
    15. old   1: select sql_fulltext from v$sql where sql_id='&sql_id'
    16. new   1: select sql_fulltext from v$sql where sql_id='7wgks43wrjtrz'
    17. SELECT U.SPACE_USED, U.SPACE_ALLOCATED FROM TABLE(DBMS_SPACE.OBJECT_SPACE_USAGE_
    18. TBF( :B1 , :B2 , :B3 , 0, :B4 , 'TRUE', :B5 )) U
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-8-9 11:05
  •  楼主| 发表于 2024-4-20 15:22:53 | 显示全部楼层
    1. #!/bin/bash

    2. # 查询所有非系统表空间
    3. TABLESPACES=$(sqlplus -s / as sysdba<<EOF
    4. set heading off
    5. set feedback off
    6. set pages 2000
    7. select tablespace_name from dba_tablespaces where contents='PERMANENT' and tablespace_name not in ('SYSTEM', 'SYSAUX');
    8. exit
    9. EOF
    10. )

    11. # 循环处理每个表空间
    12. for TABLESPACE in $TABLESPACES; do
    13.     # 创建任务名称和描述
    14.     TASK_NAME="SEGMENTADV_${TABLESPACE}"
    15.     TASK_DESC="SEGMENTADV for tablespace ${TABLESPACE}"

    16.     # 创建任务
    17.     echo "$(date +'%Y%m%d %H:%M:%S')"
    18.     echo "Creating task: $TASK_NAME"
    19.     sqlplus -s / as sysdba<<EOF
    20.     set heading off
    21.     set feedback off
    22.     DECLARE
    23.         task_id number;
    24.     BEGIN
    25.         dbms_advisor.create_task('Segment Advisor', '$TASK_NAME', '$TASK_DESC', NULL);
    26.         dbms_advisor.create_object( task_name => '$TASK_NAME', object_type => 'TABLESPACE', attr1 => '$TABLESPACE', attr2 => NULL, attr3 => NULL, attr4 => NULL, attr5 => NULL, object_id => NULL);
    27.         dbms_advisor.set_task_parameter('$TASK_NAME', 'RECOMMEND_ALL', 'TRUE');
    28.         dbms_advisor.execute_task('$TASK_NAME');
    29.     END;
    30.     /
    31.     exit
    32. EOF
    33.     echo "Completed task: $TASK_NAME"  
    34. done

    复制代码
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    运维联盟俱乐部 ( 冀ICP备19036648号 )

    GMT+8, 2024-5-4 08:53 , Processed in 0.048945 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表