ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OCP 19c 082备考:吃透存储与事务物理行为,告别盲目背题

OCP 19c 082备考:吃透存储与事务物理行为,告别盲目背题 简介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、27UNUSABLE 是否有 segment、延迟段创建、本地管理表空间、块结构事务边界与 UNDO4、7、11DDL 隐式提交、活动事务、UNDO 段扩展与环绕视图、SET 运算符、GROUP BY2、3、8、14、16、22、24、25WITH CHECK 语义、复合查询排序、类型组匹配、HAVING 位置连接字符串与服务名13、17tnsnames.ora、服务名、Easy Connect进程与权限5、10PMON 职责、特权分析类型先说一个判断这一簇题在考场上能不能答对取决于你有没有亲手在 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 题延迟段创建也是同一簇。默认情况下堆表和索引在插入第一行数据时才分配 segmentIOT 在本地管理表空间中支持该特性索引从父表继承 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 之后返回 1TRUNCATE 之后返回 0FOR 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 BYSQL 语义的四个高频差异第 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 题考连接解析属于「配置知识」。需要记住的结论是连接字符串不一定包含 SIDEasy 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 题只选了 Dcommit/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 后跟 SELECTSELECT 不开启事务。整个过程不到十秒比逐词翻译题干快得多。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 的判断不是「背出来的答案」而是能复现的行为。从那以后我每次换新环境都会强制走一遍这个流程把每个选项当成一个待验证命题而不是待背的结论。希望帮到你。本文还有配套的精品资源点击获取
返回列表