SAP:Get Inactive BOM Data

data: begin of itab occurs 0,
            matnr_pre like mast-matnr,
            matnr    like mara-matnr,
            idnrk    like mara-matnr,
            maktx    like makt-maktx,
            meins    like mara-meins,
            menge    like stpo-menge,
            alprf   like stpo-alprf,
            ewahr   like stpo-ewahr,
            item_text1 type length 40,
            item_text2 type length 40,
            text(255type c,
            ltxsp  like stpo-ltxsp ,
            stlnr  like stpo-stlnr ,
            stlkn  like stpo-stlkn ,
            stpoz  like stpo-stpoz ,
       end of itab.
  data: itab_tmp like table of itab with header line.

  data: begin of it_matnr occurs 0,
        matnr    like mara-matnr,
        matnr_pre like mast-matnr,
        end of it_matnr.
  data: it_matnr_tmp  like table of it_matnr with header line.
  data: it_matnr1  like table of it_matnr with header line.
  data:lv_datuv like csap_mbom-datuv.

selection-screen begin of block b1 with frame title text-001.
parameters:     p_werks like mast-werks obligatory.
select-options: p_matnr for mast-matnr.
parameters:     p_stlan like mast-stlan default '1',
                p_bmeng like stko-bmeng default '1' ,
                p_datuv like stko-datuv default sy-datum.

selection-screen end of block b1.

 form get_data .
      data:lv_tabix like sy-tabix.

      select distinct m~matnr m~matnr as matnr_pre
          into  table it_matnr1
        from  stko as k
             inner join mast as on m~stlnr k~stlnr and m~stlal k~stlal
        where m~matnr in p_matnr
          and m~werks p_werks
          and m~stlan p_stlan
          and k~stlst '01'
          and k~loekz space.
      perform change_date_format using p_datuv  'X' changing  lv_datuv.
      sort it_matnr1  by matnr.
      loop at it_matnr1.
        move-corresponding it_matnr1 to it_matnr.
        append it_matnr.
        perform get_mutl_bom.
        clear:it_matnr,it_matnr[].
      endloop.
      loop at itab.
        lv_tabix sy-tabix.
        clear :itab-text.
        concatenate itab-item_text1 itab-item_text2  into itab-text separated by space.
        perform get_material_desc using  itab-idnrk changing  itab-maktx.
        modify itab index lv_tabix transporting text  maktx.
      endloop.
    endform.                    " GET_DATA

form get_mutl_bom .
      data: it_stpo like table of stpo_api02 with header line.
      refresh it_matnr_tmp.
      if it_matnr[] is not initial.
        it_matnr_tmp[] it_matnr[].
        refresh:it_matnr.
        loop at it_matnr_tmp.
          call function 'CSAP_MAT_BOM_READ'
            exporting
              material   it_matnr_tmp-matnr
              plant      p_werks
              bom_usage  p_stlan
              valid_from lv_datuv
              valid_to   lv_datuv
            tables
              t_stpo     it_stpo
            exceptions
              error      1
              others     2.
          if sy-subrc eq 0.
            loop at it_stpo.
              check it_stpo-item_categ 'L'.
              move-corresponding  it_stpo  to  itab.
              itab-matnr_pre it_matnr_tmp-matnr_pre.
              itab-matnr it_matnr_tmp-matnr.
              itab-idnrk it_stpo-component.
              perform tranfer_material  using itab-idnrk ''  changing itab-idnrk.
              itab-meins it_stpo-comp_unit.
              itab-menge it_stpo-comp_qty.
              itab-alprf it_stpo-ai_prio.
              itab-ewahr it_stpo-usage_prob.
              itab-item_text1 it_stpo-item_text1.
              itab-item_text2 it_stpo-item_text2.
              itab-stlnr it_stpo-bom_no.
              itab-stlkn it_stpo-item_node.
              itab-stpoz it_stpo-item_count.
              it_matnr-matnr itab-idnrk .
              it_matnr-matnr_pre itab-matnr_pre.
              collect it_matnr.
              append itab.
              clear:itab.
            endloop.
          endif.
        endloop.
      endif.
      if it_matnr[] is not initial.
        perform get_mutl_bom.
      endif.
    endform.                    " GET_MUTL_BOM

 form change_date_format  using p_old_date
                                  p_external
                            changing p_new_date.
      constants:c_chk_date like pa0001-ename value '0123456789/'.

      if p_external 'X'.
        call function 'CONVERT_DATE_TO_EXTERNAL'
          exporting
            date_internal            p_old_date
          importing
            date_external            p_new_date
          exceptions
            date_internal_is_invalid 1
            others                   2.
        if sy-subrc <> 0.
          clear:p_new_date.
        endif.
      else.
        check p_old_date is not initial.
        if p_old_date cn c_chk_date.
          p_new_date '00000000'.
        else.
          call function 'CONVERT_DATE_TO_INTERNAL'
            exporting
              date_external            p_old_date
            importing
              date_internal            p_new_date
            exceptions
              date_external_is_invalid 1
              others                   2.
          if sy-subrc ne 0.
            p_new_date '00000000'.
          endif.
        endif.
      endif.

    endform.                    " CHANGE_DATE_FORMAT
*&---------------------------------------------------------------------*
*&      Form  tranfer_material
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_OLD      text
*      -->P_OUTPUT   text
*      -->P_NEW      text
*----------------------------------------------------------------------*
    form  tranfer_material using    p_old
                                    p_output
                           changing p_new  .
      if p_output 'X'.
        call function 'CONVERSION_EXIT_MATN1_OUTPUT'
          exporting
            input  p_old
          importing
            output p_new.
      else.
        data:lv_input type length 50.
        lv_input p_old.
        translate   lv_input to upper case.
        call function 'CONVERSION_EXIT_MATN1_INPUT'
          exporting
            input        lv_input
          importing
            output       p_new
          exceptions
            length_error 1
            others       2.
        if sy-subrc <> 0.
        endif.
      endif.
    endform.                    "tranfer_material
*&---------------------------------------------------------------------*
*&      Form  get_material_desc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_MATNR    text
*      -->P_MAKTX    text
*----------------------------------------------------------------------*
    form get_material_desc using p_matnr
                            changing p_maktx.
      select single maktx
        into p_maktx
        from makt
        where matnr eq p_matnr and
              spras eq sy-langu.
    endform.                    "get_material_desc

form display_data .
      data:  l_fieldcat like line of t_fieldcat.
      refresh: t_fieldcat.
      define alv_field.
        clear:l_fieldcat.
        l_fieldcat-fieldname &1.
        l_fieldcat-seltext_m &2.
        l_fieldcat-seltext_l &3.
        l_fieldcat-outputlen &4.
        l_fieldcat-just &5.
        l_fieldcat-do_sum &6.
        l_fieldcat-ref_tabname &7 .
        l_fieldcat-ref_fieldname &8 .
        append l_fieldcat to  t_fieldcat.
      end-of-definition.

      alv_field 'MATNR_PRE' '' 'High Material' '' '' '' 'MARA' 'MATNR'.
      alv_field 'MATNR' '' 'Material' '' '' '' 'MARA' 'MATNR'.
      alv_field 'IDNRK' '' 'Component' '' '' '' 'MARA' 'MATNR'.
      alv_field 'MAKTX' '' 'Comp.Desc' '' '' '' '' ''.
      alv_field 'MEINS' 'UOM' '' '' '' '' '' ''.
      alv_field 'MENGE' 'Qty' '' '' '' '' '' ''.
      alv_field 'ALPRF' '' 'Priority' '' '' '' '' ''.
      alv_field 'EWAHR' 'Prob' '' '' '' '' '' ''.
      alv_field 'TEXT' 'Text' '' '' '' '' '' ''.

      t_layout-zebra 'X'.
      t_layout-f2code '&ETA'.
      t_layout-colwidth_optimize 'X'.
     " sort itab by matnr_pre matnr idnrk.
      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          i_callback_program          sy-cprog
          is_layout                   t_layout
*         I_CALLBACK_HTML_TOP_OF_PAGE = 'ALV_TOP_OF_PAGE'
*         I_callback_pf_status_set    = 'STANDARD1'
          i_default                   'X'
          i_save                      'X'
*         I_CALLBACK_USER_COMMAND     = 'PROCESS_USER_COMMAND'
          it_fieldcat                 t_fieldcat[]
          it_events                   t_events
        tables
          t_outtab                    itab
        exceptions
          program_error               1
          others                      2.
    endform.                    " DISPLAY_DATA
<think>好的,我现在需要帮用户解决关于存储系统中数据可用性减少和数据冗余降级的问题,特别是涉及96个非活动页面和96个大小不足的页面。首先,我需要理解用户提到的这些状态具体意味着什么,以及可能的原因和解决方法。 首先,用户提到了“Reduced data availability”和“degraded data redundancy”,这通常与存储系统中的副本或纠删码配置有关。根据用户提供的引用内容,特别是引用[3]中的例子,当OSD停止时,PG状态会变成undersized+degraded+peered,这说明有副本不足的情况。同样,非活动状态(inactive)可能意味着PG无法处理IO请求,可能因为OSD宕机或其他问题。 接下来,用户的问题中提到有96个inactive和undersized的页面(pages),这里的“pages”可能是指PGs(Placement Groups)。在Ceph中,PG的状态反映了数据分布和健康情况。所以需要确认用户的问题是否是关于Ceph存储集群中的PG状态,例如active+clean变为inactive或undersized。 根据引用[1],当OSD短暂挂掉时,集群可能还能正常写入,但恢复时会有数据同步过程。如果OSD长时间不可用,可能导致PG无法达到所需的副本数,从而出现undersized状态。同样,引用[3]提到停止OSD后,PG状态变为undersized+degraded+peered,说明副本不足,数据冗余降低。 接下来,我需要分析可能导致96个PG处于非活动和大小不足状态的原因。可能的原因包括多个OSD下线、网络分区、硬件故障,或者配置问题如pg_num设置不当。例如,如果有多个OSD同时宕机,可能导致多个PG无法满足副本要求,进而变成undersized和inactive。 解决方案方面,首先需要检查集群状态,使用如ceph -s、ceph osd tree、ceph pg dump等命令,确定哪些OSD有问题。然后尝试恢复故障的OSD,例如重启OSD服务,或者替换故障硬件。如果OSD无法恢复,可能需要将其标记为out并重新平衡数据,如引用[4]中的操作步骤。 此外,调整PG的数量和分布也可能有帮助,确保集群有足够的资源分布PG。监控和自动修复机制也很重要,确保集群能够自动恢复故障。 在回答时,需要按照用户的要求,结构清晰,分步骤说明原因和解决方案,同时引用提供的参考文献来支持观点。例如,引用[2]提到使用ceph pg stat查看状态,引用[3]说明停止OSD后的状态变化,引用[4]展示如何移除OSD。 最后,生成相关问题,可能需要包括如何监控PG状态、调整PG数量、处理OSD故障的详细步骤,以及预防措施等。</think>### 数据可用性减少与冗余降级问题分析 在分布式存储系统(如Ceph)中,出现 **96个非活动(inactive)页面** 和 **96个大小不足(undersized)页面** 通常与存储池的**Placement Group(PG)状态异常**相关。以下是具体原因与解决方案: --- #### 一、核心概念解析 1. **PG状态定义** - **Inactive**:表示PG当前无法处理客户端IO请求,可能因OSD宕机、网络中断或仲裁不足导致[^3]。 - **Undersized**:PG的实际副本数低于存储池配置的副本数(如配置`size=3`但当前只有2个副本)。 2. **影响** - **数据可用性减少**:客户端可能无法读写部分数据。 - **冗余降级**:数据副本未达到预期,存在丢失风险。 --- #### 二、根本原因 1. **OSD故障** - 多个OSD同时宕机或下线(如硬件故障、服务崩溃),导致PG无法维护足够副本[^1]。 - 示例:若一个PG的3个副本分布在3个OSD上,其中1个OSD故障,则PG变为`undersized+degraded`。 2. **网络分区** - 部分OSD因网络中断无法与集群通信,导致PG无法完成数据同步。 3. **PG分布不均** - PG数量(`pg_num`)配置不合理,导致部分OSD负载过重,故障时影响更多PG。 --- #### 三、解决步骤 1. **检查集群状态** 使用以下命令定位问题OSD和PG: ```bash ceph -s # 查看整体健康状态 ceph osd tree # 检查OSD在线状态 ceph pg dump | grep -E "inactive|undersized" # 筛选异常PG ``` 2. **恢复故障OSD** - **重启OSD服务**:尝试恢复暂时性故障。 ```bash systemctl restart ceph-osd@<ID> # 替换<ID>为具体OSD编号 ``` - **硬件修复**:若OSD因磁盘损坏下线,需更换磁盘后重新加入集群[^4]。 3. **手动干预PG状态** - **标记故障OSD为`out`**:强制集群迁移数据至其他OSD。 ```bash ceph osd out <OSD_ID> # 标记OSD为下线状态 ceph osd purge <OSD_ID> --yes-i-really-mean-it # 彻底移除OSD ``` - **触发数据恢复**:集群会自动重建缺失副本,PG状态将从`undersized`逐步恢复至`active+clean`[^1][^2]。 4. **调整PG分布** - **优化`pg_num`**:根据集群规模调整PG数量,避免单个OSD承载过多PG。 - **平衡数据分布**:使用`ceph osd reweight`调整OSD权重,分散负载。 --- #### 四、预防措施 1. **冗余配置** - 设置存储池副本数`size≥3`,并启用`min_size=2`,确保即使部分OSD故障仍可读写[^1]。 2. **监控与告警** - 实时监控PG状态(如`ceph pg stat`),设置`inactive`或`undersized`状态的告警阈值。 3. **定期维护** - 定期检查硬件健康状态,预更换老化设备。 --- ### 相关问题 1. 如何监控Ceph集群中PG的实时状态? 2. PG数量(pg_num)设置不合理会导致哪些问题? 3. Ceph中如何处理因网络分区导致的数据不一致? 4. 如何验证数据恢复后的一致性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值