端口使用情况警告 (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
- 运行以下命令:
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
- 运行以下命令:
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 来确定进程的名称。
Linux
- 运行以下命令:
netstat -anp | grep <port number>此命令显示 PID 以及使用该端口的程序名。 必须以 root 用户身份运行该命令。
- 此外,您还可以改为运行以下命令:
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。