* **PS 协议支持存储过程出参**
MySQL 模式下,使用 PS 协议执行 `CALL PROCEDURE` 语句时,新增支持存储过程带出参的场景。
性能提升
* **增量旁路导入(Experimental)**
OceanBase V4.1.0 开始支持旁路导入特性,通过精简数据加载的执行路径,跳过 SQL、事务、memtable 等模块,直接将数据持久化为 SSTable 来显著提升数据导入效率。但在表数据需要多次导入的场景,每次导入都需要将表中已有数据重写一遍,影响了增量导入的性能。V4.3.1 针对性地优化了增量导入场景,增量旁路导入无需重写原有数据,只需处理新增数据,让多次导入像第一次导入一样具有高性能。支持在 `LOAD DATA` 和 `INSERT INTO SELECT` 语句中通过 `/*+ direct(need_sort, max_errors_allowed, load_mode) */` Hint 指定是否使用增量旁路导入功能。不指定 `load_mode` 或 `load_mode` 为 `full` 时,表示使用原有的全量旁路导入方式;指定 `load_mode` 为 `inc_replace` 时使用增量旁路导入方式。该功能在 V4.3.1 定义为实验特性,后续版本会继续扩展功能并演进为生产可用特性。
* **SELECT INTO OUTFILE 性能优化**
现有的 `SELECT INTO OUTFILE` 功能虽然支持并行读取数据表,但只能串行写入外部文件,存在数据导出的性能瓶颈。V4.3.1 增加并行导出能力,在 `SELECT INTO OUTFILE` 命令基础上增加了 `SINGLE`、`MAX_FILE_SIZE` 选项,用于控制数据写入外部文件的方式。`SINGLE` 选项可控制将数据导出到单个文件或多个文件,指定并行度大于 1 且 `SINGLE = FALSE` 时,可以将数据导出到多个文件,达到并行读并行写的效果;`MAX_FILE_SIZE` 选项可控制导出文件的大小。
* **多局部索引场景下 DML 性能优化**
当数据库表上存在索引时,DML 会因为需要同步更新索引而产生性能下降。在索引数量特别多时,性能下降尤其明显。新版本针对表上存在多个局部索引的场景,通过局部索引去表锁、非唯一索引不记录持锁者、非唯一索引不检查事务冲突、降低 DML 统计信息上报开销等等一系列系统优化,将局部索引维护开销降低了 45%,从而提升 DML 整体执行性能。
* **单日志流并行同步**
OceanBase V4.3.1 版本之前的日志同步模型为不同日志流并行同步和处理,单日志流基于 Pipeline 方式同步。目前在同城消费本地盘日志的场景下是可以满足性能要求的,但在备库异地部署、公有云读对象存储的场景下,性能相对会差一些。V4.3.1 版本实现了基于文件数据块的单日志流并行同步模型,显著提升同步性能并优化内存使用。
* **统计信息收集性能优化**
当前基础统计信息的收集依赖通过执行相关聚合函数的内部 SQL 完成,V4.3.0 开始支持了聚合函数下压到存储层,V4.3.1 进一步扩展了收集基础统计信息可以下压到存储层的聚合函数,避免投影数据到 SQL 层再做计算,基础统计信息的收集操作全部放到了存储层,提升了基础统计信息的收集效率。新版本收集性能整体上比 V4.3.0 提升 5% 左右。
* **行采样性能优化**
在处理全量数据开销太大时,往往可以通过小部分数据观察整体的数据分布,例如优化器通过采样来分析数据分布,辅助执行计划的生成。OceanBase sample 行采样当前会先应用 `WHERE` 过滤条件,然后过滤出的一行数据,判断是否进行采样。这相当于逐行扫描进行判断,把数据整体都探测一遍,十分耗时。V4.3.1 优化了行采样流程,先过滤数据再应用条件,省去部分数据的读取成本,同时针对列存也优化为只读取需要的列数据,显著提升采样性能。
* **小规格性能优化**
针对 4C/8C 小规格环境,V4.3.1 版本在后台线程使用、Location Cache 访问、读写主路径、系统调用等方面进行了一系列优化,OLTP 相关测试场景,性能相对 V4.3.0 提升 20%-30%。
可靠性提升
* **数据盘满停写**
数据盘使用量过高时,当前不会停写用户请求,一直到内存因为无法转储写满,或者 `clog` 盘写满后才会报错。这种情况下,需要通过紧急扩 `clog` 盘或租户内存恢复。新版本在内核层面增加数据盘满停写功能,当用户数据盘水位线达到 `data_disk_write_limit_percentage` 配置后,用户写入请求会报错。通过删表、`transfer` 或者扩磁盘方式降低数据盘使用比例后,用户写入操作可以自动恢复。
资源使用优化
* **CLOG 日志缓存**
V4.x 在归档、回放等场景已经支持了 LogHotCache,用来缓存部分实时日志,一定程度上避免了日志读盘开销。但当日志写入速度比较快或多个 OBCDC 重复拉取相近日志时,还是无法避免大量的日志读盘,极端情况下会将日志盘带宽打满。同时,云上磁盘带宽往往有限的,我们需要通过降低日志读盘的开销来支撑更多的日志消费场景。因此,该版本新增 CLOG 日志缓存功能,支持消费者直接从日志缓存读取日志进行消费,没有命中日志缓存时,依然支持从磁盘读取日志,并将日志同步写入缓存中,避免重复读取磁盘,降低日志盘带宽使用。为了方便用户监控日志缓存命中情况,SYSSTAT 新增 50065、50066 和 120010 三个统计项,用于展示租户级别的日志缓存命中次数、未命中次数和 CLOG 缓存大小。
* **旁路导入资源控制强化**
OceanBase V4.x 版本支持的旁路导入功能显著提高了数据导入速率,但在用户设定较高并行度且并发执行的旁路导入任务较多时,资源缺少严格控制,容易造成较多线程和内存占用,影响其他任务的正常执行。V4.3.1 新增三个维度的旁路导入资源管理能力:
* 新增任务级资源申请管理模块,根据导入任务的执行模式和分区数量,申请对应的线程和内存资源。
* 新增租户级资源管理模块,管理租户用于旁路导入的线程和内存资源,以定时任务感知资源池变化,回收异常中断的导入任务申请的资源。
* 新增 OBServer 级资源管理模块,记录节点级资源申请,并根据任务数动态伸缩旁路导入任务排序阶段的可用内存。
* **系统日志压缩**
业务流量过大时,系统日志刷新的会比较快,保留时间较短可能影响问题排查。新版本增加系统日志压缩功能,支持对 `observer.log`、`rootservice.log`、`election.log` 和 `trace.log` 等日志文件,每类超过 `syslog_file_uncompressed_count` 个数时,采用 `syslog_compress_func` 设置的压缩方法,对最早日志进行压缩。当日志使用总空间接近 `syslog_disk_size` 设置的磁盘空间上限时,开始删除最早生成的日志文件,回收空间。磁盘空间不变的情况下,开启 zstd 压缩后,预计可以存储不开启压缩时 20 倍的日志量。
* **R 副本按 Region 级联**
OceanBase V4.2.0 开始支持 R 副本功能,服务于弱读、复制表等场景。一个 R 副本通过注册为 F 副本或其他 R 副本的下游来同步日志,当多个 R 副本和其上游被部署在不同的 Region 时,可能占用额外的跨 Region 网络带宽。V4.3.1 增加 R 副本对 Region 的感知能力,在日志同步时会尽量选择相同 Region 的其他副本作为上游,尽量避免跨 Region 的网络传输,节省跨 Region 带宽。
* **SQL 临时结果压缩**
SQL 执行涉及的数据量过大的情况下,可能出现内存不足的问题,这时部分算子需要物化临时的中间结果。当物化的数据量过大,磁盘空间写满时,会导致 SQL 执行失败。V4.3.1 新增 SQL 临时结果压缩功能,允许通过租户级配置项 `spill_compression_codec` 或 SQL 级 Hint(如 `/*+opt_param('spill_compression_codec', 'lz4') */`)指定临时结果是否压缩及压缩算法,当指定临时结果压缩时可有效降低临时磁盘空间占用,以支撑更大运算量的查询任务。
安全强化
* **MySQL PL 权限管理**
MySQL 模式下新增 PL 权限管理能力,支持 `CREATE ROUTINE`、`EXECUTE` 和 `ALTER ROUTINE` 等权限控制。增加 `mysql.procs_priv` 内部表,用于展示存储过程或函数授权信息。升级集群默认不开启,新建集群会自动开启。
* **MySQL 角色**
OceanBase V4.3.1 兼容了 MySQL 8.0 的角色管理功能,通过角色来管理维护一组权限,可以更方便地对某一类用户进行授权和回收。与普通用户类似,角色可以被授予或回收权限,也可以被授予或回收其他角色。用户可以被授予多个角色,但仅能使用激活状态角色中的权限。
* **MySQL 列级权限**
V4.3.1 版本新增 MySQL 列级权限功能,可以用于控制用户是否有权限对某张表的某几列进行 `SELECT`、`INSERT` 或 `UPDATE`。
* **OBServer 启动检查 OS 配置**
不合理的 OS 配置可能引发系统问题,V4.3.1 版本新增核心 OS 参数检查。提供宽松和严格检查两种模式。宽松模式下,OS 参数不符合要求时,日志报 warning ,不影响 OBServer 启动;严格模式下,OS 参数不符合要求时,报 error 且 OBServer 无法启动。
易用性提升
* **资源规格估算:**
我们将数据库中的资源分为逻辑资源和物理资源两大类。逻辑资源指的是逻辑概念对应的实体,如数据结构、线程、锁、会话等;物理资源指的是硬件资源,如:CPU、磁盘、内存等。租户能够创建的逻辑资源量可能受一个或者多个物理资源限制。为了用户可以更方便地获取集群当前的逻辑资源对应的物理资源使用信息,以此更可靠地规划扩缩容、节点替换、备租户创建等操作,V4.3.1 新增资源规格估算功能,提供以下一系列动态视图、系统包:
* 新增 `[G]V$OB_TENANT_RESOURCE_LIMIT` 视图,用于展示租户在每个 Unit 上的逻辑资源使用量、上限值、生效限制条件和宕机重启后的最大占用量。
* 新增 `[G]V$OB_TENANT_RESOURCE_LIMIT_DETAIL` 视图,用于展示租户在一个机器上能创建的逻辑资源所受的物理资源或配置项的限制情况。
* 新增 `DBMS_OB_LIMIT_CALCULATOR.CALCULATE_MIN_PHY_RES_NEEDED_BY_UNIT` 子程序,用于计算某个租户在某个节点上所需的最小物理资源量。
* 新增 `DBMS_OB_LIMIT_CALCULATOR.CALCULATE_MIN_PHY_RES_NEEDED_BY_LOGIC_RES` 子程序,用于计算特定逻辑资源类型和数量需要的物理资源量。
* 新增 `DBMS_OB_LIMIT_CALCULATOR.CALCULATE_MIN_PHY_RES_NEEDED_BY_STANDBY_TENANT` 子程序,用于计算指定主租户创建指定 Unit 个数的备租户需要的最小物理资源量。
* **备份进度展示**
OceanBase 早期版本备份任务黑盒进行,大数据量的备份任务往往需要执行较长时间,用户无法了解备份进度,无法感知预计完成时间。新版本增加备份进度统计功能,支持数据备份进度和补偿日志备份进度展示。用户可通过查询 `CDB/DBA_OB_BACKUP_TASKS` 视图的 `DATA_PROGRESS` 字段获取宏块级别的数据备份进度,查询 `LOG_PROGRESS` 字段获取补偿日志备份进度。
* **备份快照表名**
OCP 及下游厂商适配表级恢复功能时,需要向用户展示可供恢复的表。新版本在备份集中持久化了对应的快照表名,并提供通过 `ob_admin` 来解析快照表名的能力。
* **手动 Transfer 分区**
OceanBase 现有的自动负载均衡机制可以自动调整分区分布,以达到在线扩缩容和分区均衡的目的。不过实际业务场景中,用户有定制数据分布的需求,希望将特定的分区进行聚合或打散。V4.3.1 版本增加手动 Transfer 分区功能,用户可以选择将特定的分区迁移到特定的日志流上,并提供任务状态查看和取消能力。
* **执行计划和限流同时绑定**
目前 `OUTLINE` 支持执行计划绑定和限流绑定两种功能,但不支持同时指定。考虑部分客户场景既需要干预执行计划,又需要对某条 SQL 限流的需求,V4.3.1 版本支持用户在一条创建 `OUTLINE` 的语句中指定 `max_concurrent()` 和其他 Hint。因为执行计划不支持使用 `sql_text` 指定通配符 `?` 绑定,执行计划和限流同时绑定时也约束为同样行为。`sql_id` 绑定方式未发生变化。
* **OBCDC 黑白名单**
OBCDC 目前已具备租户级别的日志同步功能,V4.3.1 增加库、表级同步粒度。支持通过简单的正则表达式配置黑白名单,来满足用户只需要同步部分表的数据消费场景。
* **PL & SQL 日志解耦**
当前通过 PL 执行的 SQL 语句复用了 PL 的 `trace_id`,导致同一个 `trace_id` 关联的日志量过大,通过过滤日志排查问题比较耗费时间。V4.3.1 版本将 PL 和 SQL 的日志解耦,为 PL 内部的 SQL 语句赋予独立的 `trace_id`,并在 SQL AUDIT 增加外层 PL `trace_id` 记录,有效提高问题排查效率。
* **PL 执行时间统计**
业务场景中,可能会遇到 PL 执行性能不符合预期的情况,目前缺少易用的手段快速分析主要耗时在内部 SQL 还是 PL 结构本身。V4.3.1 版本增加 PL 结构执行时间统计,可直接通过 `[G]V$OB_SQL_AUDIT` 视图的 `PLSQL_EXEC_TIME` 列来获取。
* **OBServer 支持 IPV6**
新版本支持 IPV6 格式的 server ip,支持 sql 客户端、rpc 客户端以 IPV6 地址连接,同时也支持了 IPV4 和 IPV6 节点的混合部署。支持 IPV4 集群升级,但不支持旧的 IPV4 类型的集群升级到 IPV6 类型。
兼容性变更
产品行为变更
新增如下变更:
| **功能** | **变更说明** |
|----------|--------------|
| SHOW PARAMETERS 展示内容变更 | 老版本 `SHOW PARAMETERS` 会展示包含隐藏配置项在内的所有参数,V4.3.1 对 `SHOW` 的展示规则做了调整,仅展示非隐藏参数 + 非默认值的隐藏参数。同时也增加了 `default_value` 和 `isdefault` 两列用于展示配置项默认值和当前设置是否为默认值的信息。|