Logo
统计存储

统计存储 #

数据库都会有自身的系统表,存储一些系统的统计数据。以 MySQL 为例,会存在 information_schema、mysql、performance_schema、sys 系统数据库,并且每个数据库下会存在许多系统表。 以 MySQL 协议的 Proxy 为例,Proxy 也应该存在这些系统库和对应的表,并且提供系统表对应的数据。由于 Proxy 处于物理库的上层,所以 Proxy 需要构建出符合 Proxy 层的逻辑数据。 比如 INFORMATION_SCHEMA.SCHEMATA 查询的是数据库的信息,在物理库执行和在 Proxy 层执行返回的数据是不一致的。在 Proxy 层需要返回逻辑库的数据。所以针对这种表的数据需要在 Proxy 层单独构建, 构建好后还需要对数据进行存储,而统计存储规则就是定义这些数据的存储位置。当前仅实现了 MySQL 数据库的部分系统表构建和存储。

已实现的表

MySQL: INFORMATION_SCHEMA.SCHEMATA、INFORMATION_SCHEMA.TABLES、INFORMATION_SCHEMA.COLUMNS。

Proxy: shardingsphere.table_statistics、shardingsphere.column_statistics (shardingsphere 为 Proxy 独有的系统库,当开启联邦查询时才会统计 table_statistics、column_statistics 表的数据)。

语法类型描述
ALTER STATISTICS_STORAGE RULERAL修改统计存储规则
SHOW STATISTICS_STORAGE RULERAL查看统计存储规则
REFRESH STATISTICS METADATARAL刷新统计数据
TRUNCATE STATISTICS METADATARAL清除统计数据

设置系统数据主动收集 job cron, 和开启系统数据自动收集

SET DIST VARIABLE proxy_meta_data_collector_cron = '0 0/30 * * * ?';
SET DIST VARIABLE proxy_meta_data_collector_enabled = 'true';

1. 修改统计存储规则配置 #

ALTER STATISTICS_STORAGE RULE (
    NAME_PREFIX=sphereex,
    STORAGE UNIT (
        URL = "jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true",
        USER = "root",
        PASSWORD = "123456",
        PROPERTIES("maximumPoolSize" = 2, "idleTimeout" = "30000")
    )
);

参数说明

  • NAME_PREFIX:数据库名称前缀,默认为 sphereex
  • STORAGE UNIT:存储信息
    • URL:jdbc url 地址
    • USER:用户
    • PASSWORD:密码
    • PROPERTIES:用于自定义连接池参数,key 和 value 均为 STRING 类型

数据收集后会自动在存储数据的数据库实例自动创建以 NAME_PREFIX 加下划线 “_” 为前缀的系统数据库,如 sphereex_information_schema、sphereex_shardingsphere。 STATISTICS_STORAGE RULE 中配置的数据库用户需要有下面权限(数据库账号和 NAME_PREFIX 前缀名称按照实际情况修改)。

GRANT CREATE, SELECT, INSERT, UPDATE, DELETE, DROP ON sphereex_information_schema.* TO 'root'@'%';
GRANT CREATE, SELECT, INSERT, UPDATE, DELETE, DROP ON sphereex_shardingsphere.* TO 'root'@'%';

2. 修改统计存储规则配置 #

SHOW STATISTICS_STORAGE RULE;

示例

mysql> SHOW STATISTICS_STORAGE RULE\G
*************************** 1. row ***************************
                    name_prefix: sphereex
                           type: MySQL
                           host: 127.0.0.1
                           port: 3306
                             db:
connection_timeout_milliseconds: 30000
      idle_timeout_milliseconds: 30000
      max_lifetime_milliseconds: 2100000
                  max_pool_size: 2
                  min_pool_size: 1
                      read_only: false
               other_attributes: {"healthCheckProperties":{},"initializationFailTimeout":1,"validationTimeout":5000,"keepaliveTime":0,"leakDetectionThreshold":0,"registerMbeans":false,"allowPoolSuspension":false,"autoCommit":true,"isolateInternalQueries":false,"queryProperties":{"allowPublicKeyRetrieval":"true","serverTimezone":"UTC","useSSL":"false"}}
1 row in set (0.01 sec)

3. 刷新统计数据 #

REFRESH STATISTICS METADATA;

执行后会重新统计系统数据

4. 清除统计数据 #

TRUNCATE STATISTICS METADATA;

执行后会清除存储规则中存储的系统数据