简介:OCP 19c 082认证备考资料,内含1份docx文档,包体大小3.4MB。文档围绕Oracle数据库核心考点精选典型考题,覆盖空间节省特性、视图操作、SQL分组查询及事务处理等必考模块。每道题目均提供中英文对照题干、正确答案与逐项解析,特别是对UNUSABLE索引是否保留分段、私有临时表生命周期、WITH CHECK子句的防更新作用等易混知识点做了细致辨析,能有效帮助考生避开常见陷阱;针对事务部分还特别梳理了TRUNCATE、CREATE TABLE等DDL语句的隐式提交行为,演示提交或回滚后如何开启新事务。文档为单个docx文件,便于打印或做笔记。已有615人学习下载,是Oracle 19c认证体系下针对1Z0-082的紧凑型复习材料,适合考前查漏补缺,也适合作为日常练习册反复刷题。
1. 为什么说备考 OCP 19c 082 不能只背答案:这批题测的是存储与事务的物理行为
很多备考 OCP 19c 082 的考生把这科当「背题课」,但我拆这份官方题组时发现,082 是 19c 考试里「现象级」最重的科目:UNUSABLE 索引到底有没有 segment、TRUNCATE 之后会话里还有没有活动事务、UNDO 段填满最后一个 extent 是扩展还是环绕,每一道都在问你能不能看见 Oracle 的物理行为。资料一共 28 道题,答案标注里至少有两处与详解矛盾——最典型的是第 1 题,题下标着 AB,详解推的却是 C、D——背答案反而最容易翻车。对刷 OCP 题库的考生、准备 082 机考的人、用 19c 做内部培训的 DBA,这份素材值得按考点吃透。下文按存储、事务、SQL 语义、连接、进程五簇重排,给验证 SQL,再列踩坑记录。
2. 把 28 道题按考点重排:存储、事务、SQL 语义、连接、进程五簇
原文档按题号顺序排列,考点跳跃很大:第 1 题还在讲 UNUSABLE 段,第 4 题就跳到事务可见性,第 13 题又切到连接命名。我一般会先画一张考点映射表,把相近的题放到同一簇里再逐簇消化。这样做的直接好处是:考前最后一天只背五簇而不是背 28 道题。
| 考点簇 | 涉及题号 | 核心判题点 |
|---|---|---|
| 空间与段管理 | 1、18、19、20、21、27 | UNUSABLE 是否有 segment、延迟段创建、本地管理表空间、块结构 |
| 事务边界与 UNDO | 4、7、11 | DDL 隐式提交、活动事务、UNDO 段扩展与环绕 |
| 视图、SET 运算符、GROUP BY | 2、3、8、14、16、22、24、25 | WITH CHECK 语义、复合查询排序、类型组匹配、HAVING 位置 |
| 连接字符串与服务名 | 13、17 | tnsnames.ora、服务名、Easy Connect |
| 进程与权限 | 5、10 | PMON 职责、特权分析类型 |
先说一个判断:这一簇题在考场上能不能答对,取决于你有没有亲手在 19c 上跑过一遍。下面每一簇都配一段验证 SQL,直接在 PDB 里执行,比背解析快得多。
2.1 空间与段管理:UNUSABLE、TRUNCATE、延迟段创建的物理行为
这一簇承载的知识点是「段(segment)什么时候真的存在」。第 1 题的题面问节省空间功能哪两条正确,四个选项绕的都是同一个坑:UNUSABLE 是不是没有段。很多人看到 UNUSABLE 字面意思是「不可用」,顺手就认为它不占空间。实际上索引在创建时即使带上 UNUSABLE 属性,segment 依然被分配,只是标记为不可用;ALTER INDEX ... UNUSABLE 同样保留 segment。注意原始文档里这题答案标的是 AB,但按详解和实测,正确组合应该是 C、D,这也是这份资料里最需要警惕的一处标注错误。验证方法很简单:
-- 在任意 PDB 里执行 CREATE TABLE t_082_seg (id NUMBER, padding CHAR(10)); CREATE INDEX idx_082_seg ON t_082_seg(id) UNUSABLE; -- 查 user_segments,确认 UNUSABLE 索引是否有 segment SELECT segment_name, segment_type, extents, bytes FROM user_segments WHERE segment_name = 'IDX_082_SEG';这段 SQL 的逻辑是:先建表建索引,故意把索引建为 UNUSABLE,然后到 user_segments 视图里按段名精确查询。如果查询结果返回一行,说明 UNUSABLE 索引仍然占用 segment;如果返回零行,说明 Oracle 真的没有分配段。实际在 19c 上跑,结果是有返回的。C 和 D 为什么对,对应的就是「PTT 在 commit 时删除」和「ALTER 成 UNUSABLE 的索引保留 segment」。
第 19 题延迟段创建也是同一簇。默认情况下堆表和索引在插入第一行数据时才分配 segment;IOT 在本地管理表空间中支持该特性;索引从父表继承 DEFERRED 或 IMMEDIATE 属性;sys 用户的表不支持。这里有一个容易漏的选项「Sessions may dynamically switch back and forth from DEFERRED to IMMEDIATE」——这句话是对的,ALTER TABLE ... SEGMENT CREATION IMMEDIATE 可以随时切换。第 20 题考的本地管理表空间两大特性是「用位图管理空闲空间」和「服务器生成的表空间警报」,这两个功能依赖本地管理;OMF、AUTOEXTEND、在线段收缩都与本地管理没有必然绑定关系。第 21 题是块级存储:块头长度固定、块头包含指向块内所有行的行目录、行数据从块尾开始存储,索引块可以包含行数据,普通表块在逻辑上允许为空——这四条合起来就是 ADE。
这一节还要记一个边界:段可以跨数据文件,但不能跨表空间。表空间可以由多个数据文件组成,但表空间本身是段的边界,第 27 题里「A segment can span multiple data files in some tablespaces」就是基于这条边界判对的。
2.2 事务边界与 UNDO:能不能看见 V$TRANSACTION 取决于最后一刻
第 4 题是公认的高频题:当前会话有活动事务且已授予 V$TRANSACTION 读权限,问哪些情况还能在这个视图里查到数据。判题的关键不是「会不会查」,而是「最后一条语句执行完时,事务还在不在」。TRUNCATE、CREATE TABLE AS SELECT 这类 DDL 都会先隐式提交当前事务;提交或回滚后再执行 DML 也会开启新事务。用下面的步骤在会话里核对:
-- 会话 1 SELECT COUNT(*) FROM v$transaction; -- 初始为 0 CREATE TABLE t_082_tx (id NUMBER); -- DDL,隐式提交 INSERT INTO t_082_tx VALUES (1); -- DML,开启活动事务 SELECT COUNT(*) FROM v$transaction; -- 结果为 1 TRUNCATE TABLE t_082_tx; -- DDL,隐式提交 SELECT COUNT(*) FROM v$transaction; -- 结果为 0 SELECT * FROM t_082_tx FOR UPDATE; -- DML,开启新活动事务 SELECT COUNT(*) FROM v$transaction; -- 结果为 1 COMMIT;这段验证的要点在每次 SELECT COUNT(*) 的返回时机:INSERT 之后返回 1,TRUNCATE 之后返回 0,FOR UPDATE 之后又回到 1。实际生产里很少有人会盯 v$transaction,但考场上这就是「活动事务边界」的判题依据。对应第 4 题的 A、B、D 三个场景,最后一刻都存在活动事务;C 选项 CREATE TABLE 后跟 CREATE INDEX,两段 DDL 之间没有 DML,查不到活动事务,因此不选。
第 7 题同一簇,考 ROLLBACK 与 ROLLBACK TO SAVEPOINT 的锁定行为。第一段 ROLLBACK 不是回滚到保存点,而是把整个事务回滚,等于释放当前事务持有的所有锁;ROLLBACK TO SAVEPOINT 只撤销保存点之后的语句,之前修改的行仍然锁着。题目里 100 行原始数据、插入 1 行、建保存点、再插入 1 行的场景,正确答案集中在 C、E、F 三条:只有第二次 ROLLBACK 恢复了插入的行,第一次 ROLLBACK 保留原始 100 行的锁定状态。第 11 题则转到 UNDO 段本身:事务填满 undo segment 最后一个 extent 时,undo segment 可以扩展,也可以环绕到第一个 extent,这两条是 D、E;单个事务可以同时使用多个 undo segment 是错的,UNDO 段不能存放在 SYSAUX 和 SYSTEM 表空间,这两条是 B、E,和前面组合起来记。
2.3 视图、SET 运算符与 GROUP BY:SQL 语义的四个高频差异
第 2 题视图题的「正确判据」组合是 C、D:更新视图不要求重新授予视图权限、WITH CHECK 阻止不符合视图定义的行被从视图写入基表。B 选项是个经典陷阱——WITH CHECK 不负责「查询时不显示某些行」,它管的是写路径不是读路径。E 选项「视图可以被索引」在普通视图上不成立,物化视图才支持索引。
SET 运算符这一组,第 8 题问复合查询默认排序列:答案是「第一个 select 的第一列」,与数据类型无关,所以既不是「第一个 NUMBER 列」也不是「第一个 VARCHAR2 列」。第 22、24 题在问同一个边界:所有 select 的列数必须相同,列名可以不同,数据类型要属于同一类型组而非完全一致,UNION 去重但 UNION ALL 不去重,重复检查时 NULL 不忽略。用一个反例记忆:SELECT 1 FROM dual UNION SELECT 'A' FROM dual能在 19c 上跑通,因为 NUMBER 和 VARCHAR2 同属「可隐式转换的文字类型组」;但SELECT SYSDATE FROM dual UNION SELECT 'A' FROM dual会报错,日期与字符串组不匹配。这个例子比背文档有效。
第 3 题和第 25 题是 GROUP BY 语法题。第 3 题 C 选项把 release_date 既放在 SELECT 列表又不在 GROUP BY 里,因此错;D 选项把 release_date 加进 GROUP BY 就正确。第 25 题 A 选项错在高估了 WHERE 的能力——WHERE 不能包含聚合函数 COUNT(*),COUNT 只能出现在 HAVING 或 SELECT 列表里,正确写法是 WHERE 条件过滤行、HAVING 条件过滤分组。这个顺序问题在 082 里反复出现,建议动手建一张 20 行的测试表,把每一条能跑和不能跑的语句逐个过一遍。
2.4 连接字符串与服务名:tnsnames.ora 与 Easy Connect 的边界
第 13、17 题考连接解析,属于「配置知识」。需要记住的结论是:连接字符串不一定包含 SID(Easy Connect 用 host:port/service_name);一条连接字符串可以通过负载均衡和连接时间故障转移引用多个实例;同一个 tnsnames.ora 里不同条目可以复用相同的 service name、host、port;一个实例可以对外注册多个服务名。第 13 题里「Local Naming 要求设置 TNS_ADMIN」是错的——TNS_ADMIN 是自定义目录时用的环境变量,默认路径 $ORACLE_HOME/network/admin 即可工作;「没有配置客户端网络管理员也能连」在 Easy Connect 开启时成立,所以这题选 A、C、E。用一段典型条目做参照:
ORCL_082 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb1.example.com) ) )条目里的 SERVICE_NAME 是监听器注册的服务,不是实例 SID。第 17 题说「服务名由监听器创建」是错的——服务名来自数据库注册,监听器只负责接收;「连接字符串必须包含 SID」也是错的,服务名方式现在是常态。这一簇不用背文档,直接在客户端 tnsnames.ora 里改成容易验证的值,多连几次就有肌肉记忆。
2.5 进程与权限:PMON 职责与最低权限下的特权分析
第 5 题 PMON 的职责是:进程异常终止时回滚事务、释放被异常终止进程持有的资源,这两条是 A、D。容易误选的两条是「向所有本地和远端监听器注册数据库服务」和「在控制文件记录 checkpoint 信息」——前者 PMON 只向它知道的监听器注册,后者是 CKPT 进程的工作。第 10 题结合最低权限原则考 DBMS_PRIVILEGE_CAPTURE 的分析类型,两种正确类型是「用户对其他 schema 对象的权限」和「间接授予角色的权限被用户使用时」。数据库级、角色级、用户级三类捕获可以简化记成:分析的是「从角色间接获得的权限在真实会话里有没有被用」以及「跨 schema 的对象权限有没有被用」,而 sys 用户自己的权限使用、用户对自己 schema 对象的权限使用都不在这次分析范围内。一个常见调用骨架:
BEGIN DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE( capture_name => 'CAP_082_DEMO', type => DBMS_PRIVILEGE_CAPTURE.G_DATABASE, condition => 'SYS_CONTEXT(''USERENV'', ''CURRENT_USER'') = ''SCOTT''' ); DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE('CAP_082_DEMO'); END; /DBMS_PRIVILEGE_CAPTURE 的 G_DATABASE 指数据库级捕获,condition 参数限制捕获范围。题目不要求写 PL/SQL,但看懂这个骨架能帮你把「间接角色权限」和「直接角色权限」两个选项区分开:间接的是通过角色链条传下来的,直接的是一次性 GRANT 给角色的,Oracle 的捕获把它们分成不同维度。
其实到这里你会发现,这一章的五簇已经把 28 道题的考点全部覆盖了,下面需要动手验证。
3. 搭一个能跑通 082 判据的环境:Oracle 19c Linux 单实例安装与验证
前面那些 SQL 已经偏实验性质,最好有一个能跑的 19c 库。以下是我在测试机上搭 19c 单实例的惯用做法,用的就是 Linux 7/8 下的标准安装流程。如果你用的是 RHEL 9 或 OpenEuler,预检那步要人工处理一下——官方支持矩阵里 19c 到 Linux 8 / OL8 为止,RHEL 9 装起来能跑,但要带 -ignoreSysPrereqs 并手动建好 oracle 用户和目录。如果是云主机,内存 8G 起步,交换分区 4G 以上,/u01 独立挂载 60G 左右。
3.1 环境准备:内存、交换、内核参数与静默安装
我先列一组在 Linux 7/8 上验证过的关键参数:内核参数 fs.file-max = 6815744、kernel.sem = 250 32000 100 128、net.ipv4.ip_local_port_range = 9000 65500、vm.nr_hugepages = 0。这些值在默认的 /etc/sysctl.conf 里未必存在,安装前我会逐项追加并执行 sysctl -p。然后创建 oracle 用户、设置密码、授权目录:
groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01 # 静默安装示例,响应文件按模板修改后执行 ./runInstaller -silent \ -responseFile /u01/app/oracle/19c/db_home/response/db_install.rsp \ -ignoreSysPrereqs -ignorePrereq -waitForCompletion参数说明:-silent 表示不弹图形界面;-responseFile 指定已填好 ORACLE_HOME、ORACLE_BASE、UNIX_GROUP_NAME 等值的响应文件;-ignoreSysPrereqs 跳过系统预检;-waitForCompletion 让脚本在安装进程结束时才返回。如果你是图形环境,也可以直接跑 runInstaller,只是响应文件方式更容易在日志里看到卡点。安装完还要跑 root.sh 和 postInstall 生成的 oracle 用户环境变量脚本,建库我用 DBCA 静默模式。
前面这几步只能证明环境通了,真正服务于 082 的是下一节的验证 SQL。
3.2 用三条验证脚本对拍题组判据
我把第二章里散在五簇的验证 SQL 收拢成三组,方便在测试库里一次性执行。第一组验证存储行为:
CREATE TABLE t_082_seg (id NUMBER, padding CHAR(10)); CREATE INDEX idx_082_seg ON t_082_seg(id) UNUSABLE; SELECT segment_name, segment_type, extents, bytes FROM user_segments WHERE segment_name IN ('IDX_082_SEG', 'T_082_SEG');第二组验证事务边界:
SELECT COUNT(*) FROM v$transaction; INSERT INTO t_082_seg (id) VALUES (1); SELECT COUNT(*) FROM v$transaction; TRUNCATE TABLE t_082_seg; SELECT COUNT(*) FROM v$transaction; SELECT * FROM t_082_seg FOR UPDATE; SELECT COUNT(*) FROM v$transaction; ROLLBACK;第三组验证 SET 运算符的类型组行为:
SELECT 'X' AS c FROM dual UNION SELECT 1 FROM dual; SELECT SYSDATE AS c FROM dual UNION SELECT 'A' FROM dual;第一组语句判断 UNUSABLE 索引是不是无段;第二组判断活动事务边界,TRUNCATE 后计数器归零,FOR UPDATE 后回到 1;第三组第一条能跑、第二条报 ORA-01790,证明「类型组匹配」而不是「类型完全一致」。这三组跑完,082 里七成判题点都有实测依据了。
3.3 常见报错:ORA-01790、ORA-30036、ORA-01555 与题干的对应
做题时一带而过的报错,实测时都会暴露。UNION 里日期和字符串混用会报 ORA-01790: expression must have same datatype as corresponding expression,这就是第 22 题 A 选项「类型必须完全匹配」不成立的反证。UNDO 空间不足会报 ORA-30036: unable to extend segment by … in undo tablespace,对应第 11 题「UNDO 段填满最后 extent 时要么扩展要么环绕」的物理背景。ORA-01555: snapshot too old 则是 undo 环绕后被复写导致读一致性失败——这两个错误在同一道题里反复出现,建议在测试库里用小 undo 表空间制造一次 ORA-30036,再看告警日志里 undo 段是扩展还是环绕,直观到不会再错。实测时如果遇到 TRUNCATE 报 ORA-00054 资源正忙,是因为表上有其他会话的锁,等事务结束重试即可,这也顺带验证了第 7 题锁的持久性。
再往后是拆解过程中最值得记录的避坑部分。
4. 082 避坑记录:五个高频翻车点的定位与修复
这份题组拆完,我整理了五个典型的翻车点,每一条都来自真实做题现场。
4.1 翻车点一:以为 UNUSABLE 索引「没有 segment」
现象:第 1 题里看到 UNUSABLE 就选「has no segment」,还觉得字面上天经地义。原因:把 UNUSABLE 当成物理删除,其实它只是逻辑标记;创建时 segment 已经分配,ALTER INDEX ... UNUSABLE 也保留 segment。解决:在 user_segments 里查一遍,看到 segment 存在,这道题就再也不会错了。
4.2 翻车点二:把 TRUNCATE 当成「事务被终止」
现象:第 4 题只选了 D(commit/rollback 后执行 DML),漏掉 A 和 B。原因:以为 TRUNCATE 只是删数据,没意识到它是 DDL 会隐式提交。解决:把 TRUNCATE、CREATE、ALTER、DROP 都归入「隐式提交清单」,任何一次这样的 DDL 执行后,先前活动事务立即结束,后续 DML 开启新事务。
4.3 翻车点三:把 WITH CHECK 当成「查询过滤」
现象:第 2 题选了 B,以为 WITH CHECK 防止某些行显示在查询结果里。原因:WITH CHECK 的约束对象是 DML 的写路径,不是 SELECT 的读路径。解决:记一句口诀「WITH CHECK 管写不管读」——它只阻止通过视图写入不符合视图定义的行,从不改变查询出的行集。
4.4 翻车点四:SET 运算符里认为「数据类型必须完全匹配」
现象:第 22 题选了 exactly match,第 24 题又因为没想清楚 NULL 的重复检查逻辑而选错。原因:对 Oracle 的隐式转换规则不熟。解决:实测 UNION 里字符串和数字可以并存;列数必须相同,列名可以不同,数据类型只需要属于同一类型组,NULL 参与重复检查且不忽略。
4.5 翻车点五:以为复合查询默认排序是「第一个 NUMBER 列」
现象:第 8 题选了「第一个 NUMBER 或 VARCHAR2 列」。原因:把排序规则和「哪列通常是主键」混在一起。解决:复合查询(UNION/INTERSECT/MINUS)默认按第一个 select 的第一列排序,与数据类型无关;显式 ORDER BY 都要放在整个复合查询的最后。
这五条单独看都是小判断题,连起来其实就是 082 的命题偏好:题目往往把选项写成「一个精确但错误的行为描述」,考你的是底层物理机制而不仅是语法记忆。
5. 考场实战:从题干关键词到选项排除的判题流程
把避坑经验沉淀成流程后,我逐步形成了一套快速过题的习惯,分享出来给你参考。
5.1 先划绝对词:always、must、only、never
先扫题干和选项里的绝对词,十有八九是陷阱。第 2 题里「A view must only refer to tables in its defining query」——must 出现且说法过强,视图还能引用视图,直接排除。第 15 题同义词里「All private synonym names must be unique in the database」——错在只需在同一个 schema 内唯一。第 19 题延迟段创建里「It is supported for sys-owned tables」这种绝对化表述也要警惕,sys 模式下的表确实例外。划完绝对词,四个选项里通常能稳定排除一到两个。
5.2 再用「最后一刻状态」推演事务题
第 4 题这类题目,先不管中间过程,只看每题最后一条语句执行完时事务是否活动。A 选项:TRUNCATE 隐式提交 → DML 开启新事务 → 最后一刻是活动事务。B 选项:CREATE TABLE AS SELECT 隐式提交 → SELECT FOR UPDATE 开启新事务 → 活动。C 选项:CREATE TABLE 后 CREATE INDEX,中间无 DML,最后一刻事务结束。D 选项:commit/rollback 后 DML 开启新事务 → 活动。E 选项里的 failed DML 属于语句级异常,它不满足题干「成功后仍有活动事务」的判定口径,所以不选;F 选项 commit/rollback 后跟 SELECT,SELECT 不开启事务。整个过程不到十秒,比逐词翻译题干快得多。
5.3 反例排除法:为每个抽象选项找一个具体反例
抽象选项用反例排除最稳。第 2 题 WITH CHECK 防「显示」——反例就是创建一个带 WITH CHECK 的视图后 SELECT 依然返回视图范围内所有行,证明它管不了读。第 22 题「类型必须完全匹配」——反例:SELECT 1 FROM dual UNION SELECT 'A' FROM dual能跑通,自动转换存在。第 8 题默认排序——反例:第一个 select 的第一列是字符串时仍然按它排序。每个反例其实都能引出一个小实验,考场上记不住规则,记住反例就够。
6. 收尾脚本:把 082 的考点转成一张可复跑的验证清单
6.1 三条自检 SQL 与考前十分钟用法
最后一章的做法是把这份文档转成一张真实可复跑的验证清单,专门用来在考试前快速自检。以下是我实际存放的自检 SQL 集合,按照「存储—事务—集合运算」的顺序执行:
-- 1) 存储:索引 UNUSABLE 是否占用 segment CREATE TABLE t_082_chk (id NUMBER, pad VARCHAR2(10)); CREATE INDEX idx_082_chk ON t_082_chk(id) UNUSABLE; SELECT i.index_name, s.segment_name, CASE WHEN s.segment_name IS NULL THEN 'NO_SEG' ELSE 'HAS_SEG' END AS seg_flag FROM user_indexes i LEFT JOIN user_segments s ON s.segment_name = i.index_name WHERE i.index_name = 'IDX_082_CHK';-- 2) 事务边界:TRUNCATE 后 V$TRANSACTION 归零,FOR UPDATE 后回到 1 SELECT COUNT(*) AS tx_before FROM v$transaction; INSERT INTO t_082_chk (id) VALUES (1); SELECT COUNT(*) AS tx_after_insert FROM v$transaction; TRUNCATE TABLE t_082_chk; SELECT COUNT(*) AS tx_after_truncate FROM v$transaction;-- 3) 复合查询默认排序列:结果按第一个 select 的第一列排序 SELECT 'A' AS c FROM dual UNION ALL SELECT 'B' FROM dual;第一段脚本用 LEFT JOIN 查 user_indexes 与 user_segments,能精确定位一个索引是否真实存在 segment;第二段脚本的每次计数都在验证「哪些操作会结束或开启事务」;第三段结果按字母序返回,直观验证「默认排序列是第一个查询的第一列」。考试前我会把这三段 SQL 全部跑一遍——它们能在十分钟内让我确认自己对 082 的判断不是「背出来的答案」,而是能复现的行为。从那以后我每次换新环境都会强制走一遍这个流程,把每个选项当成一个待验证命题,而不是待背的结论。希望帮到你。
本文还有配套的精品资源,点击获取