暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式数据库学习Note68:OceanBase社区版中,历史管理功能如何使用?

统计信息历史管理功能主要是指统计信息状态发生改变时(统计信息被重新收集、设置、删除、导入、锁定等),会将统计信息发生改变之前的统计信息状态保存到统计信息历史记录表中,统计信息历史记录表可以查询某张表的一个历史统计信息改变情况,同时也能够恢复指定历史版本的统计信息。

统计信息历史表及视图

OceanBase 数据库优化器使用如下视图来保存统计信息历史记录:

  • DBA_TAB_STATS_HISTORY 用于保存表级的历史统计信息。

  • DBA_TAB_COL_STATISTICS 用于保存列级的基本历史统计信息。

  • DBA_TAB_HISTOGRAMS 用于保存列级的直方图历史统计信息。

统计信息历史管理相关函数

目前支持如下历史管理相关函数:

  • restore_table_stats 恢复指定时刻的表级历史统计信息。

  • restore_schema_stats 恢复指定时刻的 Schema 级历史统计信息。

  • purge_stats 删除指定时刻之前的历史统计信息。

  • alter_stats_history_retention 修改历史统计信息的的保留间隔时间,默认保留间隔时间为 31 天。

  • get_stats_history_retention 获取当前历史统计信息的保留间隔时间。

  • get_stats_history_availability 获取当前可用的最早历史统计信息时间,无法恢复指定时间早于这个时间的历史统计信息。

具体的定义如下:

PROCEDURE restore_table_stats (
  ownname               VARCHAR2,
  tabname               VARCHAR2,
  as_of_timestamp       TIMESTAMP WITH TIME ZONE,
  restore_cluster_index BOOLEAN DEFAULT FALSE,
  force                 BOOLEAN DEFAULT FALSE,
  no_invalidate         BOOLEAN DEFAULT FALSE
);

PROCEDURE restore_schema_stats (
  ownname               VARCHAR2,
  as_of_timestamp       TIMESTAMP WITH TIME ZONE,
  force                 BOOLEAN DEFAULT FALSE,
  no_invalidate         BOOLEAN DEFAULT FALSE
);

PROCEDURE purge_stats(
  before_timestamp      TIMESTAMP WITH TIME ZONE
);

PROCEDURE alter_stats_history_retention(
  retention             NUMBER
);

FUNCTION get_stats_history_retention RETURN NUMBER;

FUNCTION get_stats_history_availability RETURN TIMESTAMP WITH TIME ZONE;

参数解释如下表所示。

参数解释
ownname用户名。
tabname表名称。
as_of_timestamp指定恢复时间。
restore_cluster_index该参数暂未实现,不可用。
force强制恢复,并忽略加锁。默认是 False。
no_invalidate该参数暂未实现,不可用。

统计信息历史清理策略

目前 OceanBase 数据库支持两种方式清理统计信息历史:自动清理和手动清理。

由于 OceanBase 数据库是一个分布式的数据库,因此没法直接在 Server 内部创建租户的同时自动去创建清理任务,因此需要显示地在创建好租户或者低版本的 Server 升级上来的租户中利用 DBMS_JOB 去创建一个定时任务来自动清理统计信息历史,示例如下。

##设置一个从现在开始,每隔一天执行自动清理统计信息历史的任务
DECLARE
   jid BINARY_INTEGER;
BEGIN
   DBMS_JOB.SUBMIT(jid, 'dbms_stats.purge_stats(NULL);', trunc(sysdate), 'trunc(sysdate) + 1');
   COMMIT;
END;

默认的清理任务间隔是 31 天,可以通过 dbms_stats.alter_stats_history_retention() 去设置,有效范围值为 [0,365000]。如果设置为 0,则表示清除所有历史统计信息,后续也不在记录。

手动清理是指显示调用 dbms_stats.purge_stats() 命令去执行清理。

示例

  • 获取当前历史统计信息的保留间隔时间。

    SELECT dbms_stats.get_stats_history_retention() FROM DUAL;
    
  • 获取当前可用的最早历史统计信息时间。

    SELECT dbms_stats.get_stats_history_availability() FROM DUAL;
    
  • 修改历史统计信息的保留间隔时间为 15 天。

    CALL dbms_stats.alter_stats_history_retention(15);
    
  • 指定恢复用户名 test 下的 tbl1 表在某个时刻下的统计信息。

    CALL dbms_stats.restore_schema_stats('test', 'tbl1', to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));
    
  • 手动清理指定时刻的历史统计信息。

    CALL dbms_stats.purge_stats(to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论