44-Oracle 系统DBMS包的功能和演进

一、Oracle DBMS包

各位DBA小能手,是不是使用DBMS的包很多,感觉速度快,效率高。那么DBMS包是什么,和RDBMS也就差个R(关系)么。在Oracle语境中,​DBMS包特指以 DBMS_ 为前缀的预编译程序包(数据库管理系统包)Database Management System Packages(如 DBMS_OUTPUT、DBMS_SCHEDULER),这些包是Oracle提供的标准编程接口,封装了数据库管理、数据操作、系统任务调度等核心功能。

DBMS包通过封装底层操作,将DBA从手工脚本中解放,转向声明式自动化管理,包括动态SQL执行、作业调度、文件操作、性能诊断、XML处理等,覆盖数据库开发与运维的全生命周期。DBMS包的本质是C/C++实现的系统级功能,通过PL/SQL接口暴露,依托内存管理、事务引擎、进程模型三大支柱运行。平衡高效性与易用性,成为Oracle数据库能力的核心载体。

底层开发技术​
编程语言​:
  • ​C/C++​​:Oracle数据库的核心引擎(包括DBMS包)主要用 ​C 和 C++​​ 语言开发。C语言提供高效的底层资源访问(如内存管理、I/O操作),C++则支持面向对象设计,用于模块化封装复杂逻辑(如事务管理、并发控制)。
  • ​PL/SQL​:DBMS包暴露的接口通过 ​PL/SQL(Procedural Language/SQL)​​ 提供给用户。PL/SQL引擎将用户调用的存储过程编译为字节码,由Oracle虚拟机执行,实现高性能的数据处理。
​核心架构组件​:
  • ​内存管理(SGA)​​:DBMS包运行时依赖 ​系统全局区(SGA)​​ 共享内存,包括数据库缓冲区(缓存数据块)、共享池(存储SQL和PL/SQL编译代码)等。例如,DBMS_SQL 动态执行SQL时,语句解析结果会缓存于共享池,减少重复解析开销。
  • ​并发控制(MVCC)​​:事务型操作(如 DBMS_TRANSACTION)通过 ​多版本并发控制(MVCC)​​ 实现:为每个事务生成独立数据版本(存储在UNDO段),避免读写阻塞,确保高并发一致性。
  • ​后台进程协作​:任务调度包(如 DBMS_SCHEDULER)依赖后台进程(如 CJQ0)管理作业队列;文件操作包(如 UTL_FILE)通过操作系统接口实现磁盘I/O。

​二、底层流程和调度​

​DBMS_OUTPUT 的底层流程:

用户调用 DBMS_OUTPUT.PUT_LINE 输出文本 → PL/SQL引擎将调用编译为字节码 → 通过SGA共享池传递消息 → 客户端工具(如SQL*Plus)从缓冲区读取并显示。

​DBMS_SCHEDULER 的调度机制:

创建作业(CREATE_JOB)→ 作业定义写入数据字典 → 后台进程 CJQ0 轮询作业队列 → 启动从进程执行任务 → 日志写入控制文件/跟踪文件

 三、DBMS包技术原理:三大核心机制

1. ​内存与执行框架​
  • ​共享池缓存​:DBMS包代码存储在SGA共享池,减少重复解析(软解析占比≥90%)
  • ​PL/SQL引擎​:编译型执行模式,性能显著优于解释型语言(如早期Java存储过程)
  • ​事务控制​:通过DBMS_TRANSACTION包管理ACID,依赖UNDO(回滚段)和REDO日志实现一致性
2. ​优化器协同机制​
  • ​统计信息驱动​:DBMS_STATS收集表/索引的统计信息(行数、直方图),供CBO生成高效执行计划
  • ​动态性能视图​:V$SQL、V$SESSION等视图与DBMS_MONITOR联动,实时追踪SQL性能
3. ​异步处理模型​
  • ​后台进程调度​:DBMS_SCHEDULER通过CJQ0进程管理作业队列,支持链式依赖任务
  • ​并行处理​:DBMS_DATAPUMP利用并行从进程(Worker Processes)加速数据迁移

四、关键版本DBMS包列表与功能

​Oracle 10g​(网格计算)

包名

​核心功能​

​技术意义​

DBMS_STATS

自动收集统计信息

