聊聊如何连接Oracle数据库服务器
连接Oracle数据库服务器的本质,就一句话:找到数据库所在的主机、端口和服务名,然后使用客户端工具验证身份,建立会话,才能开始执行SQL查询或管理操作。核心是把“客户端”与“数据库实例”之间那根无形的“网络管道”打通,这通常涉及对监听器(Listener)和网络服务名(TNS)的正确配置。
连接Oracle前的准备工作:这些信息不能少
很多新手在Oracle怎么连接数据库服务器这个问题上卡壳,往往是因为不了解基本信息,在发起连接前,请确认你手头有这四样东西:
- 主机地址或主机名,即数据库服务器的IP地址(例如192.168.1.100)或本机环回地址(127.0.0.1,代表本机)。
- 监听端口号,默认是1521,如果DBA改过端口,需要特别留意。
- 服务名或SID,例如数据库的全局数据库名是orcl,或者是pdb1(多租户架构下常用)。
- 合法的用户名与密码,例如scott/tiger、system/manager,或者你自己创建的账号。
一个常见的认知误区是:Oracle连接配置中,服务名和SID不能混为一谈,虽然它们经常指向同一个实例,但在RAC(集群)环境中,服务名是逻辑概念,更通用。
连接前,若不确定网络是否可达,可以在客户端机器上执行ping 主机IP,能通不代表端口通,但至少能排除网络线路故障,更稳妥的方式是使用 telnet 主机IP 1521 测试监听端口是否对外服务,如果是通的会显示黑屏或提示连接成功(不同系统表现不同)。
不同场景下连接Oracle服务器的核心思路
本地连接(终端直接操作)
如果就在数据库服务器本机上操作,使用操作系统命令行窗口就够了,运行sqlplus / as sysdba即可不输入密码,直接以管理员身份(操作系统认证)登录本机Oracle实例,这种本地连接方式不依赖监听器,是DBA进行修复或重启数据库时的首选。
远程连接(客户端与服务器分离)
多数情况下,你不会直接坐在服务器前面,此时需要借助网络,并通过已经启动的监听器来转发请求,连接过程中,客户端会先向服务器的1521端口发起请求,监听器根据你提供的服务名,把请求引导给数据库实例。
对于远程连接,最忌讳的是忘了启动监听,假如报出ORA-12541: TNS: 没有监听器,多半就是DBA还没运行lsnrctl start,用lsnrctl status可以实时查看监听器当前状态和已注册的服务。
实操:使用sqlplus命令行连接数据库服务器
在知道服务器IP是10.0.0.5、端口1521、服务名orcl的前提下,用命令行入手是最快的。
sqlplus username/password@//10.0.0.5:1521/orcl
这段命令表示:使用用户名/密码,通过Oracle自带的简单连接串,直连到10.0.0.5这台服务器的1521端口,并申请访问orcl这个服务名。
如果嫌连接串太长,可以借助本机tnsnames.ora文件,实现可读性更强的写法,文件通常位于$ORACLE_HOME/network/admin/目录下,内容大致如下:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.0.5)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
配置完成后,命令行直接输入sqlplus username/password@ORCL即可发起连接,对于初学者来说,你只需要记住:@后面跟的是本地的网络服务名,服务名会指向远端的真实IP和端口。
PL/SQL Developer连接Oracle数据库步骤
Windows环境下,绝大多数从业人员习惯用PL/SQL Developer或Navicat等图形化工具,特别是PL/SQL Developer,几乎是许多Oracle开发者的标准配置。
以在Windows机器上通过PL/SQL Developer连接Oracle为例,步骤如下:
- 下载并安装一个与Oracle版本匹配的客户端,建议安装完整的Oracle Instant Client。
- 把客户端解压前缀路径加入系统PATH环境变量。
- 在PL/SQL Developer的首选项里,把OCI库路径指向下载好的客户端中的oci.dll文件,例如
C:instantclient_19_17oci.dll。 - 在客户端文件夹内新建
tnsnames.ora配置为上文提到的ORCL别名。 - 打开PL/SQL Developer,登录窗口按提示输入:
- 用户名
- 密码
- 数据库下拉,选择
ORCL(注意,下拉列表不是自动读取的,要手动填一个别名,或者点击右键刷新)。
- 点击登录,正常进入界面即表示成功。
如果点击登录时卡在“正在连接”并最终弹窗报
ORA-12154,那十有八九是tnsnames.ora文件放置的目录不正确,或者环境变量TNS_ADMIN没设置好,此时将TNS_ADMIN环境变量指向你放置tnsnames.ora的具体目录,再重新打开工具即可解决。
排查“Oracle数据库连不上”的高频报错
即便步骤繁琐,很多人还是会在Oracle连接配置上栽跟头,下面这些是常见问题:
| 报错代码 | 含义 | 最可能的触发原因 |
|---|---|---|
| ORA-12541 | 没有监听器 | 监听未启动,或端口被防火墙拦截 |
| ORA-12514 | 监听无法识别请求的服务名 | 服务名拼写错误,或实例尚未成功注册到监听 |
| ORA-12560 | 协议适配器错误 | 32位客户端连接64位数据库(或反之),Windows上常见环境问题 |
| ORA-01017 | 用户名/密码无效 | 输错了密码,或有大小写混排 |
| ORA-01034 | ORACLE不可用 | 数据库实例本身未启动,监听正常但实例宕机 |
业内专家指出,许多远程连接失败源于“监听正常,但实例未注册”,确认这一点的标准方法是检查监听状态:lsnrctl services能列出当前监听服务名,如果没看到orcl,可用ALTER SYSTEM REGISTER;手动强制实例向监听器注册。
防火墙是另一个容易忽略的“隐形杀手”,CentOS或Linux服务器上,如果确认Oracle监听已启动,但Telnet不通,则多半是防火墙拦截,检查命令:
systemctl status firewalld
firewall-cmd --list-ports
如果确定要对外开放1521端口,使用:
firewall-cmd --permanent --add-port=1521/tcp && firewall-cmd --reload
在Linux服务器上远程连接Oracle数据库的命令行技巧
对于Linux运维人员而言,在Linux环境远程连接Oracle数据库有两个常用工具:
sqlplus和tnsping。
tnsping并非真的“连接”数据库,它只是测试网络别名是否通,如果tnsping能解析别名,说明TNS配置无碍:
tnsping ORCL
看到OK (0 msec)类似字样,表示网络层通,接下来的sqlplus登录操作才能检验数据库服务是否真正可用。
在Linux服务器上用sqlplus连接远端数据库时,若系统同时装了多个Oracle客户端,务必用which sqlplus确认你使用的sqlplus来自哪个版本,避免因PATH混乱导致客户端与服务器版本不兼容,从而出现开头链接不上、中间连接中断等莫名错误。
相关问题解答
为什么连接Oracle数据库总是报监听超时?
监听超时通常不在软件层面,而是网络层面,检查客户端与服务器之间的1521端口是否畅通,确认服务端防火墙白名单是否加入客户端IP,同时检查数据库服务器上是否启用了SELinux(增强安全策略),必要时用setsebool -P oracle_nsssl_enabled 1临时调整,或用semanage port -a -t oracle_port_t -p tcp 1521放行端口。
PL/SQL Developer连不上Oracle,但命令行的sqlplus可以正常连接,为什么?
这种“图形工具连不上,命令行能连上”的现象,常见原因是PL/SQL Developer的OCI库配置指向了系统自带的低版本或与数据库端不匹配的instant client,建议在首选项中重新指向你的即时客户端路径,并检查本机环境变量ORACLE_HOME是否被错误设置,PL/SQL Developer占用的内存较高,大并发环境下Oracle的process连接数已满时也会导致图形化连接卡住,此时查看数据库连接数(v$session)即可确认。
想用Python连接Oracle数据库服务器,有哪些注意事项?
Python一般通过cx_Oracle库连接,前提是安装的cx_Oracle版本要与操作系统位数一致,且电脑必须安装Oracle Client库(可以是较新版的client,建议不低于数据库小版本),连接字符串示例:cx_Oracle.connect("scott/tiger@10.0.0.5:1521/orcl"),编写程序前先确保已经设置好LD_LIBRARY_PATH变量指向instant client目录(Linux下)或PATH路径(Windows下),否则会报DPI-1047错误,多数情况下,按系统位数统一安装客户端并设置好环境变量后问题都能解决。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/696371.html





