装Oracle数据库这件事,坑从来不在安装本身,而在装完之后连不上。我见过太多人,数据库装了大半天,到最后一步测试连接的时候弹个ORA-12514或者“0 notconnect”,整个人直接懵掉。这篇教程就是围绕Oracle 12C的安装和数据库连接这两个核心主题展开的,不绕弯子,从选版本、跑安装向导,到配监听、写连接串,再到最让人头疼的连接报错排查,一步不落全给你梳理清楚。无论你是刚接触Oracle的学生,还是被公司安排部署环境的运维新人,或者是Java后端接到了Oracle却连不通的开发者,这篇文章都值得你按顺序读一遍。
我写这篇东西的底气,主要来自过去几年里反反复复装Oracle的经历——Windows上装过,Linux上装过,虚拟机里也折腾过;有一次客户现场部署,他们自己的DBA休假,我硬是靠一套排查思路把“启动易飞ERP时显示报表数据库连接失败”的问题给定位到了监听器配置上。所以这篇文章里不会有太多教科书式的废话,全是实际动手后留下的东西。
1. 装之前先想明白:选对版本和解压姿势
1.1 为什么很多人失败在第一步:版本混淆
Oracle 12C这个叫法,网上传得乱七八糟,实际指两代东西:12.1.0.2(也就是常说的12c R1)和12.2.0.1(12c R2)。对于大多数人来说,选12.1.0.2就够了,原因很简单:它发布时间早,网上能搜到的资料、遇到的坑、对应的补丁包都更齐全;12.2.0.1在一些老牌ERP系统里反而不受待见,因为这类系统往往对数据库版本有严格认证列表,不在列表里,厂商不给你提供技术支持的。
下载的时候还会遇到一个选择:是下载带安装包的完整版,还是只下客户端,又或者是只下“Grid Infrastructure”。这里要说明白,如果你只是在单机上装一个数据库给自己用,那就找“Oracle Database 12c Release 1 (12.1.0.2.0) for Microsoft Windows x64”这种完整安装包;如果你是要搭RAC集群,才需要另外下载Grid Infrastructure。别把两者搞混,更不要为了省空间去下载那种被精简过的“绿色版”,这类版本常常缺组件,装到一半就报错,后面排查起来反而更浪费时间。
1.2 安装前的系统环境检查
Oracle的安装向导本身对系统环境有检测,但等到它检测就晚了,最好自己先过一遍。
Windows系统上建议满足以下底线条件:
- 操作系统建议Windows Server 2012 R2或Windows 10 x64,个人学习用Win10/11也没问题
- 内存至少4GB,Oracle 12C装完随便开个实例就吃2GB左右,虚拟机里只给2GB内存的话,安装界面会卡到怀疑人生
- 磁盘空闲空间至少10GB,这还不算你后面建库、建表空间、导数据需要的空间
- 主机名不要带下划线,不要用中文
Linux平台上则要注意内核参数,最常见的是共享内存和信号量相关参数。如果你把Oracle装在一台CentOS 7上,安装前通常要改/etc/sysctl.conf里的kernel.shmall、kernel.shmmax、fs.file-max、net.ipv4.ip_local_port_range等值,还要创建oracle用户和oinstall、dba用户组。很多人跳过了这些准备步骤直接开装,结果到“link binaries”环节报错,回头再补参数又得重新跑一遍安装,纯属浪费生命。
提示:Windows上安装相对省心,但如果你在Linux上装,记得在安装前执行一次
/etc/security/limits.conf里的 nofile、nproc 配置修改,并确保关闭SELinux或设置为permissive,否则后面监听器起不来时会让你抓狂。
1.3 Windows下Oracle 12C的下载与解压注意事项
从Oracle官网下载的两个zip包,很多人不知道要把它们解压到同一个目录下。这两个包分别叫V17530-01_1of2.zip和V17530-01_2of2.zip,如果分成两个文件夹解压,安装向导会提示找不到组件。正确的做法是:先建一个干净目录,比如D:\oracle_setup,把两个zip都放进去,然后右键第一个包选择“解压到当前文件夹”,再对第二个包执行同样的操作,让它把内容合并到同一个目录里。解压完成后,目录下会有一个setup.exe,接下来就可以启动安装了。
另外,解压路径不要有中文和空格,否则安装程序启动时可能报Exception in thread "main" java.lang.UnsatisfiedLinkError。这种错误跟Java环境有关,Oracle的安装向导内置了JRE,按理说不需要你额外装Java,但路径问题确实会触发诡异的异常。我建议统一用类似D:\database\12c这样的纯英文路径。
2. 从下载到建库:12C安装的完整执行步骤
2.1 图形化安装向导里的选项到底该怎么选
双击setup.exe后,向导会一路问你几个问题,我拆开来说每个选项实际是干嘛的。
第一个界面是“配置安全更新”,默认让你填邮箱和口令。这里直接取消勾选“我希望通过My Oracle Support接收安全更新”,下面那个“我希望接收安全通知”也取消,然后点下一步。如果不取消,向导可能会卡在联网检查上,尤其是内网环境,半天过不去。
接着是“下载软件更新”,选“跳过软件更新”。这一项会去检查Oracle官网的补丁,对于新手来说没必要,而且网络不好时还容易假死。
最关键的一步来了:“安装选项”选“创建和配置数据库”,不要选“仅安装数据库软件”。很多教程推荐只装软件、后面用DBCA建库,但对大多数场景来说,向导直接帮你建一个数据库实例最省事。如果你对参数有自己的想法,比如内存分配、表空间路径、字符集要自定义,可以在向导里改;如果只是想让Oracle跑起来,默认配置就够用了。
“数据库安装类型”里,选“典型安装”和“高级安装”的区别在于:典型安装只需要你指定Oracle基目录、数据库版本(企业版/标准版)、全局数据库名和管理员口令;高级安装则多了字符集选择、内存分配策略、示例方案、启用OLAP/分区等选项。第一次装的话选典型安装即可,但要注意一点——典型安装默认字符集是AL32UTF8,这在国内环境基本够用。如果是给老系统装,系统要求ZHS16GBK,那必须走高级安装自己改字符集。
“Oracle基目录”和“软件位置”默认会选到C盘,我建议改成其他盘,比如D:\app\oracle。原因很简单,Oracle的安装目录随着补丁、日志、数据文件的增加,体积会膨胀得非常快,装在C盘容易把系统盘塞满。注意基目录和软件位置不能是同一个路径,Oracle会自动在基目录下创建product\12.1.0\dbhome_1这样的软件目录结构。
2.2 关键配置页面与口令规则
接下来是“配置清单”界面,它会自动检查系统环境,比如内存、页面文件、临时磁盘空间、PATH环境变量等。如果哪一项是不符合要求的,界面上会出现警告或错误。警告可以忽略,错误就必须解决。常见的错误是物理内存检查失败,但你的内存明明够大,这多半是Windows的页面文件设置成了“无”导致的,把虚拟内存调出来就能过检查。
然后是设置管理口令。Oracle 12C对sys和system用户的口令要求很明确:必须包含大写字母、小写字母和数字,长度不少于8位,不能包含用户名。密码复杂度规则在这里是强制的。你可能会觉得烦,但请记住,这是Oracle的安全底线,不要嫌麻烦就设一个“123456”,到时候建库成功却发现怎么都连不上,因为密码策略不满足,你会更麻烦。
安装向导最后会汇总所有配置,点“安装”就开始复制文件并链接二进制了。这一步耗时大约10到20分钟,取决于机器性能。看到“数据库配置助手”自动运行、创建示例方案、启动监听器、完成数据库创建的进度条时,别急着关窗口。新建实例的进度条走到100%后,向导会弹出一个“Database Configuration Assistant”的信息框,里面有企业管理器地址和两个账户的解锁说明。点“口令管理”可以把SCOTT账号解锁,主流的Oracle学习教程都喜欢用SCOTT这个示例用户,我建议顺手解锁。
2.3 建库完成后的目录结构与初始服务
安装完成后,你会在Windows服务里看到一堆Oracle服务。我挑几个关键的来说:
OracleOraDB12Home1TNSListener:监听器服务,客户端能不能连进来全看它OracleServiceORCL:数据库实例服务,这里的ORCL是实例名,如果服务没起,数据库相当于没开OracleMTSRecoveryService:分布式事务相关,一般用不到OracleJobSchedulerORCL:调度作业服务
绝大多数连接问题,根源都能追溯到上面第一和第二个服务。手动操作时,OracleServiceORCL和OracleOraDB12Home1TNSListener这两个服务建议都设成“自动”启动类型。
目录结构方面,Oracle基目录D:\app\oracle下会有product\12.1.0\dbhome_1\network\admin,这个目录里放着三个核心文件:listener.ora(监听器配置)、tnsnames.ora(连接描述符配置)、sqlnet.ora(客户端域解析配置)。后面遇到连接问题,大概率要改这三个文件。安装向导默认已经生成了一份可用的配置,但很多人手贱改了之后改不回来,所以我建议在任何修改之前先备份这三个文件。
3. 监听器与服务名:连接前必须搞清的三件事
3.1 监听器LISTENER起没起
Oracle数据库本身不直接面向网络提供服务,中间隔着一个叫“监听器”的进程。监听器守着某个端口(默认是1521),客户端把连接请求发给监听器,监听器再把请求转给数据库实例。形象点说,监听器就是小区门口的物业前台,你要见业主,得先让前台帮你打电话确认业主在家。
连接数据库之前,第一件事就是确认监听器状态。Windows下打开命令提示符,输入:
lsnrctl status如果返回里有The command completed successfully,且列出了类似(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=your_host)(PORT=1521)))和Service "ORCL" has 1 instance(s)这样的行,说明监听正常,而且它已经识别到了ORCL实例。
如果提示TNS-12541: TNS:no listener,说明监听器没起来。可以用lsnrctl start启动。如果服务压根没装,那只能检查Windows服务里OracleOraDB12Home1TNSListener是否禁用了,改回“自动”再启动。
3.2 SID与服务名不是一个东西
连接Oracle时,连接串里经常看到SID=ORCL和SERVICE_NAME=ORCL两种写法。新手最容易在这两个词上栽跟头。
SID(System Identifier)是数据库实例的唯一标识,一台服务器上可以装多个Oracle实例,每个实例的SID不同。服务名(Service Name)是Oracle Net对外提供的逻辑名称,默认情况下它等于全局数据库名,也就是你在安装时填写的全局数据库名加域名(比如orcl.example.com),但没配置域名时看起来就和SID一样。
区别在于:SID直接对应某个实例,而服务名可以由多个实例共同对外提供服务(RAC场景下尤其如此)。实际连接时,如果你写的连接串是jdbc:oracle:thin:@localhost:1521:ORCL,这里的ORCL是SID;如果写的是jdbc:oracle:thin:@//localhost:1521/ORCL,这里的ORCL是服务名。两种写法的分隔符不一样,一个用冒号,一个用斜杠。
很多报ORA-12505: TNS:listener does not currently know of SID given in connect descriptor的错误,就是因为你连接串写的是SID但监听器只注册了服务名,或者反过来。排查方法是在SQL*Plus里执行:
SELECT value FROM v$parameter WHERE name = 'service_names';查出来的是什么,连接串里就写什么。也可以直接看tnsnames.ora里的写法,通常里面SERVICE_NAME = orcl或SERVICE_NAME = orcl.example.com,照抄就行。
3.3 防火墙和连接描述符的坑
监听器配置完成后,还有两个容易被忽略的环节:Windows防火墙和网络环境的hosts解析。
Windows系统装完Oracle后默认会弹防火墙提示,如果你点了“取消”,那1521端口就被卡死了,本机能连,局域网里其他机器怎么都连不上。最直接的解决方式是加一条入站规则,允许TCP 1521端口通信。但要注意,别图省事关了防火墙,生产环境这么做会被安全审计找麻烦。
连接描述符方面,假设你用PL/SQL Developer或者Navicat远程连数据库,连接串里HOST这一项不要填localhost,如果客户端和数据库不在同一台机器上,要填服务器的实际IP;填服务器主机名也行,但要确保客户端机器可以通过DNS或hosts文件解析到这个主机名。我记得有一次现场部署,客户端总是报ORA-12545: Connect failed because target host or object does not exist,查了半天,原因是客户端机器的hosts文件里根本没写数据库服务器的IP映射,服务器名解析不到。把192.168.1.100 ora12c-server写进hosts后,问题立刻消失。
4. 客户端与连接工具:JDBC连接串和SQL Developer配置实操
4.1 客户端与驱动选择:不是说装了数据库才能连数据库
很多人在另一台机器上装Oracle客户端,是因为不知道Oracle提供了轻量级的Instant Client,也没有使用SQL Developer这样的图形工具。其实连接Oracle数据库,有三条路可走:
第一条路是装完整的Oracle客户端(比如网上常搜到的“oracle12c客户端32位下载”),体积两三GB,功能全,但它主要服务那些必须依赖Oracle Net工具链的老软件,比如某些ERP客户端。第二条路是只装Oracle Instant Client加SQL*Plus,体积百来MB,够命令行连接用。第三条路是直接用纯JDBC驱动,Java程序根本不需要在客户端机器上装任何Oracle组件,驱动jar包就完事了。
如果你用的是Java后端连接Oracle,最常见的驱动是ojdbc8.jar(对应JDK 8及以上),类名是oracle.jdbc.OracleDriver。连接串用的是thin驱动,不需要安装Oracle客户端。Java EE项目里把它扔进WEB-INF/lib或通过Maven依赖引入即可。
4.2 JDBC连接串的写法与参数说明
Java后端连Oracle的JDBC URL有三种写法,我用一张表说清楚:
| 写法 | 格式 | 适用场景 |
|---|---|---|
| SID写法 | jdbc:oracle:thin:@192.168.1.100:1521:ORCL | 单实例环境,最常见 |
| 服务名写法 | jdbc:oracle:thin:@//192.168.1.100:1521/orcl | RAC或指定服务名,官方推荐 |
| TNSName写法 | jdbc:oracle:thin:@DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))) | 无tnsnames.ora时的完整描述符 |
写连接串最容易踩的坑是SID写法和服务名写法的分隔符。SID写法是冒号加SID:@主机:端口:SID;服务名写法是双斜杠加斜杠再跟服务名:@//主机:端口/服务名。我看到过有同事写jdbc:oracle:thin:@192.168.1.100:1521/orcl(用SID写法但用了斜杠),结果报ORA-12505,改成分号或者改成双斜杠后立刻通了。
连接池方面,如果你的项目用了HikariCP、Druid或dbcp,配置Oracle时的几个关键参数值得注意:
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@//192.168.1.100:1521/orcl spring.datasource.username=scott spring.datasource.password=tiger spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUALSELECT 1 FROM DUAL是Oracle和MySQL很大的一个差异点——Oracle的SELECT必须带FROM子句,没有dual这张表就没法取常量。
4.3 用SQL Developer验证连接的标准动作
Oracle官方免费的SQL Developer工具是我推荐的测试首选,因为它内置了独立的JDBC驱动,你不需要先装Oracle客户端就能用它连数据库。打开SQL Developer后,新建连接,填下面这些信息:
- 连接名:随便起,标识用,比如
local_orcl - 用户名:system或scott
- 密码:对应口令
- 主机名:localhost或服务器IP
- 端口:1521
- 服务名/SID:切换“服务名”和“SID”选项,默认填
orcl
点“测试”,状态栏显示“成功”就说明通了。这里有个小细节:SQL Developer的“服务名”选项和“SID”选项别搞错,选择服务名时后端会把连接串拼成@//host:port/service_name的格式,选择SID时则拼成@host:port:sid。如果你不确定数据库配置的是服务名还是SID,先去服务端tnsnames.ora里看SERVICE_NAME的配置,再回头选对应选项。
测通之后,点“连接”,左侧会列出表、视图、存储过程等对象。到了这一步,数据库连接这件事基本就完成了。但我还是要提醒一句:SQL Developer只是开发调试工具,它测通了不代表Java应用就能通——Java应用还涉及驱动版本、连接池、防火墙、字符集等多层因素。
5. 连接报错的排查链路:从“0 notconnect”到ERP报表数据库失败
5.1 根因分析的第一步:分清三类错误
连接数据库报错千千万,但本质上可以分成三类,排查方向完全不同:
第一类是网络层错误,典型代表有ORA-12541: TNS:no listener、ORA-12545: Connect failed because target host or object does not exist、Connection refused。这类错误的特征是“连不到服务器”,排查方向是主机IP、端口、防火墙、监听器状态。
第二类是认证层错误,典型代表有ORA-01017: invalid username/password; logon denied、ORA-28009: connection to sys should be as sysdba or sysoper。这类错误的特征是“网络通了,但身份验证失败”,排查方向是用户名密码、默认Schema、账户锁定和解锁状态。
第三类是服务层错误,典型代表有ORA-12505: TNS:listener does not currently know of SID given in connect descriptor、ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。这类错误就像你拨了物业前台电话,但报了一个前台没登记的房间号,排查方向是SID/服务名是否写对,以及监听器是否注册到了这个服务。
你搜到的热词里有一个特别典型:“首先网站报错(0)notconnect,表示数据库连接失败。”这种说法应该是某种软件框架(比如某些ERP或报表组件的底层驱动)对连接失败做的粗糙封装,把底层JDBC或ODBC的错误吞掉只留一个错误码。遇到这种错误码,第一步永远都是绕过那层封装,去拿最底层数据库驱动的原始报错信息,然后按上面三类去归类。
5.2 “0 notconnect”的具体定位过程
当你在Java程序日志里看到类似(0) notconnect的提示时,我建议按下面的顺序一条条验证:
第一步,在数据库服务器本机测试。打开SQL*Plus,执行:
sqlplus system/你的密码@localhost:1521/orcl如果本机能连上并返回Connected to Oracle Database 12c Enterprise Edition,说明数据库实例和监听器本身是正常的,问题不在服务端。本机也连不上,那就要先看lsnrctl status是否正常、OracleServiceORCL服务是否已启动。
第二步,在应用服务器上测网络连通性。先ping数据库服务器IP,能通说明物理链路没问题。再测试1521端口:
telnet 192.168.1.100 1521如果连接被重置或超时,基本就是防火墙问题。Windows下查netsh firewall show state,Linux下用firewall-cmd --list-all或iptables -L -n -v看规则。
第三步,用最小化Java程序绕过业务系统测试。写一个最简JDBC连接代码:
import java.sql.Connection; import java.sql.DriverManager; public class TestConn { public static void main(String[] args) throws Exception { Class.forName("oracle.jdbc.OracleDriver"); String url = "jdbc:oracle:thin:@192.168.1.100:1521/orcl"; Connection conn = DriverManager.getConnection(url, "scott", "tiger"); System.out.println(conn.getMetaData().getDatabaseProductVersion()); conn.close(); } }这个测试能帮你把问题范围缩小到你自己的代码还是数据库连接环境。如果最小程序能通,说明问题出在应用系统的配置;如果不通,则要继续看驱动版本和连接串写法。
有时候连不上的原因是驱动程序版本不一致。比如你的Java项目里同时存在ojdbc6.jar和ojdbc8.jar,类加载器优先加载了老版本,而老版本驱动连Oracle 12C时可能不支持某些认证协议。排查方法是用mvn dependency:tree或jar tf查看实际加载的驱动版本。
5.3 客户端方向那些容易被忽略的因素
排除掉服务端问题后,客户端方向的排查往往被新手忽略。举几个我实际遇到的例子。
字符集问题:客户端NLS_LANG设置不当,可能导致连接成功后中文显示乱码,甚至在数据写入时报ORA-12705: Cannot access NLS data files or invalid environment specified。Linux/Unix用户检查环境变量echo $NLS_LANG,Windows用户检查注册表或环境变量。建议统一设成SIMPLIFIED CHINESE_CHINA.AL32UTF8或AMERICAN_AMERICA.AL32UTF8,具体看数据库字符集。
hosts解析问题:客户端如果配置了TNSNAMES连接,tnsnames.ora里写的是主机名而不是IP,那么客户端机器必须能解析这个名字。Windows下hosts文件路径是C:\Windows\System32\drivers\etc\hosts,Linux下是/etc/hosts。确认ping 主机名能通。
客户端位数不匹配:搜热词“oracle12c客户端32位下载”多半是遇到了这类问题。老一些的应用程序(比如PowerBuilder开发的ERP客户端)跑在32位模式下,它只能加载32位的Oracle客户端DLL,装了64位客户端会报Unable to load DLL或者干脆报0 notconnect。这种问题没有捷径,只能找32位客户端版本重新装,并确保PATH环境变量优先指向32位客户端的bin目录。
注意:在同一台机器上同时装32位和64位Oracle客户端的场景,PATH环境变量的顺序极其关键。Windows加载DLL时按PATH顺序查找,如果没有优先找到正确的位数的oci.dll,程序会在某个瞬间加载了错误位数的库,然后报错。
5.4 以启动易飞ERP报表数据库连接失败为例,复盘一次完整排查
“启动易飞ERP时显示报表数据库连接失败”这个问题,我在现场真正处理过类似的Case。简单复盘一下我当时完整的排查链路,遇到同款问题可以直接套用。
背景:Windows Server上装了Oracle 12C数据库,ERP应用是易飞(一套制造业ERP),客户端机器连接主程序正常,但进入报表模块时提示数据库连接失败,看应用日志只有一个笼统的错误,类似(0) notconnect。
我当时按这个顺序排查:
先确认数据库服务状态。在服务器上打开服务管理器,确认OracleServiceORCL和OracleOraDB12Home1TNSListener都是“正在运行”。然后在服务器本机用SQL*Plus连接测试,结果正常。这说明数据库实例没问题。
接着检查ERP程序使用的数据源配置文件。易飞这类老ERP程序,数据库连接配置通常在某个INI或XML文件里,而不是像Java那样写在代码里。我打开配置文件,发现里面写的是SERVER=192.168.1.120:1521:ORCL格式的连接串。这里有个关键点:这种老式程序往往要求SID写法,不支持服务名写法。我再用lsnrctl services查看监听器当前登记的服务明细,确认ORCL实例是否以SID形式注册。查询结果显示监听器登记的SID是ORCL,服务名也包含orcl,理论上没问题。
接着排查客户端网络。在ERP客户端机器上,telnet数据库服务器1521端口——结果超时。到这里基本锁定了网络层问题。查服务器防火墙,发现入站规则里TCP 1521是放行的,但服务器上有两块网卡,ERP客户端连接的时候走的是另一块网卡IP,而监听器默认监听在主机名对应的IP上。
用lsnrctl status输出里看监听地址,确认它只监听了(HOST=192.168.1.120)这个IP。但ERP客户端配置的是(HOST=192.168.1.121)。这两个IP根本不在同一块网卡上,所以客户端无法连接。
解决办法是修改监听器监听地址,在listener.ora里把HOST改成0.0.0.0,让监听器不再绑定特定IP:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) ) )改完后执行lsnrctl reload,再lsnrctl status确认监听地址变成(HOST=0.0.0.0)(PORT=1521),客户端telnet 1521端口通了,ERP报表模块恢复正常。
这个案例典型在哪?典型在问题根本不在数据库,也不在客户端连接串,而是监听器绑定IP和客户端访问IP不一致。这种场景在单网卡服务器上几乎不会出现,但一旦服务器有双网卡或虚IP,就容易掉坑里。经验就是:遇到连接失败,永远先看监听器实际监听的地址,再看客户端实际访问的地址,两个对不上,后面一切分析都是白费。
5.5 防复发:把连接检查固化为一套自检清单
踩过几次坑之后,我给自己定了一套“数据库连接自检清单”,每次部署完或者出问题排查时按顺序走一遍,基本能覆盖90%以上的问题。
- 数据库实例服务在不在运行(Windows服务管理器或
ps -ef | grep pmon) - 监听器是否启动(
lsnrctl status) - 监听器监听的IP是否匹配客户端访问的IP
- 数据库SID和服务名是否确认过(
lsnrctl services) - 服务器防火墙是否放行1521端口
- 客户端是否能ping通数据库服务器
- 客户端是否能telnet通1521端口
- 连接串写法与SID/服务名是否匹配
- 驱动版本是否支持数据库版本
- 账号是否锁定(
select username, account_status from dba_users;)
这套清单我用在好几个项目上了,每次都能快速定位问题。如果你要经常处理Oracle连接问题,建议把这套流程写成脚本或文档,放到团队Wiki里。
关于 Oracle 12C 的安装和数据库连接,该讲的都在上面了。最后分享一个我个人的习惯:装完Oracle之后,永远先花十分钟写一份带日期的环境信息备份,把实例名、端口、监听器配置、SID、服务名、字符集、账号密码这些信息记下来。不要相信自己的记忆力,也别相信同事交接时说的“都配好了”。很多连接问题排查到最后,其实就是因为有人改了监听配置、换了端口、忘了告诉别人。环境信息全记下来,排查问题能少走一半弯路。