端口使用情况警告 (SQL5043N)

(使用 db2start 命令)启动了实例时,侦听器也会启动,以接受来自客户机的连接请求。 但是,有些实例的侦听器可能未能启动,因为这些侦听器正在侦听的端口可能被其他应用程序使用,这会抛出 SQL5043N 警告。

原因

db2start 命令给出以下警告:SQL5043N“对一个或多个通信协议的支持未能成功启动。 但是,核心数据库管理器功能已成功启动。” 以下消息是将记录到 db2diag.log 文件中的内容的示例:
2007-01-23-22.45.33.315991-300 LEVEL: Error
PID     : 3268824     TID  : 1       PROC : db2sysc 0
INSTANCE: db2inst1    NODE : 000
FUNCTION: DB2 UDB, common communication, sqlcctcpconnmgr, probe:46
MESSAGE : ADM7007E  The SVCENAME DBM configuration parameter, "50000", is configured with a port or a service name.  
When it is configured with a service name, the TCP/IP services files is used to map the service name to a port number.  
The port specified in this field is being used by another process.  
Resolve this problem by either deleting the process using the port or use another port.

示例 db2diag.log 文件表明 TCP/IP 侦听器 (db2tcpcm) 未能启动,这是因为必需端口(在此示例中为端口 50000)已被另一个应用程序使用。 简单的解决办法是对侦听器使用其他端口。 如果您必须使用该特定端口,那么应当终止正在使用该端口的应用程序。

答案

在以下 AIX®, Windows 和 Linux® 示例中,您可以使用下面每个操作系统的命令来确定哪个应用程序或进程正在使用该端口。
注: 由于各种原因,可能会返回 SQL5043N 警告。 这仅适用于另一个应用程序使用该端口的情况。

AIX

  1. 运行以下命令:
    lsof -i :<port number>

    必须以 root 用户身份运行此命令。

AIX 示例

请将 SVCENAME 设置为 50000,以便侦听器将使用此端口:
$ db2 update dbm cfg using svcename 50000
$ db2start
然后,使用先前提到的命令来检查 Db2®是否确实正在使用该端口。 以 root 用户身份运行此命令。
$ lsof -i :50000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
db2sysc 4128774 db2inst1 5u IPv6 0xf1000e00019f3bb8 0t0 TCP *:50000 (LISTEN)

Windows

  1. 运行以下命令:
    netstat -aon | findstr "<port number>"

    运行此命令将表明是否正在使用所指定的 <port number>。 最后一列中的数字是拥有套接字的进程的进程标识 (PID)。 一旦确定了 PID ,就可以参考 "Windows 任务管理器" 来确定哪个应用程序对应于 PID。

Windows 示例

C:\>netstat -aon | findstr "50000"
TCP    0.0.0.0:50000     0.0.0.0:0       LISTENING       2564

C:\>pslist 2564

pslist v1.28 - Sysinternals PsList
Copyright ⌐ 2000-2004
Sysinternals

Process information for MACHINENAME:
Process information for MACHINENAME:

   Name      Pid Pri Thd  Hnd   Priv     CPU Time  Elapsed Time
   db2syscs 2564   8  15  366  30912  0:00:02.859   2:12:08.564
前一个示例表明使用 pslist 来确定进程的名称。
注: pslist 是 Microsoft Sysinternals 提供的免费命令。 您可以在 此处找到该文件。

Linux

  1. 运行以下命令:
    netstat -anp | grep <port number>

    此命令显示 PID 以及使用该端口的程序名。 必须以 root 用户身份运行该命令。

  2. 此外,您还可以改为运行以下命令:
    fuser -n tcp <port number>

Linux 示例

在此示例中,其他人正在使用端口 12345。 请运行下列命令以了解正在使用该端口的人员。
# netstat -anp | grep 12345
# netstat -anp | grep 12345
tcp    0   0 127.0.0.1:12345   0.0.0.0:*    LISTEN   6629/ssh
tcp    0   0 ::1:12345              :::*    LISTEN   6629/ssh
具有 PID 6629 的 ssh 正在使用该端口。 查找有关它的更多信息。
# ps -efl | grep 6629
4 S root      6629 29716  0  75   0 -  6976 -      14:05 pts/4    00:00:00 ssh testserver -D 12345 -l db2inst1
0 S root      7648  7302  0  78   0 -   742 pipe_w 14:07 pts/7    00:00:00 grep 6629

在这种情况下,用户 db2inst1 通过指定 ssh 的 -D 选项来故意使用端口 12345。