|
3.3. 启动数据库服务器在任何人可以访问数据库前,你必须启动数据库服务器.数据库 服务器叫 postmaster . postmaster 必须知道到哪里能找到她支持的数据来处理.这是利用 -D 选项来实现的.因此,启动服务器的最简单 的方法如下, $ postmaster -D /usr/local/pgsql/data 这样将把服务器放在前台运行.这个步骤同样必须以 PostgreSQL 用户帐户登录来做.没有 -D 选项,服务器将使用 环境变量 PGDATA ;如果两个都没有,postmaster 会 失败退出. 要在后台启动 postmaster , 使用下面的 shell 语法: $ postmaster -D /usr/local/pgsql/data > logfile 2>&1 & 把服务器的 stdout 和 stderr 放到某个地方绝对是个好主意,就象在这里 建议的这样.这样做既可以帮助监控又可以帮助诊断问题. (参阅 Section 8.3 获取有关日志文件 处理的更完整的讨论.) postmaster 还接受一些其他的一些命令行选项.更多的信息请参考 手册页和下面的 Section 3.4 .尤其要注意的一点是, 为了令 postmaster 接受 TCP/IP 联接(而不仅仅是 Unix 域套接字),你必须声明 -i 选项. 这些 shell 语法很容易让人觉得无聊.因此我们提供了 shell 脚本封装 pg_ctl 以实现一些 任务.比如, pg_ctl start -l logfile 将在后台启动服务器并且把输出放到指定的日志文件中. -D 选项和你直接运行 postmaster 时的意思是一样的. pg_ctl 还实现了一个类似的 "stop" 操作. 通常,你会希望在计算机启动的时候启动数据库服务器. 这并不是必须的; PostgreSQL 可以 不需要任何 root 的干预以一个非特权的用户成功运行. 不同的系统在引导的时候有不同的启动守护进程的方法,所以 我们建议你先熟悉它们.许多系统有名字称为 /etc/rc.local 或 /etc/rc.d/rc.local 这样的文件,它们肯定是 放这些命令的一个不坏的地方. 如果你这么干,要记住 postmaster 必须以 PostgreSQL 用户帐户 而不是以 root 或者其他任何用户的身份运行. 这样,你可能总是要用下面这行的样子构造你的命令: su -c '...' postgres 比如: su -c 'pg_ctl -D /usr/local/pgsql/data -l serverlog' postgres
下面是一些比较详细的与操作系统相关的建议.(请注意 替换成你选择的安装路径和用户名.)
postmaster 运行的时候,它的 PID 是数据目录里的文件 postmaster.pid 的内容.这样做是为了提供一个目录锁避免多个 postmaster 对 同一个数据目录操作,此文件同样可以用于关闭 postmaster. 3.3.1. 服务器启动失败有几个非常常见的原因会导致 postmaster 启动失败. 通过检查 postmaster 日志或者使用手工启动的方法(不做 stdout 和 stderr 的重定向),就可以看到错误信息.有些错误信息是自明的, 不过还有一些不是.
FATAL: StreamServerPort: bind() failed: Address already in use Is another postmaster already running on that port? 就象它提示的那样:你试图在已经有一个 postmaster 运行着的 端口上又运行了一个 postmaster.不过,如果内核的错误信息 不是 Address already in use 或者是其它的措词,那就有可能是别的毛病. 比如,试图在一个保留的端口上运行 postmaster 会收到下面这样的信息 $ postmaster -i -p 666 FATAL: StreamServerPort: bind() failed: Permission denied Is another postmaster already running on that port?
象这样的信息 IpcMemoryCreate: shmget(key=5440001, size=83918612, 01600) failed: Invalid argument FATAL 1: ShmemCreate: cannot create region 可能意味着你的内核对共享内存区的限制小于 PostgreSQL 试图分配的 缓冲区大小(本例中是 83918612 字节).或者可能意味着你根本 就没有配置 System-V 风格的共享内存支持.作为一个临时的解决办法, 你可以试着以小于正常数量的缓冲区数( -B 开关) 启动 postmaster.不过,你最终还是会希望重新配置你的内核,以 增加共享内存的尺寸.如果你试图在同一台机器上启动多个 postmaster, 而且她们所需的总空间超过了内核的限制,也会报这个错. 象下面这样的错误 IpcSemaphoreCreate: semget(key=5440026, num=16, 01600) failed: No space left on device 并 不 意味着着你已经用光磁盘空间了;它的意思是 你的内核的 System V 信号灯的限制小于 PostgreSQL 想创建的数量.和上面一样,你可以通过减少后端进程的数量 ( -N 开关)来绕开,但最终你还是会希望增加 内核的限制. 如果你收到一个 "illegal system call" 错误,那么很有可能是 你的相同根本不支持共享内存或者信号灯.如果是这样的话,你的唯一选择 就是重新配置你的内核并且把这些特性打开. 关于配置系统 System V IPC 资源的细节见 Section 3.5.1 . 3.3.2. 客户端联接问题尽管客户端所有错误条件的可能性实际上是数不胜数的,而且还和应用相关,但 的确有几种错误与服务器的启动方式直接相关.除了下面提到的 几种错误以外的问题都应该在相应的客户端应用的文档中.
psql: could not connect to server: Connection refused Is the server running on host server.joe.com and accepting TCP/IP connections on port 5432? 这是纯粹的 "我找不到可以交谈的服务器 " 错误.当试图进行 TCP/IP 通讯时 它看起来象上面的样子. 常见的错误是忘记带 -i 启动 postmaster 以允许 TCP/IP 联接. 另外,当试图通过一个 Unix 套接字与本机 postmaster 通讯时,你会看到这个: psql: could not connect to server: Connection refused Is the server running on host server.joe.com and accepting TCP/IP connections on port 5432? and accepting connections on Unix socket '/tmp/.s.PGSQL.5432'?
最后一行是客户端进行联接尝试时,它认为服务器所在的位置. 如果实际上没有 postmaster 在那里运行,典型的内核错误是 象上面显示的那样或者是 Connection refused 或者是 No such file or directory . (尤其要注意的是这种环境下 Connection refused 的信息显示 并 不 意味着 postmaster 收到你的联接然后拒绝 了联接--那样的话会产生一个不同的信息,象 Section 4.3 里面显示的那样) 其它象 Connection timed out 这样的 信息表示更基本的问题,比如缺少网络联接等. |