
简介Oracle 19c考试原题PDF资料第二部分面向认证备考者与数据库管理员聚焦多租户架构下核心考点容器数据库与可插拔数据库的基本概念、应用PDB的创建与同步、PDB在不同CDB之间的近零停机迁移以及PDB快照的完整与稀疏副本特性。资料以一道道带正确答案的选择题呈现帮助读者熟悉真实考题形式与解题思路同时加深对相关参数和前提条件的理解。资源包含1个PDF文档压缩包约350KB已有327人学习轻量便携适合碎片时间研读。除多租户专题外内容还涉及RMAN备份、AWR快照等其他高频考点每道题后附有简要知识点归纳。仔细研读这些原题读者能进一步理解归档模式、本地回滚模式、稀疏副本等概念的实际应用为Oracle 19c认证考试或日常运维排错积累宝贵经验由于题目附有正确答案也适合自测掌握程度知识点归纳则能帮助查漏补缺。1. 为什么这份Oracle 19c原题资料值得花时间读透从背题到会做题Oracle 19c原题资料PDF第二部分不是一本让你背完就去考试的题典而是一份帮你把数据库知识从“知道”变成“会用”的路线图。我在备考OCP时接触过同类资料的第一部分当时只记住了答案到了第二部分才开始真正理解为什么监听器会起不来、为什么一张表会锁死、为什么SGA配置错了性能掉一半。这份资料适合两类人——打算考Oracle 19c认证的以及已经在维护19c实例但想补盲区的DBA。我会沿着“资料怎么看→环境怎么搭→题怎么做→坑怎么避”的顺序把第二部分的用法拆给你看。2. 先把Oracle 19c认证体系摸清OCP与OCA的考证路线怎么选2.1 19c原题资料第二部分的定位它补了第一部分的哪些短板第一部分的题目大多在考“你知道什么”比如某个视图的名称、某个参数的默认值第二部分的题目则集中在“你会不会处理”比如给你一段坏掉的归档日志让你判断原因或者让你在命令行里完成一次表空间扩容。这两者的学习方式完全不同。背答案对第一部分有效对第二部分基本无效——考官会把场景微调一下答案就变了。我一般把第二部分当成“动手能力清单”来用每道题背后对应一个操作。比如一道关于UNDO表空间不足的题对应的是ALTER TABLESPACE里AUTOEXTEND的调整一道关于监听注册的题对应的是lsnrctl status的输出解读。学习时先把题做一遍再照着题目去虚拟机里复现最后把操作步骤整理成自己的笔记这样资料才真正内化成能力。这里我放一个简单的对比表帮助你判断自己该把重点放在哪部分维度第一部分多为概念记忆第二部分多为场景与操作典型题型参数默认值、视图名称、语法判断故障处理、配置操作、性能调优适合备考阶段刚接触19c、先建立知识框架有基础、准备考试冲刺或真正运维学习方式读文档背要点搭实验环境复现场景对动手能力的要求低高如果你已经能独立装一遍19c、会看alert日志那么第二部分就是你的主战场如果连sqlplus / as sysdba都还没跑通建议先把重点放在安装和基础操作上之后再回头刷第二部分否则做题会很受挫。2.2 用官方文档和题库对照着学一份可复现的备考环境搭建第二部分里的很多题目都跟着一个前提你得有一套能随时复现实验的Oracle环境。常见做法是租一台普通云主机或者用本机虚拟机装Linux然后再装19c。我不建议直接拿生产库练手——生产环境的数据和参数不能被随意改动而在测试环境里你可以随便折腾试错了有后悔药吃。搭建环境时我会按这个顺序走先准备一台至少2核4GB内存、40GB磁盘的虚拟机我试过在openeuler和RHEL 9上装19cRHEL系兼容性更好一些再把官方安装包解压到/u01/app/oracle路径下然后跑runInstaller做静默安装或图形安装最后用DBCA建一个非CDB或CDB/PDB结构的实例。整个过程在下一章会给详细命令。环境搭完以后我会把第二部分里的每道题按“考点→操作命令→预期输出”三条线做索引。例如一道考“查看当前会话SID”的题对应命令SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME SCOTT;一道考“12c删除不干净留下残留”的题对应rm -rf前必须先停掉所有进程并用ps -ef | grep ora_确认没有活着的进程。这样整理成一张表刷题时直接对照效率会高很多。2.3 刷题前必须搞懂的10个高频考点汇总常见19c原题和这些年数据库运维里的高频踩坑点第二部分的考点高度集中在以下10个方向。这10个点你如果都能在环境里亲手做一遍后面刷题会顺手很多Linux下19c的安装与卸载尤其是依赖包和oracle用户的环境变量。单实例搭建DG涉及LOG_ARCHIVE_CONFIG、DG_BROKER_START等参数。分页查询19c以前的ROWNUM写法与12c后的OFFSET FETCH写法。SQL函数TRUNC、TO_DATE、TO_CHAR的边界行为。存储过程的创建、编译与异常处理。变长数组VARRAY与嵌套表的使用。表空间与用户的创建DBA_TABLESPACES视图的解读。RAC环境里CRS相关命令如crsctl、srvctl的使用。监听器无法启动或连接缓慢的排查。查看会话、锁和等待事件对应GV$SESSION和V$LOCK。我不建议把这10个点分别去找教程而是建议以原题资料里的题目为入口做到“一题一实验”。比如资料里出现一道监听起不来的题你就去虚拟机里手动改坏listener.ora再启动观察报错出现一道DG搭建题你就按文档配一个单实例DG出来。做题不是目的通过题目把每个操作练到条件反射才是目的。3. 把原题变成动手实验在Linux上搭建19c单实例的完整步骤3.1 用VirtualBox开一台RHEL 9虚拟机最小硬件配置与系统准备很多原题里的场景题一上来就是“某Linux服务器上Oracle监听失败”所以要做的第一件事是准备一台能够随时重置的实验机。我一般用VirtualBox装RHEL 9或openeuler都行。最小配置建议2核CPU、4GB内存、40GB磁盘如果内存不够Swap补到4GB否则DBCA建库很容易在中途被OOM杀掉。系统装好后需要先解决两个问题一是关闭防火墙或用firewall-cmd放行1521端口二是修改/etc/hosts把主机名解析写死避免Oracle注册监听时走DNS导致注册延迟。步骤可以这样# 关闭防火墙实验环境用生产不要这么干 systemctl stop firewalld systemctl disable firewalld # 编辑/etc/hosts加入一行 # 192.168.56.101 oracledb.localdomain oracledb echo 192.168.56.101 oracledb.localdomain oracledb /etc/hosts # 给oracle用户加内核参数写入/etc/sysctl.d/99-oracle.conf cat /etc/sysctl.d/99-oracle.conf EOF fs.file-max 6815744 kernel.semmsl 250 kernel.semmns 32000 kernel.shmall 1073741824 kernel.shmmax 4398046511104 net.ipv4.ip_local_port_range 9000 65500 net.core.rmem_default 262144 net.core.rmem_max 4194304 net.core.wmem_default 262144 net.core.wmem_max 1048576 EOF sysctl -p /etc/sysctl.d/99-oracle.conf这段脚本里最容易被忽略的是kernel.shmall和net.ipv4.ip_local_port_range。共享内存段设小了SGA申请不够会导致实例启动失败端口范围不够宽监听器和RAC的心跳可能因为端口不够时而报错。如果你在openeuler上装注意sysctl -p之后用sysctl kernel.shmall确认值真的生效有的系统会因为/etc/sysctl.conf里有重复键而覆盖掉你的设置这是安装时最常见的玄学问题之一。3.2 安装Oracle 19c数据库从解压到DBCA建库的完整命令环境准备好以后安装就变成一套固定的流水线了。以一个oracle用户、解压路径/u01/app/oracle/product/19c/dbhome_1为例常见的做法是直接跑图形安装器但如果你在一台只有命令行的服务器上静默安装更实用# 在oracle用户下执行silent模式指定所有关键参数 ./runInstaller -silent -ignorePrereqFailure \ -oracleBase /u01/app/oracle \ -oracleHome /u01/app/oracle/product/19c/dbhome_1 \ -installEdition EE \ -UNIX_GROUP_NAME oinstall \ -INVENTORY_LOCATION /u01/app/oraInventory # 安装完成后执行root脚本 # 以root用户运行 /u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/19c/dbhome_1/root.sh # 用oracle用户执行DBCA建库 dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -sid ORCL19C \ -createAsContainerDatabase false \ -datafileDestination /u01/app/oracle/oradata \ -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \ -totalMemory 2400 \ -characterSet AL32UTF8 \ -sysPassword Oracle123 \ -systemPassword Oracle123注意-createAsContainerDatabase false表示建一个非CDB实例备考阶段我更推荐这么做。很多原题还停留在非CDB时代的写法比如ALTER SYSTEM SET db_create_file_dest这类参数在CDB里行为会有差异非CDB能让你少踩一个版本坑。totalMemory我习惯给到2400MB这是SGAPGA的合计值设太高会跟别的进程抢内存characterSet选AL32UTF8避免中文插入时出现字符集问题。建库完成后要立刻做一个验证动作用sqlplus / as sysdba登录并检查v$instance和v$database确认OPEN_MODE为READ WRITE。如果这里出现ORA-01034: ORACLE not available多半是环境变量ORACLE_SID没设置好或者/etc/oratab里的条目不对。常见做法是把export ORACLE_SIDORCL19C写进~/.bash_profile里并重新source一下问题就能解决。3.3 用原题里的知识点验证安装表空间、用户、监听三件套装完数据库不等于完成原题里的考点。接下来用三个高频操作把环境“验收”一遍顺便也就把第二部分的常见题练了-- 1. 创建表空间和用户原题出现率极高 CREATE TABLESPACE tbs_demo DATAFILE /u01/app/oracle/oradata/tbs_demo01.dbf SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1G; CREATE USER scott IDENTIFIED BY tiger DEFAULT TABLESPACE tbs_demo QUOTA UNLIMITED ON tbs_demo; GRANT CONNECT, RESOURCE TO scott; -- 2. 验证数据文件状态 SELECT tablespace_name, status, contents FROM dba_tablespaces WHERE tablespace_name TBS_DEMO; -- 3. 验证监听与实例注册在shell里执行 lsnrctl statusAUTOEXTEND ON NEXT 10M这句很关键原题里常考“表空间满了怎么办”答ALTER DATABASE DATAFILE ... AUTOEXTEND ON是标准做法但你得知道AUTOEXTEND只在数据文件为ONLINE状态时生效表空间被OFFLINE后即使开启自动扩展写入也会报ORA-00376。这些细节在第二部分里反复出现很多背题的人只记住了“要开AUTOEXTEND”却没记住前提条件考试时一改场景就会翻车。lsnrctl status输出里要重点看两行一行是Service ORCL19C has 1 instance(s)表示实例已经注册到监听另一行是Listening Endpoint Summary里的(ADDRESS(PROTOCOLtcp)(HOST...)(PORT1521))。如果只看到监听在跑但没有Service说明实例注册失败常见原因是主机名解析不对改好/etc/hosts后重启监听即可。这一步做通了后面刷原题里所有关于“监听服务无法启动”的题你就有了直接的排错手感。4. 把原题里的SQL和存储过程拆开练函数、分页与日期处理的常见坑4.1 原题串讲SQL高频函数TRUNC与TO_DATE的边界第二部分里有一类题专门考日期和字符串的转换看起来很简单实际翻车率很高。最典型的是TRUNC(SYSDATE)和TO_DATE的组合。原题经常问给定一个字符串2025-03-15 14:30:00要求把它按天截断、按小时截断然后比较两个日期是否相等。-- 常见写法把字符串先转成DATE再TRUNC SELECT TRUNC(TO_DATE(2025-03-15 14:30:00, YYYY-MM-DD HH24:MI:SS), DD) AS day_part, TRUNC(TO_DATE(2025-03-15 14:30:00, YYYY-MM-DD HH24:MI:SS), HH) AS hour_part FROM dual; -- 踩坑写法直接用TRUNC截字符串会隐式转换失败或得到奇怪结果 SELECT TRUNC(2025-03-15 14:30:00) FROM dual;TRUNC的第二个参数HH表示截到小时结果会把分钟和秒清零DD表示截到当天零点。注意TRUNC不会做时区转换如果你的会话时区和数据库时区不一致同一个SYSDATE在不同会话里截出来的结果可能差一天。oracle中的truncsysdate这个关键词被很多学员反复搜说明这个点确实是盲区。还有一个跟“过滤不可转为数字的字符串”相关的题也很常见在19c里可以用VALIDATE_CONVERSION函数来判断-- 判断字符串能否转为数字避免TO_NUMBER报错 SELECT VALIDATE_CONVERSION(123abc AS NUMBER) AS can_convert FROM dual; -- 返回0 SELECT VALIDATE_CONVERSION(123 AS NUMBER) AS can_convert FROM dual; -- 返回1原题里如果出现“某个列混着数字和字母过滤掉非数字的”用WHERE VALIDATE_CONVERSION(col AS NUMBER) 1最直接。老版本只能自己写正则或CASE WHEN包裹麻烦且容易漏边界所以这个函数在新环境里值得养成使用习惯。4.2 存储过程与变长数组原题里出现率最高的PL/SQL题怎么破第二部分涉及的PL/SQL题目通常不是让你写一个完整业务包而是考你对编译状态、异常传播和集合类型的理解。oracle存储过程和oracle变长数组都是搜索高频词说明这两个点确实是常见卡壳处。下面这条存储过程覆盖了三个高频考点VARRAY的使用、FORALL批量绑定、EXCEPTION WHEN OTHERS的处理CREATE OR REPLACE TYPE num_list AS VARRAY(10) OF NUMBER; / CREATE OR REPLACE PROCEDURE proc_test_bulk(v_nums IN num_list) IS v_total NUMBER : 0; bad_data EXCEPTION; PRAGMA EXCEPTION_INIT(bad_data, -20001); BEGIN FORALL i IN 1..v_nums.COUNT INSERT INTO t_demo(num_val) VALUES (v_nums(i)); v_total : v_nums.COUNT; IF v_total 0 THEN RAISE bad_data; END IF; COMMIT; EXCEPTION WHEN bad_data THEN DBMS_OUTPUT.PUT_LINE(传入数组为空或无效); WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE(SQLERRM); END proc_test_bulk; /FORALL是批量DML比FOR循环逐条执行快得多但注意FORALL遇到异常时不会自动回滚已经处理的批次所以EXCEPTION里必须手动ROLLBACK。VARRAY的COUNT属性返回当前已填充的元素个数不是容量上限很多人把这两个搞混导致越界访问报ORA-06533。PRAGMA EXCEPTION_INIT的作用是把自定义异常绑定到一个负的Oracle错误码这样你可以在存储过程内部主动抛出业务错误而不必依赖外部的RAISE_APPLICATION_ERROR。原题里考“包状态被丢弃”的也很多现象是调用存储过程时突然报ORA-04068: existing state of packages has been discarded。原因通常是包里的全局变量或游标状态因为某次DDL失效被重置。解决方法是不要在包里保存需要跨调用维持的会话状态需要缓存就写到全局临时表或用CREATE CONTEXT管理。这个问题在12c到19c里一直有属于经典坑。4.3 原题里那些“看起来简单但总翻车”的查询分页与排序分页查询也是第二部分的高频题。Oracle 12c以后的OFFSET FETCH写法简洁但很多原题还会用19c的兼容性来考你不同的写法是否等价。常见的分页方式有三种ROWNUM、OFFSET FETCH、ROW_NUMBER() OVER()。它们的行为在“分页过程中数据发生变化”时结果会不一样。-- 方式一ROWNUM分页老写法12c前只能用这个 SELECT * FROM ( SELECT a.*, ROWNUM rn FROM ( SELECT emp_id, sal FROM t_emp ORDER BY sal DESC ) a WHERE ROWNUM 20 ) WHERE rn 11; -- 方式二OFFSET FETCH12c后19c推荐 SELECT emp_id, sal FROM t_emp ORDER BY sal DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY; -- 方式三ROW_NUMBER窗口函数灵活但需要关注排序字段唯一性 SELECT * FROM ( SELECT emp_id, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) rn FROM t_emp ) WHERE rn BETWEEN 11 AND 20;ORDER BY sal DESC在sal有重复值的情况下会不稳定三套写法翻出来的第11~20条可能不是同一批数据。原题如果想考这个点通常会在表里故意放两个相同的值观察你是否有意识补上第二排序键ORDER BY sal DESC, emp_id。所以我的经验是把唯一列加进去否则“分页数据重复/缺失”的问题就会出现在你面前。OFFSET FETCH其实是19c里最推荐的分页写法它内部就是改写成ROW_NUMBER()的方式实现的但注意OFFSET值过大会导致扫描全部数据性能上并不友好如果要分页到很后面仍然建议先用WHERE条件缩小范围再用分页语句取数据。这个点在原题的场景题里常以“某分页SQL查询越来越慢”的形式出现。5. 避坑指南刷Oracle 19c原题时最容易踩的5个坑5.1 坑一对答案只记结论不记版本差异现象刷了一道“查看当前会话SID”的题答案里写的是SELECT SID FROM V$SESSION;你记住了考试时改成“查看所有实例的会话”你还在用V$SESSION结果答案错误。原因V$SESSION在单实例下够用但在RAC环境下需要GV$SESSION才能看到所有实例的会话。原题资料往往只写某一版本下的结论第二部分的题干里会特意加上RAC、CDB等前缀答案就变了。解决做题时先圈定题干里的环境词单实例、RAC、CDB、PDB、非CDB这五个词决定你去查V$还是GV$视图。看到RAC优先用GV$SESSION、GV$LOCK看到容器库优先用V$CONTAINERS。建议在笔记里给每个视图标注适用的环境不要只记结论。5.2 坑二忽略参数文件与SGA设置对考题的影响现象原题里有一个“数据库启动到nomount后卡住”的场景你按常见排查顺序检查了监听、网络、磁盘空间都没发现问题最后发现是SGA_TARGET设得比物理内存还大实例根本起不来。原因很多题目的现象一样但根因不同。ORA-00845内存不足和ORA-01034实例不可用会被一些备考资料混在一起只给结论不给前提。解决自己动手把init.ora里的参数改小再启动观察报错变化再把SGA_TARGET故意改大复现一次ORA-00845。这样每个报错对应什么参数你就有了体感。做题时如果看到“nomount阶段失败”先把v$parameter和/etc/fstab的共享内存大小对一遍再往下分析。5.3 坑三把试题环境当成生产环境来学现象照着原题里的命令在测试机上一口气执行发现DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES;把数据文件删了以为弄坏了环境心里发慌。原因测试环境本来就是为了让你试错原题里的危险命令在真实生产里绝不能直接抄但新手往往分不清哪些命令只能跑在测试环境。解决在虚拟机里做任何破坏性操作前先打一个快照或者用Data Pump导一份备份出来。把原题里所有DROP、DELETE、TRUNCATE命令集中到一个“仅测试可用”清单里做实验时只在对应虚拟机里执行。这样既练了操作也保住了长期测试数据相当于给自己留了后悔药。5.4 坑四数据库装到一半报错就放弃现象openeuler或RHEL上装19c跑到root.sh时报ORA-12547: TNS lost contact立刻觉得是资料不靠谱准备换系统重来。原因ORA-12547往往不是Oracle核心进程的问题而是oracle用户对$ORACLE_HOME/bin/oracle这个可执行文件缺少权限或者$ORACLE_HOME目录属主不对。很多人一到这个报错就想重装系统其实是权限问题。解决不要急着重装先ls -l $ORACLE_HOME/bin/oracle看属主和权限确认是oracle:oinstall且权限为6751如果不是用chown oracle:oinstall和chmod 6751修正。然后重新执行root.sh大部分情况都能继续。以后遇到这类问题先查权限和环境变量再考虑重装能省下很多时间。5.5 坑五不验证答案靠记忆硬背现象原题里说“存储过程编译报PLS-00103时加AS声明变量”你背下来了考试时换成一个函数报错相同你却不知道函数里要用RETURN子句只能干瞪眼。原因PLS-00103的实质是语法解析器在某个位置遇到了意料之外的标记表示声明部分有语法错误。背答案是记不住语法规则的。解决拿到一道题先在自己环境里故意写出错误版本触发同一个报错再看错误信息在哪个字符附近然后对照正确写法理解差异。通过这种“报错驱动”练习把每个常见错误码变成你亲手踩过的一个坑而不是纸面上的一个结论。我一般会给自己定一个规矩原题里任何一句SQL都要在SQL*Plus里跑一遍跑不通的就记到“待验证清单”里绝不直接背答案。6. 把原题资料变成自己的知识库一套可复用的做笔记与复盘方法6.1 按考点分类整理原题把PDF拆成一套可检索的笔记体系第二部分资料通常是PDF我看完后不会只做批注而是会把每个知识点拆成一个独立Markdown笔记按“安装管理、SQL、PL/SQL、备份恢复、性能调优”五个文件夹归档。每道题记录四行题干关键信息、我用到的命令、报错现象、解决办法。例如“数据文件损坏”相关题目我会记录ALTER DATABASE DATAFILE ... OFFLINE DROP;以及恢复的步骤“表空间不足”则记录扩容和AUTOEXTEND的边界。这套笔记的用途不是考试前翻一遍而是平时遇到问题就打开检索相当于给自己攒了一份可检索的经验库。6.2 用SQL*Plus和Data Pump做实验验证原题答案的正确性检验原题资料里有些答案可能因为版本差异而不再适用我会用SQLPlus和Data Pump做两组验证。SQLPlus主要用于验证SQL和PL/SQL的写法是否正确Data Pump用于验证与数据迁移相关的原题比如“导出某个用户的所有表”。# 导出前先创建目录并授权再用expdp导出scott用户的表 mkdir -p /u01/app/oracle/dp_dir chown oracle:oinstall /u01/app/oracle/dp_dir sqlplus / as sysdba EOF CREATE DIRECTORY dp_dir AS /u01/app/oracle/dp_dir; GRANT READ, WRITE ON DIRECTORY dp_dir TO scott; EOF expdp scott/tigerORCL19C DIRECTORYdp_dir DUMPFILEscott_backup.dmp LOGFILEexp_scott.log SCHEMASscott导出前先创建DIRECTORY对象并授权给用户这一步本身也是一个考点。如果原题说“只有DBA才能用expdp导出”你在测试环境里用普通用户试一次就会发现其实只要有EXP_FULL_DATABASE角色或指定目录的读写权限就可以。这种验证带来的理解深度远高于直接背答案。6.3 从刷题到上手的最后一步把原题改造成自己的测试脚本我的最后一个习惯是每学完一类考点就把它改造成一段可复用的SQL或Shell脚本存进~/oracle_lab目录。比如把“查看当前系统里所有用户和默认表空间”写成一条带格式的SQL脚本下次遇到任何环境都能直接跑SET PAGESIZE 100 COL username FOR A20 COL default_tablespace FOR A20 SELECT username, default_tablespace, account_status FROM dba_users ORDER BY username;这样做的好处是你不再需要依赖资料里的现成答案随时能用一条命令回答自己“当前环境是什么状态”。把刷题最后变成写脚本是让原题资料从“一本书”变成“一套工具”的关键一步。这些脚本积累一年以后基本就是一份带着自己踩坑记录的微型运维手册价值远超资料本身。希望这些做法和踩过的坑能帮到你让你在Oracle 19c这条路上少走点弯路。本文还有配套的精品资源点击获取