首批通过分布式安全可靠测评,为关键业务系统打造
LOB 类型
更新时间:2026-07-15 15:27:38
LOB 类型是用于存储 TEXT、BLOB、JSON、Geometry 等数据类型。 LOB 的存储的方式分为内联存储(INROW)和外联存储(OUTROW)两种。
内联存储
内联存储是将 LOB 数据与主表行存储在一起,在读取 LOB 数据时只需要进行一次存储访问操作。
外联存储
外联存储是将 LOB 数据存储在 LOB 辅助表中,在读取 LOB 数据时需要读取主表行,获取外联 LOB 的定位符(locator),之后根据定位符信息去 LOB 辅助表中读取实际的 LOB 数据,在这个过程中需要进行两次存储访问操作。
LOB 类型
在 Oracle 模式下,常见的 LOB 类型包括:
- BLOB(Binary Large Object):全称为二进制大型对象,通常用于存储图片、文件、音乐等大文件信息。
- CLOB(Character Large Object):全称为字符大型对象,用于存储单字节和多字节字符数据。
- JSON:用于存储 JSON 格式的数据,常用于处理结构化数据。
- SDO_GEOMETRY:用来存储和处理几何图形数据的数据类型,它是一个复合数据类型,用于表示二维或三维的几何图形。
- XMLType:用于存储 XML 格式的数据,便于处理和查询 XML 文档。
说明
XMLType 在某些方面不同于传统的 LOB 类型。它实际上是一种用户定义类型(UDT),其内部包含一个 BLOB 字段。
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;
第二步:创建 LOB 校验专用资源计划
在需运行校验的业务租户内,可单独建一套资源计划,将 LOB 校验相关后台任务映射到专用资源组并限制 CPU、IOPS。以下示例计划名为 LOB_CHECK,资源组名为 LOB_CHECK,通过 FUNCTION 映射将取值 LOB_CHECK 的后台任务划入该组;MGMT_P1、UTILIZATION_LIMIT、MAX_IOPS、MIN_IOPS、WEIGHT_IOPS 等请按实际规格调整。
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN('LOB_CHECK', 'plan for lob_check'); END; /
BEGIN DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP('LOB_CHECK', 'LOB_CHECK'); END; /
BEGIN
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);
END;
/
BEGIN DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING('FUNCTION', 'LOB_CHECK', 'LOB_CHECK'); END; /
说明
与 MySQL 模式常见的 CALL DBMS_RESOURCE_MANAGER.* 写法不同,Oracle 模式租户通常使用 BEGIN ... END; 匿名块调用资源管理相关过程。
激活资源管理计划后,上述映射与限额才会对会话及后台任务生效:
SET GLOBAL resource_manager_plan = 'LOB_CHECK';
resource_manager_plan 的含义与注意事项参见 resource_manager_plan。
DBMS_RESOURCE_MANAGER 过程、参数和权限说明请参见 DBMS_RESOURCE_MANAGER 概述 与 配置租户内资源隔离(Oracle 模式)。
第三步:配置定时任务(可选)
如果需要定期执行 LOB 一致性校验,可手动启用定时任务,启用后默认触发时间为每周日凌晨 4 点。
-- 开启任务
CALL DBMS_SCHEDULER.ENABLE('lob_check_job');
-- 关闭任务
CALL DBMS_SCHEDULER.DISABLE('lob_check_job');
-- 修改定时任务触发周期和开始时间
CALL DBMS_LOB_MANAGER.RESCHEDULE_JOB('2025-12-01 17:48:00', 'FREQ=DAILY; INTERVAL=1');
查看调度任务信息:
SELECT * FROM DBA_SCHEDULER_JOBS WHERE job_name='lob_check_job';
第四步:执行 LOB 一致性校验
-- 触发当前租户所有含 LOB 辅助表的数据表进行一致性校验
CALL DBMS_LOB_MANAGER.CHECK_LOB();
-- 仅触发指定 table_id 的表进行一致性校验
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');
第五步:查看 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;