events_transactions_history_long表的内存占用

events_transactions_history_long表用于存储历史的事务信息。通过参数performance_schema_events_transactions_history_long_size来控制最多保留多少条事务记录(包含所有session)

通过操作系统直接查看内存占用来判断events_transactions_history_long表的内存占用不太可行,通过table status来查看也不可行,如下:

           Name: events_transactions_history_long
         Engine: PERFORMANCE_SCHEMA
        Version: 10
     Row_format: Dynamic
           Rows: 10000
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 0
   Index_length: 0
      Data_free: 0
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:

最好的办法还是从源码入手,了解events_transactions_history_long的存储方式。

events_transactions_history_long中存储的信息和events_transactions_current一样,只不过events_transactions_current是线程当前事务的状态。
events_transactions_history_long的数据保存是使用一个环形数组来完成的,如下:

/** EVENTS_TRANSACTIONS_HISTORY_LONG circular buffer. */
PFS_ALIGNED PFS_events_transactions *events_transactions_history_long_array= NULL;

这个数组的大小在系统启动时确定好,不可以动态修改,其中初始化的过程如下:

/**
  Initialize table EVENTS_TRANSACTIONS_HISTORY_LONG.
  @param events_transactions_history_long_sizing       table sizing
*/
int init_events_transactions_history_long(uint events_transactions_history_long_sizing)
{
  events_transactions_history_long_size= events_transactions_history_long_sizing;
  events_transactions_history_long_full= false;
  PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0);

  if (events_transactions_history_long_size == 0)
    return 0;

  events_transactions_history_long_array=
    PFS_MALLOC_ARRAY(& builtin_memory_transactions_history_long,
                     events_transactions_history_long_size,
                     sizeof(PFS_events_transactions), PFS_events_transactions,
                     MYF(MY_ZEROFILL));

  return (events_transactions_history_long_array ? 0 : 1);
}

通过此函数可以清晰的看出,为了存储历史数据所需要的内存大小,计算得出,每一条记录(PFS_events_transactions)在344个字节,要存储100万记录的话,内存需要300多M。

结构体PFS_events_transactions中虽然包含了部分指针类型的成员,比如它的父类PFS_events中的 const char *m_source_file;

  /** Instrument metadata. */
  PFS_instr_class *m_class;
  
  /** Location of the instrumentation in the source code (file name). */
  const char *m_source_file;

但其实是指向同一块内存区域的,所以可以忽略。

结论就是:

  • 存储100万记录的话,内存需要328M。
  • 最大设置为1048576,MySQL限制
### MySQL `performance_schema.setup_consumers` 的使用与配置 #### 什么是 `setup_consumers`? `performance_schema.setup_consumers` 是 Performance Schema 中的一个核心,用于控制哪些消费者(Consumers)被启用或禁用。这些消费者负责收集特定类型的性能数据,并将其存储到相应的摘要中。通过调整此的内容,可以决定是否记录某些类别的性能事件。 当某个消费者的值设置为 `YES` 时,示对应的性能数据会被收集;如果设置为 `NO`,则不会收集该类别下的任何数据[^1]。 --- #### 如何查看当前的消费者状态? 可以通过查询 `setup_consumers` 来获取当前所有消费者的启停状态: ```sql SELECT * FROM performance_schema.setup_consumers; ``` 这条 SQL 查询会返回一张格,其中每一行代一个消费者及其对应的状态字段 `ENABLED`。例如: | NAME | ENABLED | |---------------------------------------|---------| | events_stages_current | NO | | events_stages_history | NO | | events_stages_history_long | NO | | events_statements_current | YES | 上述结果显示只有 `events_statements_current` 被启用,其余均未启用。 --- #### 配置 `setup_consumers` 的方法 要修改某消费者的启用状态,可以直接更新其 `ENABLED` 字段。以下是具体操作方式: ##### 启用某一消费者 假设需要启用 `events_waits_current` 消费者,则执行如下命令: ```sql UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_waits_current'; ``` ##### 禁用某一消费者 同样地,若想禁用 `events_statements_history` 消费者,可运行以下语句: ```sql UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME = 'events_statements_history'; ``` 需要注意的是,在实际生产环境中应谨慎更改这些配置项,因为不当的操作可能会增加服务器负载或者遗漏重要监控信息[^2]。 --- #### 常见注意事项 - **性能影响**:开启过多的消费者可能导致额外开销,尤其是在高并发场景下。因此建议仅针对所需的数据类型激活相应消费者。 - **持久化配置**:默认情况下重启服务后自定义设置可能丢失。为了保存改动至下次启动前有效,需利用官方推荐的方法进行永久设定。比如创建初始化脚本来重新加载所需的参数组合[^3]。 - **权限需求**:用户必须拥有足够的权限才能访问和编辑 `performance_schema` 下的相关对象。通常管理员账户具备此类权利。 --- #### 示例代码片段展示如何批量处理多个条目 下面给出一段简单的批处理逻辑作为参考实例: ```sql -- 批量关闭指定列里的项目 BEGIN TRANSACTION; UPDATE performance_schema.setup_consumers SET ENABLED='NO' WHERE NAME IN ('events_transactions_current', 'events_transactions_history'); COMMIT; ``` 以上事务块确保要么全部成功应用变更要么完全回滚不留下中间态残留问题[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值