解决Linux下Oracle客户端无法连接Windows下Oracle Server端问题的方法

查看SERVICE_NAME

1
2
3
4
5
6
7
8
# 在windows Oracle服务端启动SQLPLUS
# 执行以下命令
SQL> select value from v$parameter where name='service_names';

# 以下为执行结果
VALUE
----------------------------------------------------------------------------
orcl.microdone.cn

修改Linux下 tnsnames.ora

# 将SERVICE_NAME 修改为上面查询的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo vim /usr/lib/oracle/12.2/client64/network/admin/tnsnames.ora

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.1)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
(SERVICE_NAME = orcl.microdone.cn)
)
)


# 将SERVICE_NAME 修改为上面查询的结果

查看Oracle数据库实例名称

  1. 找到Windows下Oracle安装目录
1
E:\app\TZZ\virtual\product\12.2.0\dbhome_1\
  1. 进入 bin 文件夹中

  2. 找到 lsnrctl.exe 可执行文件,右键使用管理员身份打开

  3. 执行status命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    LSNRCTL> status
    正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=windows10.microdone.cn)(PORT=1521)))
    LISTENER 的 STATUS
    ------------------------
    别名 LISTENER
    版本 TNSLSNR for 64-bit Windows: Version 12.2.0.1.0 - Production
    启动日期 13-8月 -2019 01:11:12
    正常运行时间 0 天 0 小时 19 分 35 秒
    跟踪级别 off
    安全性 ON: Local OS Authentication
    SNMP OFF
    监听程序参数文件 E:\app\TZZ\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora
    监听程序日志文件 E:\app\TZZ\virtual\diag\tnslsnr\DESKTOP-8P2KP7P\listener\alert\log.xml
    监听端点概要...
    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=DESKTOP-8P2KP7P)(PORT=1521)))
    (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
    服务摘要..
    服务 "157cdf77ee1347ef9cb52c8ccc569098.microdone.cn" 包含 1 个实例。
    实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    服务 "CLRExtProc" 包含 1 个实例。
    实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
    服务 "ORCL" 包含 1 个实例。
    实例 "ORCL", 状态 UNKNOWN, 包含此服务的 2 个处理程序...
    服务 "db.microdone.cn" 包含 1 个实例。
    实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    服务 "orcl.microdone.cn" 包含 1 个实例。
    实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    服务 "orclXDB.microdone.cn" 包含 1 个实例。
    实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
    命令执行成功

    最后的服务摘要内,实例后面跟的即为实例名称,即 orcl 和 ORCL 。

修改Windows下 Oracle Server端监听配置文件

  1. 找到Windows下Oracle安装目录

E:\app\TZZ\virtual\product\12.2.0\dbhome_1\

  1. 移动到 network/admin下

E:\app\TZZ\virtual\product\12.2.0\dbhome_1\network\admin

  1. 编辑 listener.ora文件,此为服务端监听的配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # listener.ora Network Configuration File: E:\app\TZZ\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora
    # Generated by Oracle configuration tools.

    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = CLRExtProc)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (PROGRAM = extproc)
    (ENVS = "EXTPROC_DLLS=ONLY:E:\app\TZZ\virtual\product\12.2.0\dbhome_1\bin\oraclr12.dll")
    )
    )

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = windows10.microdone.cn)(PORT = 1521))
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    )

    在文件中添加以下内容,其中可根据自己需要进行添加,将其添加SID_LIST =后面即可,每个(SID_DESC = ) 都为一个单独的实例配置,Linux下想要连接哪个实例,就添加哪个即可。其中SID_NAME 与 GLOBAL_DBNAME 修改为连接的实例名称,添加到后面。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    (SID_DESC =
    (SID_NAME = ORCL)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (GLOBAL_DBNAME = ORCL)
    )(SID_DESC =
    (SID_NAME = orcl)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (GLOBAL_DBNAME = orcl)
    )

    最终文件为

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    # listener.ora Network Configuration File: E:\app\TZZ\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora
    # Generated by Oracle configuration tools.

    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = CLRExtProc)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (PROGRAM = extproc)
    (ENVS = "EXTPROC_DLLS=ONLY:E:\app\TZZ\virtual\product\12.2.0\dbhome_1\bin\oraclr12.dll")
    )(SID_DESC =
    (SID_NAME = ORCL)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (GLOBAL_DBNAME = ORCL)
    )(SID_DESC =
    (SID_NAME = orcl)
    (ORACLE_HOME = E:\app\TZZ\virtual\product\12.2.0\dbhome_1)
    (GLOBAL_DBNAME = orcl)
    )
    )

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = windows10.microdone.cn)(PORT = 1521))
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    )

重新启动监听服务

  1. 找到Windows下Oracle安装目录
1
E:\app\TZZ\virtual\product\12.2.0\dbhome_1\
  1. 进入 bin 文件夹中

  2. 找到 lsnrctl.exe 可执行文件,右键使用管理员身份打开

    执行以下命令

    1
    2
    LSNRCTL> stop
    LSNRCTL> start

    等待命令执行完…

  3. WIN+R 输入 services.msc 打开服务管理器

  4. 启动 Oracle 所有相关服务

Linux下连接测试

在Linux下执行以下命令

1
sqlplus c##oracle/[email protected]:1521/orcl

将其中内容替换为自己的内容:

  • c##oracle 用户名
  • oracle 密码
  • 192.168.137.1:1521 Oracle服务端IP:Port
  • orcl 实例名称