首批通过分布式安全可靠测评,为关键业务系统打造
LOB 类型
更新时间:2026-06-21 12:52:21
LOB 类型是用于存储 TEXT、BLOB、JSON、Geometry 等数据类型。 LOB 的存储的方式分为内联存储(INROW)和外联存储(OUTROW)两种。
内联存储
内联存储是将 LOB 数据与主表行存储在一起,在读取 LOB 数据时只需要进行一次存储访问操作。
外联存储
外联存储是将 LOB 数据存储在 LOB 辅助表中,在读取 LOB 数据时需要读取主表行,获取外联 LOB 的定位符(locator),之后根据定位符信息去 LOB 辅助表中读取实际的 LOB 数据,在这个过程中需要进行两次存储访问操作。
LOB 存储转换
LOB 数据的存储是内联存储还是外联存储,取决于 LOB 列的数据量。假如设定一个阈值为 8192 字节,如果超过 8192 字节 则为外联存储,否则为内联存储。
obclient> CREATE TABLE t(pk int, data text) LOB_INROW_THRESHOLD = 8192;
上述 DDL 指定了表中 LOB 列的 INROW 转 OUTROW 阈值为 8192 字节,其中 LOB_INROW_THRESHOLD 表示 LOB 列的阈值。
- 当 LOB 列的数据小于等于 8192 字节时,LOB 数据和主表行存储在一起。
- 当 LOB 列的数据大于 8192 字节时,会将所有数据存储到 LOB 辅助表中。
说明
lob_inrow_threshold的值从大改小需要触发 Offline DDL。
内联存储相对于外联存储具有更好的性能表现,它能够减少存储访问次数,提高读取 LOB 数据的效率。特别是在需要频繁访问 LOB 数据的场景下,选择内联存储能够加快查询速度并降低系统开销。
LOB 类型
在 MySQL 模式下,常见的 LOB 类型按字母顺序排列如下:
- ARRAY:用于存储数组数据类型,允许存储多个值的集合。
- Roaringbitmap:用于存储位图数据,主要用于图像处理和表示。
- BLOB(Binary Large Object):用于存储二进制数据,如图像或文件,最大长度为 65,535 字节。
- GEOMETRY:用于存储地理空间数据,支持空间分析和操作。
- JSON:用于存储 JSON 格式的数据,便于处理结构化数据。
- LONGTEXT:用于存储大量的文本数据,最大长度为 536,870,910 字节。
- LONGBLOB:用于存储大量的二进制数据,最大长度为 536,870,910 字节。
- MEDIUMBLOB:用于存储中等量的二进制数据,最大长度为 16,777,215 字节。
- MEDIUMTEXT:用于存储中等量的文本数据,最大长度为 16,777,215 字节。
- TEXT:用于存储较少量的文本数据,最大长度为 65,535 字节。
LOB 一致性校验
外联存储时,主表与 LOB 辅助表通过 LOB ID 关联:主表定位符中的 LOB ID 集合,应与 LOB 辅助表中出现的 LOB ID 集合一致。若出现“主表有而辅助表无”或“辅助表有而主表无”等不一致,可能导致读取异常或空间无法回收等问题。
该功能通过 LOB 校验任务(LOB Task)扫描主表收集 LOB ID 集合,并与 LOB 辅助表扫描得到的 LOB ID 集合做对比,输出是否一致及差异信息,便于在低峰期巡检或在故障排查时确认数据关系是否正常。
注意
校验会扫描主表与 LOB 辅助表相关数据,对 I/O 与 CPU 有一定开销,请在业务低峰期执行,并结合下文为任务配置合适的资源组。
与资源组及 I/O 基准配合使用说明
LOB 一致性校验会扫描主表与 LOB 辅助表,I/O 与 CPU 开销较大。对校验任务做 I/O 上限等限额时,依赖租户侧磁盘 I/O 基准(由 I/O 校准产生)。不同部署形态下建议如下:
- 公有云等已默认完成 I/O 校准的环境:通常可直接在租户内配置资源管理计划与资源组。
- 私有云或未做过 I/O 校准的环境:需先在系统租户完成磁盘 I/O 校准,再根据基准为业务租户规划 Unit 的
MAX_IOPS/MIN_IOPS,并与资源组中的 I/O 限额配合。校准命令、进度查看及与后台任务资源隔离的关系,请参见 后台任务的资源隔离;磁盘性能校准步骤另见 磁盘性能校准。
完整示例
使用一致性校验功能时,需要先进行 I/O 校准,然后创建 LOB 校验专用资源计划,并配置资源管理计划与资源组。
第一步:I/O 校准(可选)
如果未做过 I/O 校准,需要先在系统租户执行 I/O 校准,校准完成到生效可能需要 1-2 分钟。
注意
此部分命令需在系统租户执行。
ALTER SYSTEM RUN JOB 'io_calibration';
校准完成后,可通过 GV$OB_IO_CALIBRATION_STATUS 查看校准任务状态,通过 GV$OB_IO_BENCHMARK 查看各节点基准 IOPS。为租户配置 Unit IOPS 时,建议在基准(例如 16 KB 读对应 IOPS)基础上预留约 10% 余量,避免磁盘打满影响在线业务延迟。
-- 查看校准进度
SELECT * FROM GV$OB_IO_CALIBRATION_STATUS;
-- 查询校准值
SELECT * FROM GV$OB_IO_BENCHMARK;
为租户配置 Unit 层面的 IOPS 时,建议参考 GV$OB_IO_BENCHMARK 查询到的 IOPS 基准值,在此基础上预留约 10% 的余量(即以 16K 对应 IOPS 的 90% 作为设置值),以避免磁盘资源充分利用时达到瓶颈,从而保障前台 SQL 的响应时间不会受到影响。
第二步:创建 LOB 校验专用资源计划
在需运行校验的业务租户内,可单独建一套资源计划,将 LOB 校验相关后台任务映射到专用资源组并限制 CPU、IOPS。以下示例计划名为 LOB_CHECK,资源组名为 LOB_CHECK,通过 FUNCTION 映射将取值 LOB_CHECK 的后台任务划入该组;MGMT_P1、UTILIZATION_LIMIT、MAX_IOPS、MIN_IOPS、WEIGHT_IOPS 等请按实际规格调整。
DBMS_RESOURCE_MANAGER 各子程序语法与参数说明参见 DBMS_RESOURCE_MANAGER 概述。
CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN('LOB_CHECK', 'plan for lob_check');
CALL DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP( CONSUMER_GROUP => 'LOB_CHECK', COMMENT => 'LOB_CHECK');
CALL DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN => 'LOB_CHECK',
GROUP_OR_SUBPLAN => 'LOB_CHECK',
COMMENT => 'LOB_CHECK_GROUP',
MGMT_P1 => 30,
UTILIZATION_LIMIT => 30,
MAX_IOPS => 20,
MIN_IOPS => 0,
WEIGHT_IOPS => 20);
CALL DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING('FUNCTION', 'LOB_CHECK', 'LOB_CHECK');
激活资源管理计划后,上述映射与限额才会对会话及后台任务生效:
SET GLOBAL resource_manager_plan = 'LOB_CHECK';
resource_manager_plan 的含义与注意事项参见 resource_manager_plan。
第三步:配置定时任务(可选)
注意
此部分命令需在业务租户下执行。
如果需要定期执行 LOB 一致性校验,可以创建定时任务。
开启任务:默认关闭,需要手动开启,默认触发时间为每周日凌晨 4 点。
CALL DBMS_SCHEDULER.ENABLE('lob_check_job');停止定时任务
CALL DBMS_SCHEDULER.DISABLE('lob_check_job');修改定时任务的触发周期和开始时间
CALL DBMS_SCHEDULER.ENABLE('lob_check_job'); CALL DBMS_LOB_MANAGER.RESCHEDULE_JOB('2025-12-01 17:48:00', 'FREQ=DAYLY; INTERVAL=1');查看定时任务的详细信息:
SELECT * FROM DBA_SCHEDULER_JOBS WHERE job_name='lob_check_job';返回结果示例如下:
*************************** 1. row *************************** OWNER: SYS JOB_NAME: lob_check_job JOB_SUBNAME: NULL JOB_STYLE: REGULAR JOB_CREATOR: NULL CLIENT_ID: NULL GLOBAL_UID: NULL PROGRAM_OWNER: SYS PROGRAM_NAME: NULL JOB_TYPE: PLSQL_BLOCK JOB_ACTION: DBMS_LOB_MANAGER.CHECK_LOB_INNER() NUMBER_OF_ARGUMENTS: NULL SCHEDULE_OWNER: NULL SCHEDULE_NAME: NULL SCHEDULE_TYPE: NULL START_DATE: 2025-12-01 17:48:00.000000 +08:00 REPEAT_INTERVAL: FREQ=DAYLY; INTERVAL=1 EVENT_QUEUE_OWNER: NULL EVENT_QUEUE_NAME: NULL EVENT_QUEUE_AGENT: NULL EVENT_CONDITION: NULL EVENT_RULE: NULL FILE_WATCHER_OWNER: NULL FILE_WATCHER_NAME: NULL END_DATE: 4000-01-01 00:00:00.000000 +08:00 JOB_CLASS: DEFAULT_JOB_CLASS ENABLED: 1 AUTO_DROP: 0 RESTART_ON_RECOVERY: NULL RESTART_ON_FAILURE: NULL STATE: NULL JOB_PRIORITY: NULL RUN_COUNT: NULL MAX_RUNS: NULL FAILURE_COUNT: 0 MAX_FAILURES: NULL RETRY_COUNT: NULL LAST_START_DATE: NULL LAST_RUN_DURATION: +000000000 02:00:00.000000 NEXT_RUN_DATE: 2025-12-23 17:48:00.000000 +08:00 SCHEDULE_LIMIT: NULL MAX_RUN_DURATION: +000 02:00:00 LOGGING_LEVEL: NULL STORE_OUTPUT: NULL STOP_ON_WINDOW_CLOSE: NULL INSTANCE_STICKINESS: NULL RAISE_EVENTS: NULL SYSTEM: NULL JOB_WEIGHT: NULL NLS_ENV: NULL SOURCE: NULL NUMBER_OF_DESTINATIONS: NULL DESTINATION_OWNER: NULL DESTINATION: NULL CREDENTIAL_OWNER: NULL CREDENTIAL_NAME: NULL INSTANCE_ID: NULL DEFERRED_DROP: NULL ALLOW_RUNS_IN_RESTRICTED_MODE: NULL COMMENTS: LOB consistency check job, runs weekly to check LOB data consistency FLAGS: 0 RESTARTABLE: NULL CONNECT_CREDENTIAL_OWNER: NULL CONNECT_CREDENTIAL_NAME: NULL 1 row in set任务触发后,若要查看 LOB 校验任务进度,可查询
oceanbase.DBA_OB_LOB_CHECK_TASKS视图,示例如下。SELECT * FROM DBA_OB_LOB_CHECK_TASKS;返回结果示例如下:
+-------+-------------+----------+-----------+---------+---------------------+---------------------+--------------+------------+----------+------------------+------------+-------------+------------+-----------+-------------+ | LS_ID | TABLE_NAME | TABLE_ID | TABLET_ID | TASK_ID | START_TIME | END_TIME | TRIGGER_TYPE | STATUS | MISS_CNT | MISMATCH_LEN_CNT | ORPHAN_CNT | CORRECT_CNT | RET_CODE | TASK_TYPE | SCAN_INDEX | +-------+-------------+----------+-----------+---------+---------------------+---------------------+--------------+------------+----------+------------------+------------+-------------+------------+-----------+-------------+ | -1 | NULL | -3 | -3 | 1 | 2025-12-23 17:48:00 | 2025-12-23 17:48:00 | PERIODIC | TRIGGERING | 0 | 0 | 0 | 0 | OB_SUCCESS | LOB_CHECK | PRIMARY KEY | | 1 | __all_table | 3 | 3 | 1 | 2025-12-23 17:48:02 | 2025-12-23 17:48:02 | PERIODIC | PREPARED | 0 | 0 | 0 | 0 | OB_SUCCESS | LOB_CHECK | PRIMARY KEY | +-------+-------------+----------+-----------+---------+---------------------+---------------------+--------------+------------+----------+------------------+------------+-------------+------------+-----------+-------------+ 2 rows in set使用
DBMS_LOB_MANAGER.RESCHEDULE_JOB修改调度后,可通过DBA_SCHEDULER_JOBS查看NEXT_RUN_DATE等字段。
第四步:执行 LOB 一致性校验
手动触发 LOB 一致性校验
-- 触发该租户所有有lob辅助表的一致性校验 CALL DBMS_LOB_MANAGER.CHECK_LOB(); -- 触发该租户table_id在该数组内的表的lob一致性校验 CALL DBMS_LOB_MANAGER.CHECK_LOB('[500001, 500003]');取消当前任务
CALL DBMS_LOB_MANAGER.CANCEL_JOB("check_lob");暂停任务
CALL DBMS_LOB_MANAGER.SUSPEND_JOB("check_lob");继续任务
CALL DBMS_LOB_MANAGER.RESUME_JOB("check_lob");修改定时任务触发周期和开始时间
CALL DBMS_LOB_MANAGER.RESCHEDULE_JOB('2025-12-01 17:48:00', 'FREQ=DAYLY; INTERVAL=1');
第五步:查看 LOB 一致性校验结果
通过视图 DBA_OB_LOB_CHECK_TASKS 查看当前 LOB 任务的进度,通过 DBA_OB_LOB_CHECK_EXCEPTION_RESULT 查看异常结果。
SELECT * FROM DBA_OB_LOB_CHECK_TASKS;
SELECT * FROM DBA_OB_LOB_CHECK_EXCEPTION_RESULT;