Pgbouncer unix socket is in use, cannot continue

同事搭了一个postgresql + pgbouncer的环境,但是不小心删了一些文件,重装了pgbouncer后再启动就起不来了,反复试了几次也不行,一直报错:

unix socket is in use, cannot continue
2013-06-03 20:05:24.343 13420 LOG File descriptor limit: 1024 (H:1024), max_client_conn: 1500, max fds possible: 1710   2013-06-03 20:05:24.360 13420 FATAL @src/main.c:754 in function main(): unix socket is in use, cannot continue
环境:
postgresql 9.2.4
pgbouncer 1.5.4 

分析:
这个报错是套接字还在使用导致的启动失败,因为pgbouncer是可以socket连接,所以一般会有一个socket文件,通常这个文件默认在/tmp下面,文件名是
[root@Kenyon tmp]# ls -al .s.PGSQL.*
srwxrwxrwx 1 postgres postgres  0 06-05 17:44 .s.PGSQL.1989
-rw------- 1 postgres postgres 44 06-05 17:44 .s.PGSQL.1989.lock
srwxrwxrwx 1 postgres postgres  0 12-12 18:28 .s.PGSQL.1233
上面两个带1989的文件是postgresql的socket文件和锁文件,socket文件与其他普通文件不一样的地方是文件权限属性是带了s的,第三个是pgbouncer的socket文件,因为同事删除的时候不是正常关闭删除,而是直接删除安装文件,导致socket文件没有删除,再启动就会报错。解决办法是删除这个socket文件,再启动就正常了,或者重启。

[root@Kenyon tmp]# rm -f .s.PGSQL.1233
要查看这个socket文件在哪里,可以通过pgbouncer的配置文件参数(pgbouncer.ini-->unix_socket_dir)来看,如果没有配置,就在/tmp下面

说明:1989是数据库的端口,1233是pgbouncer的端口。

pgbouncer对这一块的源码解释/opt/software/pgbouncer-1.5.4/src/main.c
if (cf_reboot) {
	if (check_old_process_unix()) {
		takeover_part1();
		did_takeover = true;
	} else {
		log_info("old process not found, try to continue normally");
		cf_reboot = 0;
		check_pidfile();
	}
} else {
	if (check_old_process_unix())
		fatal("unix socket is in use, cannot continue");
	check_pidfile();
} 

你可能感兴趣的:(socket,unix,pgbouncer)