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 完全够用,图形化安装界面友好,服务管理也直观。如果是生产环境,基本都是 Linux(RHEL/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 和普通报表项目都适用。
第九步"数据库标识符",全局数据库名填orcl,SID 会自动变成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 是实例的标识,比如ORCL;Service Name 是数据库对外提供的服务名,CDB 通常也叫orcl,PDB 则叫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,而不是orcl:
sqlplus scott/tiger@localhost: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 stop,lsnrctl start。
另外,如果客户端是完整 Oracle Client 或 Instant Client,可以通过 tnsnames.ora 配置一个别名,连接时直接用别名。文件位置在$ORACLE_HOME/network/admin/tnsnames.ora(Windows 是%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/tiger@ORCLPDB连接。注意老教程里写的(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.url=jdbc:oracle:thin:@//192.168.1.100:1521/ORCLPDB spring.datasource.username=scott spring.datasource.password=tiger spring.datasource.driver-class-name=oracle.jdbc.OracleDriver一个小提醒:Maven 中央仓库没有官方发布的 ojdbc 驱动,如果你用 Maven 管理依赖,要么手动把 ojdbc jar 安装到本地仓库:
mvn install:install-file -Dfile=D:/ojdbc8.jar -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar要么在 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( user="scott", password="tiger", dsn="192.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 1521(Windows)或ss -lntn | grep 1521(Linux)确认端口处于监听状态。
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-28040
ORA-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_CLIENT=8 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8然后重启监听器。这个配置会降低安全性,生产环境不要轻易用。
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 测试 1521 |
| ORA-01017 | 用户名/密码错误 | ALTER USER 重置密码 |
| ORA-28000 | 账户锁定 | ALTER USER ... ACCOUNT UNLOCK |
| ORA-28040 | 客户端版本过旧 | 升级客户端或调整 ALLOWED_LOGON_VERSION |
| ORA-65096 | 在CDB中建普通用户 | 切换容器到PDB再创建用户 |
4.4 我在这些报错上看到的共性规律
把这么多报错放在一起看,其实能总结出一些规律。第一,绝大多数连接失败不是某个配置多难,而是"版本、服务名、端口、防火墙"这些基础要素里有一个对不上。第二,排查顺序永远是从底层往上层:先确认服务在不在,再确认端口通不通,然后才是服务名和密码对不对。第三,12c 环境里,永远要先确认自己是在 CDB 还是 PDB 里操作,这是 12c 和以前版本最大的区别,也是最多人忽略的点。
提示:如果一台服务器同时有多个 Oracle 实例或多个版本的 Oracle 客户端,环境变量 PATH 和 ORACLE_HOME 很容易互相干扰。执行 sqlplus 之前,先
echo %ORACLE_HOME%(Windows)或echo $ORACLE_HOME(Linux)确认当前环境指向的是不是你想要的数据库。这个原因导致的奇怪报错,我见过的次数比想象中多得多。
最后说一个我自己的习惯:每次装完 12c,不管 Windows 还是 Linux,我都先做三个动作。第一,把防火墙规则或云安全组的 1521 端口放行先配好,免得后面明明装好了却远程连不上;第二,用lsnrctl services看一下 CDB 和 PDB 的服务名到底叫什么,把所有需要连接的服务名记下来,配置连接串就不容易写错;第三,新建业务用户前一定先执行一句ALTER SESSION SET CONTAINER=ORCLPDB;,不然建用户直接变成C##开头,后面连接写服务名都会跟着乱。这三件事看起来小,但几乎每次都能帮人省下一两个小时的排查时间。教程类的文章越写越觉得,真正花时间的都不是安装本身,而是把"怎么连接"想清楚。