优化CBO执行计划,减少全表扫描

DBMS_SCHEDULER

跨节点作业调度

替代DBMS_JOB,支持链式依赖任务

DBMS_DATAPUMP

高速数据迁移

并行处理提升10倍导出速度

 Oracle 11g​(自管理增强)

​包名​

​核心功能​

​技术意义​

DBMS_REDEFINITION

在线重定义表结构

零停机修改表结构

DBMS_SQLTUNE

SQL自动调优

生成执行计划建议,修复性能瓶颈

DBMS_ADVISOR

性能诊断框架

整合AWR/ASH数据提供优化建议

 ​Oracle 19c​(自治数据库)

​包名​

​核心功能​

​技术意义​

DBMS_AUTO_REPORT

实时性能诊断

自动分析AWR快照生成HTML报告

DBMS_QOPATCH

补丁元数据管理

验证补丁一致性,防止配置漂移

DBMS_CLOUD

云存储集成

支持OCI/AWS S3数据直接加载

​Oracle 23ai​(AI融合) 

​包名​

​核心功能​

​技术意义​

DBMS_VECTOR

向量相似度搜索

支持ANN索引,加速AI查询

DBMS_DICTIONARY_CHECK

数据字典自愈

自动修复系统表损坏

DBMS_CLOUD_AI

大模型集成

调用LLM生成SQL或分析文本

五、系统DBMS包实操

1、查看所有的系统自带的DBMS包-23ai环境
select object_name,status,object_type from dba_objects D where D.object_name 
like '%DBMS%' and D.object_type='PACKAGE';
--
DBMS_MACSEC_FUNCTION              VALID     PACKAGE
DBMS_MACOUT                       VALID     PACKAGE
DBMS_MACUTL                       VALID     PACKAGE
DBMS_MACADM                       VALID     PACKAGE
DBMS_MACAUD                       VALID     PACKAGE
DBMS_MACSEC_RULES                 VALID     PACKAGE
DBMS_MACSEC                       VALID     PACKAGE
DBMS_MACOLS                       VALID     PACKAGE
DBMS_MACSEC_ROLES                 VALID     PACKAGE
DBMS_MACOLS_SESSION               VALID     PACKAGE

682 rows selected.

SYS@CDB$ROOT>
2、查看DBMS源码--系统是加密的 23ai 
select text from dba_source D where D.type='PACKAGE BODY'
and name = 'DBMS_STATS';
--
Y0uTC3YjqXBc0AYZ2eS+VA69466YOfS6djfm3hnY9i4+T6s7oC8vEFPOMkIQnQndEFJO0/rm
ypBhysx82lkkwZryPJqSrIg0hytat+NIcaLsMc0jfs6Thv+cc5DaLcQZ9GiUZwj0lzUWUoyZ
jGKKDMWlbEAzzt/YCXCrPNwIGfwnE/ZE3b7sGYwH8XR9bMxjNjsVneax2vUqJZMIvgBnkN5C
guecn2lRyNoT2mQFM/1SB4WIsaJusxoCUGzfuYek78Oz4e7v8v/sDCLR2MVRLB1NUTKg/f73
BzaV8+c5obIAAwgRenZyA88zn6LphQ4M405RsSTsM/iFePcAPb1gG+v/s0u27vfKFMN94xHD
B9o12tqXCixmukMmyZWHPh4DUSrgo4oCzqEAJOCGclukTeqmlgv7c7QYO41JxHTJfrfKYgaq
5CQLIR/b
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

88 rows selected.


SYS@CDB$ROOT>
3、实操DBMS 包脚本(基于 HR.EMPLOYEES 表)

​DBMS_STATS(统计信息管理)​​​功能​:优化查询执行计划,避免全表扫描

-- 收集 HR.EMPLOYEES 表的统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'HR', tabname=>'EMPLOYEES');
--PL/SQL procedure successfully completed.
-- 验证统计信息更新
--NUM_ROWS > 0 且 LAST_ANALYZED 为当前时间即成功
SELECT num_rows, blocks, last_analyzed 
FROM dba_tables 
WHERE owner='HR' AND table_name='EMPLOYEES';
--
   NUM_ROWS    BLOCKS LAST_ANALYZED
___________ _________ ________________
        107         5 17-JUN-25
