Oracle 12c 安装与连接实战:从 CDB/PDB 架构到 ORA 错误排查

📅 发布时间:2026/9/13 15:25:44
Oracle 12c 安装与连接实战:从 CDB/PDB 架构到 ORA 错误排查
Oracle 12c 这套东西放到今天看确实不算新。但它依然是很多企业生产环境里的主力数据库尤其是制造业 ERP、政府项目、金融后台这类对稳定性要求很高的系统12c 的存量相当大。我最近连续帮两个项目搞 12c 的安装和连接一个在 Windows Server 上一个在 Linux 上遇到的问题很典型装的时候各种环境检查不通过装完又是监听器起不来、服务名写错、用户建在错误的容器里……乱七八糟的错误码能把人磨到怀疑人生。所以我把这一整套从下载安装到数据库连接的流程整理出来主要面向第一次装 12c 的开发者和实施人员也包括那些要连数据库做报表、做接口的 Java 后端。这篇文章不画大饼就是一个一个步骤走踩过的坑全写出来。1. 为什么到今天还在聊 Oracle 12C先搞清楚版本与架构1.1 12c 到底特殊在哪严格来说数据库圈里没人会因为新去选 Oracle 12c选它多半是因为两个原因一是业务系统在老库上跑得好好的不需要升级二是市面上最成熟的教程、最丰富的社区问题都是 12c 的企业招人时也默认你懂 12c。所以这不是一篇新技术尝鲜教程而是你大概率会碰到的一套环境的实操笔记。12c 里那个 c 是 Cloud 的意思这是它和 11g 最大的分水岭。11g 时代一个实例就是一个数据库装好之后实例和库的关系是一对一。12c 引入了 CDB 和 PDB 的概念CDB 像一个可以收纳多个业务数据库的容器PDB 就是里面一个个独立的业务数据库。对开发者来说最直观的变化是你登录数据库之后先要搞清楚自己在哪个容器里再执行建用户、建表这些操作否则会碰到一堆以前 11g 不存在的错误。这一点我会在后面连接部分专门讲因为绝大多数人第一次连 12c 连不上就是栽在这里。12c 内部还分 12.1.0.2 和 12.2.0.1 两个主要小版本。12.2 增加了一些云管理、sharding 相关的能力但我可以负责任地说绝大多数项目跑的还是 12.1.0.2也就是 12cR1 的最后一个补丁版。这篇文章的安装步骤和连接配置就以 12.1.0.2 为基准12.2 基本通用。1.2 动手之前先想清楚的四件事安装这种事最怕装到一半发现方向错了。根据我的经验开始前先把下面四个问题定下来后面会省很多事。第一操作系统。如果是自己学习、写写测试代码Windows 完全够用图形化安装界面友好服务管理也直观。如果是生产环境基本都是 LinuxRHEL/CentOS/Oracle Linux操作更麻烦一点但资源占用更可控。这篇文章以 Windows 为主线讲Linux 部分单独提醒差异化内容。第二版本选择。Oracle 12c 没有免费的 Express 版常见选择是企业版Enterprise Edition功能最全教程也是按这个版本写的。标准版在功能上缺不少东西不建议用来学习。如果只是想要个免费轻量的 Oracle 环境可以考虑 Oracle XE 11g 或 Oracle 18c/21c XE但那不在 12c 这个序列里这里不展开。第三字符集。国内系统最常遇到的两个选择是 AL32UTF8 和 ZHS16GBK。新系统无脑选 AL32UTF8它是 Unicode 的完整实现多语言数据都能存ZHS16GBK 更适合要和老系统做数据交换、且老系统就是 GBK 的场景。改字符集非常痛苦所以尽量一次选对。第四硬件。官方说最低 1GB 内存、8GB 磁盘实际体验下来4GB 内存是底线推荐 8GB磁盘至少留 10GB 以上因为安装介质解压、安装过程、后续日志都会吃空间。如果内存只有 2GB安装时 OUI 的预检查很可能会直接报物理内存不足强制安装即便成功了后面跑起来也会频繁卡顿。提示这里说的内存不足不光是物理内存还包括虚拟内存/交换分区。Windows 上建议把虚拟内存设为系统管理的大小Linux 上 swap 至少留 2GB不然 OUI 那关很难过。2. 安装 Oracle 12C从下载介质到建库完成2.1 下载与介质准备Oracle 的下载需要注册官网账号这个没有捷径。下载页面搜 Oracle Database 12c Release 1 或者直接访问 Software Downloads 页面找到 12.1.0.2 对应的平台包。Windows 版本通常分成两个 zip 压缩包名字类似WINDOWS.X64_12102_database_1of2.zip、WINDOWS.X64_12102_database_2of2.zip。两个包必须都下载完整然后解压到同一个目录下比如D:\oracle_install最后会得到一个database文件夹双击里面的setup.exe开始安装。这里有个小坑解压路径不能带中文也不能带空格。很多人习惯建一个 新建文件夹 或者中文目录结果 OUI 在预检查阶段就直接报路径错误。另外下载完一定要确认两个 zip 都解压成功如果只解压了第一个包就开始装OUI 会在复制文件到一半时提示找不到某些组件那时候再回头找缺失的 zip 就非常头大。2.2 安装时的每一步怎么选Windows 版逐屏拆解双击 setup.exe 后如果弹出 UAC 授权框直接点是然后就是安装界面。12c 的 OUI 界面风格偏老气但每一步都有明确含义我按顺序讲一下怎么选、为什么这么选。第一步配置安全更新界面会要求填邮箱勾掉我希望通过 My Oracle Support 接收安全更新直接下一步。这个只是订阅安全公告用的不填不会影响安装。第二步安装选项选第二项创建和配置数据库。有人会选第一项仅安装数据库软件那种方式适合后面自己再用 DBCA 建库对新手来说多一步纯属给自己找麻烦。第三步系统类选服务器类。注意这里的桌面类看着像是给个人用的但它会隐藏很多配置项比如容器数据库选项可能就不出现后面连 PDB 都没法搞。所以虽然只是学习用也建议选服务器类。第四步安装选项选单实例数据库安装这个没悬念。RAC 集群安装只有生产环境多机部署才需要单机学习完全用不上。第五步产品语言把简体中文和英语都勾上后面你想切换语言环境时会方便。第六步数据库版本选企业版。12c 的授权逻辑是企业版功能最全如果有预算购买标准版那是商业决策学习阶段还是企业版最能还原生产环境的体验。第七步安装位置这里会设置 Oracle 基目录和软件位置。默认会在 C 盘建议改到空间充裕的非系统盘比如D:\oracle\product\12.1.0\dbhome_1。路径同样不能有中文。第八步配置类型选一般用途/事务处理。这个选项决定数据库创建后初始化的参数模板选这个最通用OLTP 和普通报表项目都适用。第九步数据库标识符全局数据库名填orclSID 会自动变成orcl。这个命名可以自定义但orcl是约定俗成的选择教程和运维脚本都默认它建议用默认。第十步到第十三步是配置库的参数非常关键勾选创建为容器数据库然后在 PDB 名称里填orclpdb。如果你不勾选数据库就是一个普通单实例没有 PDB 概念12c 的新特性体验不到。我建议勾上。内存设置勾选自动内存管理如果你的服务器内存充足如果内存只有 4GB建议手动把 SGA 限制在 2GB 左右PGA 1GB否则安装时内存检查容易挂。字符集前面提过新系统选 AL32UTF8。示例方案如果希望有hr、scott这些现成的测试账号和表勾选示例方案。管理口令给 SYS、SYSTEM 设置强口令。12c 的安装界面有强制复杂度校验要求至少 8 位同时包含大写字母、小写字母和数字。网上很多老教程写密码设成 oracle在 12c 里根本过不了这关。我测试时习惯用Oracle123456这种。填完这些点击下一步OUI 会进入预检查。预检查最常见的问题是内存不足、磁盘空间不足、某些依赖包缺失。Warning 级别可以忽略继续Error 级别必须处理否则装到一半也会失败。检查通过后安装页面会显示一个响应文件路径建议复制保存到一个安全位置后续如果要批量部署或者复现环境可以用它做静默安装。点击安装之后就是漫长的等待。Windows 上大概要 20 到 60 分钟期间 OUI 会在 Database Configuration Assistant 这一步创建数据库实例这一步最容易出问题如果卡住或者报错看日志是首选日志在%ORACLE_HOME%\cfgtoollogs\dbca目录下文件名带时间戳里面会有具体的 SQL 或 ORA 错误。不过绝大多数情况下按上面的配置走都会顺利通过。2.3 安装完成后的第一轮检查安装完成后别急着关窗口先做三件事。第一看 Windows 服务里是不是多了两个核心服务。一个是OracleServiceORCL这是数据库实例本身另一个是OracleOraDB12Home1TNSListener这是网络监听器。如果实例服务没起来后面所有连接都会失败。第二打开命令提示符输入sqlplus / as sysdba如果能进入 SQL 提示符说明实例是健康的。接着执行show pdbs;如果能看到ORCLPDB并且状态是READ WRITE说明容器数据库也创建成功。如果 PDB 状态是MOUNTED执行一次ALTER PLUGGABLE DATABASE ORCLPDB OPEN;然后重启数据库服务后再确认它是否自动打开。第三执行lsnrctl status查看监听器状态。正常情况下输出里应该能看到orcl、orclpdb这些服务名已经注册到监听器。如果监听器没有注册任何服务远程连接必然报错后面我会专门讲怎么处理。这里要提醒一个日常高频问题服务器重启之后PDB 默认不会自动从 MOUNTED 变成 READ WRITE也就是说实例起来了监听也起了但业务库实际是关着的。这也是为什么很多运维早上到公司发现 ERP 连不上重启一下服务又好了——其实只是 PDB 没开。学会用SELECT name, open_mode FROM v$pdbs;去检查比什么都强。2.4 Linux 环境下的快速提醒Linux 上装 12c 的流程和 Windows 大体一样都是解压后使用runInstaller启动图形安装但有几个关键差异必须用非 root 用户通常专门建一个oracle用户来安装否则 OUI 会拒绝执行。依赖包要先装齐RHEL/CentOS 上常见的包包括binutils、compat-libstdc、gcc、glibc、libaio、libXext、libXtst等能用 yum 一把装就一把装。内核参数和资源限制要调/etc/sysctl.conf里面的内核共享内存kernel.shmmax、信号量kernel.sem等参数以及/etc/security/limits.conf里 oracle 用户的 nofile打开文件数和 nproc进程数限制缺一不可。安装到最后OUI 会提示用 root 用户执行root.sh和orainstRoot.sh两个脚本这一步不能跳过。如果远程用 X11 转发或者图形界面安装不要忘记设置DISPLAY环境变量。这些细节每一项都能单独写一篇文章这里先记个提纲遇到错误时再按关键词搜基本都有解。3. 数据库连接从本机到远程的完整链路3.1 先理解一条 SQL 是怎么连进 Oracle 的连接数据库这件事本质就是在回答一个问题客户端怎么找到服务器上的那个数据库实例。整个过程可以这样理解你的客户端SQL*Plus、PL/SQL Developer、Java 程序是一个电话机先拨号到数据库服务器的 1521 端口这个端口上的监听器Listener是总机接线员它接到通话请求后根据你报出的服务名把电话转接到对应的实例上实例再去访问物理数据库文件。所以一次连接必须提供这些要素主机地址、端口、服务名或 SID、用户名、密码。任何一个不对都会报出不同错误码。这里最容易混的是 SID 和 Service Name。SID 是实例的标识比如ORCLService Name 是数据库对外提供的服务名CDB 通常也叫orclPDB 则叫orclpdb。连接的时候你是靠服务名喊人的尤其是连接 PDB 时必须用 Service Name不能用 SID。这个差异直接决定你能不能连上。3.2 本机连接以及 12c 最坑的 CDB/PDB 用户问题数据库装好后本机验证连接最直接的方式是sqlplus / as sysdba这种写法是操作系统认证不需要密码登录进去后你在 CDB 的根容器里。想用密码方式登录 SYSTEM可以这样sqlplus system/你的密码localhost:1521/orcl然后就是 12c 新手最容易踩的坑很多人在这个界面直接CREATE USER scott IDENTIFIED BY tiger;然后收到ORA-65096: common user or role name must have prefix C##这是 12c 特有的规则你在 CDB 根容器里建用户等于在公共空间建用户名字必须以C##开头比如C##SCOTT。但实际业务系统几乎不会用这种用户名你多半是想在某个业务数据库PDB里建用户。正确姿势是先切换容器再建用户ALTER SESSION SET CONTAINER ORCLPDB; CREATE USER scott IDENTIFIED BY tiger; GRANT CONNECT, RESOURCE TO scott; ALTER USER scott QUOTA UNLIMITED ON USERS;完成后客户端连接 scott 时服务名必须写orclpdb而不是orclsqlplus scott/tigerlocalhost:1521/orclpdb写orcl会报错因为 scott 这个用户并不存在于 CDB 根容器里。这是 12c 连接问题里出现频率最高的一种没有之一。3.3 远程连接监听器、防火墙、tnsnames.ora远程连接比本机多出两个环节网络可达性和监听器注册。网络可达性最常见的坑是防火墙。Windows 服务器上要打开高级安全 Windows 防火墙新建入站规则放行 TCP 1521 端口如果数据库跑在云服务器上还要去云控制台的安全组里放行 1521。很多人的真相是数据库服务正常、监听也正常但客户端一连就超时最后发现是防火墙或安全组没放行。在客户端上验证很简单telnet 192.168.1.100 1521能进入黑屏或提示连接成功说明网络通了超时就是网络问题。监听器注册这块数据库实例需要把自己的服务名报给监听器监听器才知道往哪儿转。用lsnrctl services可以看到当前监听器认识哪些服务名。如果服务名没注册客户端会报 ORA-12514。这时可以在数据库里执行ALTER SYSTEM REGISTER;强制实例向监听器重新注册。如果还不行就在listener.ora里写静态注册重启监听器SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DBNAME ORCLPDB) (ORACLE_HOME D:\oracle\product\12.1.0\dbhome_1) (SID_NAME ORCL) ) )然后lsnrctl stoplsnrctl start。另外如果客户端是完整 Oracle Client 或 Instant Client可以通过 tnsnames.ora 配置一个别名连接时直接用别名。文件位置在$ORACLE_HOME/network/admin/tnsnames.oraWindows 是%ORACLE_HOME%\network\admin\tnsnames.ora内容ORCLPDB (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orclpdb) ) )然后用sqlplus scott/tigerORCLPDB连接。注意老教程里写的(SID ORCL)只适合连 CDB连 PDB 一定要用SERVICE_NAME。3.4 客户端工具连接PL/SQL Developer、Navicat、DBeaver本机直接敲 sqlplus 只能算验证真正干活还是要用图形工具。三个常用工具我分别说一下连接时的关键点。PL/SQL Developer 是 Oracle 开发最常用的工具但它本身不带 Oracle 驱动依赖本机的 OCI 库。你需要先装一个 Instant Client然后在 PL/SQL Developer 里Tools - Preferences - Oracle - Connection把 OCI Library 指向 instantclient 目录下的oci.dll。这里有个特别容易犯的错PL/SQL Developer 如果是 32 位Instant Client 必须也装 32 位如果是 64 位就用 64 位的 Instant Client版本不对会直接报 OCI 加载失败。登录时 Database 栏可以直接填完整地址192.168.1.100:1521/orclpdb也可以填 tnsnames.ora 里配置的别名。Navicat Premium 近几个版本对 Oracle 的支持已经不错。连接窗口里如果填完主机、端口、服务名连不上检查高级标签页里的 OCI 库设置把路径指向 Instant Client 的oci.dll。如果用的是较新版本且自带驱动通常不需要额外配置。DBeaver 是免费开源工具连接 Oracle 相对省心。第一次创建 Oracle 连接时它会提示下载驱动如果网络慢或者下载失败就手动到 Oracle 官方下载ojdbc8.jar然后在驱动编辑界面把 jar 加到库里再测试连接。3.5 Java 后端 JDBC 连接配置后端项目连接 Oracle核心是 JDBC 驱动也就是ojdbc系列的 jar 包。Oracle 12c 建议使用ojdbc7或ojdbc8驱动越新兼容性越好。旧驱动连 12c 大概率会遇到 ORA-28040 认证协议不匹配的问题。连接 URL 有两种写法含义完全不同// SID 方式冒号分隔连 CDB 根容器 jdbc:oracle:thin:192.168.1.100:1521:ORCL // Service Name 方式双斜杠和斜杠连 PDB 业务库 jdbc:oracle:thin://192.168.1.100:1521/ORCLPDB业务用户建在 PDB 里所以后端配置几乎都是第二种写法。网上很多人把这两种格式搞混连接串看起来差不多结果报 ORA-12514 或者 ORA-12505先检查这里。Spring Boot 项目里数据源配置长这样spring.datasource.urljdbc:oracle:thin://192.168.1.100:1521/ORCLPDB spring.datasource.usernamescott spring.datasource.passwordtiger spring.datasource.driver-class-nameoracle.jdbc.OracleDriver一个小提醒Maven 中央仓库没有官方发布的 ojdbc 驱动如果你用 Maven 管理依赖要么手动把 ojdbc jar 安装到本地仓库mvn install:install-file -DfileD:/ojdbc8.jar -DgroupIdcom.oracle -DartifactIdojdbc8 -Dversion12.2.0.1 -Dpackagingjar要么在 pom.xml 里使用com.oracle.database.jdbc:ojdbc8但需要保证你的私有镜像能拉到这个坐标。生产项目最常见的做法还是本地引入 jar 包避免中央仓库不可用的问题。3.6 Python 连接示例Python 连接 Oracle 现在推荐用python-oracledb它是 cx_Oracle 的接班人安装很简单pip install oracledb连接示例import oracledb conn oracledb.connect( userscott, passwordtiger, dsn192.168.1.100:1521/orclpdb ) cursor conn.cursor() cursor.execute(select empno, ename from emp) for row in cursor.fetchall(): print(row) cursor.close() conn.close()python-oracledb 有两种模式thin 模式不依赖本地 Oracle 客户端纯 Python 实现thick 模式则需要 Instant Client。如果你的 Python 环境连不上可以先确认用的是什么模式再决定是否安装 Instant Client 并设置相应环境变量。老项目还在用 cx_Oracle 的接口基本一致把 import 换成import cx_Oracle就行。4. 高频率连接报错与解决方案速查4.1 三个 TNS 报错ORA-12541、ORA-12514、ORA-12170这三个错误是数据库连接失败里出现频率最高的三兄弟但原因完全不同。ORA-12541: TNS:no listener。意思是客户端根本联系不到监听器也就是 1521 端口没人应答。先到数据库服务器上看监听器服务是否启动lsnrctl status如果显示不活动就启动lsnrctl start如果监听器是启动状态但客户端还是报这个错检查防火墙和安全组是否放行 1521。用netstat -ano | findstr 1521Windows或ss -lntn | grep 1521Linux确认端口处于监听状态。ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。监听器是活的但它不知道你请求的服务名。最常见原因是服务名写错了比如你连接的是orcl但业务用户在 PDBorclpdb里。处理办法是在服务器上执行lsnrctl services看看监听器实际注册了哪些服务名然后用正确的名字连接。服务名正确还是报错就执行ALTER SYSTEM REGISTER;强制重新注册一次。ORA-12170: TNS:Connect timeout occurred。这个一般是网络层问题TCP 连接根本建立不了。优先做连通性测试telnet 192.168.1.100 1521如果超时重点检查防火墙、安全组、路由或者尝试把客户端的连接超时参数调大。不要一上来就怀疑数据库配置网络不通再调数据库都白搭。4.2 认证类报错ORA-01017、ORA-28000、ORA-28040ORA-01017: invalid username/password; logon denied。用户名或密码错误。12c 的密码默认区分大小写不要被输密码看不出大小写误导。如果确认密码就是对的还连不上可以到服务器上用系统认证登录后重置密码sqlplus / as sysdba ALTER USER scott IDENTIFIED BY NewPass123;ORA-28000: the account is locked。账户被锁定了。多次输错密码会触发自动锁定安装示例用户默认也是锁定状态。解锁ALTER USER scott ACCOUNT UNLOCK;如果想改掉锁定策略可以调整PROFILE里的FAILED_LOGIN_ATTEMPTS但生产环境建议保留锁定策略防暴力破解。ORA-28040: No matching authentication protocol。客户端和服务器之间的认证协议版本对不上通常是客户端太老。最稳妥的办法是升级客户端到支持 12c 的版本。测试环境可以临时在服务器 sqlnet.ora 中放宽SQLNET.ALLOWED_LOGON_VERSION_CLIENT8 SQLNET.ALLOWED_LOGON_VERSION_SERVER8然后重启监听器。这个配置会降低安全性生产环境不要轻易用。4.3 ERP 报表报数据库连接失败的排查思路像启动易飞 ERP 时显示报表数据库连接失败这类场景业务系统只会给一句模糊的提示没有具体 ORA 错误码反而更考验排查思路。我的习惯是分四步走。第一步确认数据库本身活着。登录数据库服务器执行sqlplus / as sysdba再看 PDB 状态SELECT name, open_mode FROM v$pdbs;如果 PDB 是 MOUNTED业务库其实就是关着的先打开再说。这一步能解决大量早上来连不上的问题。第二步确认 ERP 的数据库连接配置没改过。很多项目在做数据库迁移、IP 调整后应用配置还指向旧地址报错自然就是模糊的数据库连接失败。找到配置文件里的数据库连接串拆成主机、端口、服务名、用户名、密码逐项核对。第三步用最小化连接测试定位问题。在 ERP 服务器上用 sqlplus、telnet 等工具分别测试服务器 IP 通不通、1521 通不通、指定服务名能不能连、用户名密码能不能过。哪一步挂了就处理哪一步。第四步考虑连接池满。如果数据库本身是好的但应用只是偶尔报连接失败很可能是数据库连接数达到上限或者连接池自身配置太小。这时可以查SELECT COUNT(*) FROM v$session;看看会话数是否接近上限或者检查应用连接池配置。连接数打满在低配置服务器上非常常见只是很多人第一时间想不到。为了方便你直接截图或者打印我整理了一张报错速查表ORA 错误码可能原因优先处理ORA-12541监听器未启动/防火墙拦截lsnrctl start放行1521端口ORA-12514服务名写错/监听未注册lsnrctl services 查看真实服务名ORA-12170网络不通/防火墙丢包telnet 测试 1521ORA-01017用户名/密码错误ALTER USER 重置密码ORA-28000账户锁定ALTER USER ... ACCOUNT UNLOCKORA-28040客户端版本过旧升级客户端或调整 ALLOWED_LOGON_VERSIONORA-65096在CDB中建普通用户切换容器到PDB再创建用户4.4 我在这些报错上看到的共性规律把这么多报错放在一起看其实能总结出一些规律。第一绝大多数连接失败不是某个配置多难而是版本、服务名、端口、防火墙这些基础要素里有一个对不上。第二排查顺序永远是从底层往上层先确认服务在不在再确认端口通不通然后才是服务名和密码对不对。第三12c 环境里永远要先确认自己是在 CDB 还是 PDB 里操作这是 12c 和以前版本最大的区别也是最多人忽略的点。提示如果一台服务器同时有多个 Oracle 实例或多个版本的 Oracle 客户端环境变量 PATH 和 ORACLE_HOME 很容易互相干扰。执行 sqlplus 之前先echo %ORACLE_HOME%Windows或echo $ORACLE_HOMELinux确认当前环境指向的是不是你想要的数据库。这个原因导致的奇怪报错我见过的次数比想象中多得多。最后说一个我自己的习惯每次装完 12c不管 Windows 还是 Linux我都先做三个动作。第一把防火墙规则或云安全组的 1521 端口放行先配好免得后面明明装好了却远程连不上第二用lsnrctl services看一下 CDB 和 PDB 的服务名到底叫什么把所有需要连接的服务名记下来配置连接串就不容易写错第三新建业务用户前一定先执行一句ALTER SESSION SET CONTAINERORCLPDB;不然建用户直接变成C##开头后面连接写服务名都会跟着乱。这三件事看起来小但几乎每次都能帮人省下一两个小时的排查时间。教程类的文章越写越觉得真正花时间的都不是安装本身而是把怎么连接想清楚。