4. DBMS_FGA(细粒度审计)​​

​功能​:监控对薪资(SALARY)列的敏感查询

-- 创建审计策略:监控 HR.EMPLOYEES 表的 SALARY 列查询
BEGIN
  DBMS_FGA.ADD_POLICY(
    object_schema   => 'HR',
    object_name     => 'EMPLOYEES',
    policy_name     => 'AUDIT_HR_SALARY',
    audit_column    => 'SALARY',
    enable          => TRUE,
    statement_types => 'SELECT'
  );
END;
/
--PL/SQL procedure successfully completed.
--业务需要删除DROP_POLICY,禁用DISABLE_POLICY
BEGIN
  DBMS_FGA.DROP_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'AUDIT_HR_SALARY'
  );
END;
/ 

-- 触发审计(执行监控列查询)
SELECT salary FROM HR.EMPLOYEES WHERE employee_id = 100;
--
   SALARY
_________
    24000
-- 查看审计记录,返回包含 salary 的 SQL 语句、执行用户及时间戳
SELECT sql_text, db_user, timestamp FROM dba_fga_audit_trail 
WHERE policy_name='AUDIT_HR_SALARY';
​​5. DBMS_REDEFINITION(在线表重构)​​

​功能​:零停机修改表结构(如新增列)--注意开启审计之后无法在线重构

-- 创建临时表(结构与 EMPLOYEES 相同)
CREATE TABLE HR.EMPLOYEES_NEW AS SELECT * FROM HR.EMPLOYEES WHERE 1=0;
--Table HR.EMPLOYEES_NEW created.
-- 添加新列(示例)
ALTER TABLE HR.EMPLOYEES_NEW ADD (bonus NUMBER(8,2));
--Table HR.EMPLOYEES_NEW altered.
-- 启动在线重定义
BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname      => 'HR',
    orig_table => 'EMPLOYEES',
    int_table  => 'EMPLOYEES_NEW'
  );
END;
/
--PL/SQL procedure successfully completed.

-- 完成重构(切换表)
BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE('HR', 'EMPLOYEES', 'EMPLOYEES_NEW');
END;
/
--PL/SQL procedure successfully completed.
-- 验证新结构
DESC HR.EMPLOYEES; -- 应显示新增的 BONUS 列
Name              Null?       Type
_________________ ___________ _______________
EMPLOYEE_ID                   NUMBER(6)
FIRST_NAME                    VARCHAR2(20)
LAST_NAME         NOT NULL    VARCHAR2(25)
EMAIL             NOT NULL    VARCHAR2(25)
PHONE_NUMBER                  VARCHAR2(20)
HIRE_DATE         NOT NULL    DATE
JOB_ID            NOT NULL    VARCHAR2(10)
SALARY                        NUMBER(8,2)
COMMISSION_PCT                NUMBER(2,2)
MANAGER_ID                    NUMBER(6)
DEPARTMENT_ID                 NUMBER(4)
BONUS                         NUMBER(8,2)
6. DBMS_OUTPUT(调试信息捕获)​​

​功能​:PL/SQL 异常日志记录

SET SERVEROUTPUT ON
BEGIN
  DBMS_OUTPUT.PUT_LINE('开始操作:更新薪资...');
  -- 模拟错误操作(更新不存在的列)
  UPDATE HR.EMPLOYEES SET salary_new = 10000 WHERE employee_id = 100;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('错误: ' || SQLERRM);
END;
/
---
ERROR at line 4:
ORA-06550: line 4, column 27:
PL/SQL: ORA-00904: "SALARY_NEW": invalid identifier
ORA-06550: line 4, column 3:
PL/SQL: SQL Statement ignored
Help: https://docs.oracle.com/error-help/db/ora-06550/

六、演进趋势总结

  • ​自动化​ → ​自治化​从10g的统计自动收集(DBMS_STATS)到19c的主动诊断(DBMS_AUTO_REPORT),实现“无人自治”数据库。
  • ​单一模型​ → ​多模融合​23ai的DBMS_VECTOR支持向量+关系+JSON混合处理,统一结构化与非结构化数据
  • ​被动修复​ → ​主动防御​DBMS_DICTIONARY_CHECK通过校验和实时修复系统表,避免灾难性故障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值