pg_ctl -- 启动、停止、重启 PostgreSQL
pg_ctl名称pg_ctl--启动、停止、重启 PostgreSQL语法 pg_ctlstart [-w] [-s] [-Ddatadir] [-lfilename] [-ooptions] [-ppath] 描述pg_ctl用于启动、停止、重启 PostgreSQL 后端服务器(postgres),或者显示一个运行着的服务器的状态。尽管可以手动启动服务器,但是pg_ctl封装了重新定向日志输出,与终端和进程组合理分离,以及另外提供了一个选项用于有控制的关闭。 在start模式里会启动一个新的服务器。服务器是在后台启动的,标准输入被附着到了/dev/null上。如果使用了-l,那么标准输出和标准错误将被定向到一个日志文件,要么就是重定向到pg_ctl的标准输出(而不是标准错误)。如果没有选定日志文件,pg_ctl的标准输出应该重定向到一个文件或者用管道输出到类似rotatelogs这样的日志滚动程序,否则,postgres将把它的输出写到控制终端(在后台)并且将不会脱离 shell 的进程组。 在stop模式下,那个正在特定数据目录运行的服务器将被关闭。你可以用-m选项选择三种不同的关闭模式:"Smart"模式等待所有客户端中断连接,这是缺省。"Fast"模式并不等待客户端中断连接,所有活跃事务都被回滚并且客户端都被强制断开。"Immediate"模式将在没有干净关闭的情况下强行退出。这么做将导致在重新启动的时候的恢复。 restart实际上是先执行一个停止,然后紧跟一个启动。它允许变换postgres的命令行选项。 reload模式简单地给postgres发送一个SIGHUP信号,导致它重新读取配置文件(postgresql.conf,pg_hba.conf等),这样就允许修改配置文件选项而不用重启系统即可生效。 status模式监查一个服务器是否在指定的数据目录运行,如果是,那么显示其 PID 和调用它的命令行选项。 kill模式允许你给一个指定的进程发送信号。这个功能对 Microsoft Windows 特别有用,因为它没有kill命令。使用--help查看支持的信号名字列表。 register模式允许你在 Microsoft Windows 上注册一个系统服务。 unregister模式允许你在 Microsoft Windows 上删除先前用register命令注册的系统服务。 选项
Windows 选项
环境变量
其它的环境变量请参阅postgres 文件
注意等待完全启动还不是一个定义得很完整的操作,如果访问控制设置为本地客户端在没有手工交互的情况下不能访问的话还可能会失效(比如口令认证)。 例子启动服务器启动服务器: $ pg_ctl start 启动服务器的一个例子,等到服务器启动了才退出: $ pg_ctl -w start 服务器使用 5433 端口,而且不带 $ pg_ctl -o "-F -p 5433" start 停止服务器$ pg_ctl stop 使用-m选项停止服务器允许用户控制如何关闭后端。 重启服务器这个命令几乎等于先停止服务器然后再启动它,只不过pg_ctl保存并重新使用上一次运行服务器的命令行参数。重启服务器的最简单的方法是: $ pg_ctl restart 重启服务器,等待其停止和重启: $ pg_ctl -w restart 使用 5433 端口重启并且重启后关闭 $ pg_ctl -o "-F -p 5433" restart 显示服务器状态下面是来自pg_ctl的状态输出的例子: $ pg_ctl status pg_ctl: server is running (pid: 13718) Command line was: /usr/local/pgsql/bin/postgres '-D' '/usr/local/pgsql/data' '-p' '5433' '-B' '128' 这就是在 restart 模式中被调用的命令行。 又见postgres pg_resetxlog名称pg_resetxlog--重置一个数据库集群的预写日志以及其它控制内容语法pg_resetxlog[-f] [-n] [-ooid] [-xxid] [-exid_epoch] [-mmxid] [-Omxoff] [-ltimelineid,fileid,seg]datadir 描述pg_resetxlog清理预写日志(WAL)并且可以有选择地重置其它一些存储在pg_control文件中的控制信息。有时候,如果这些文件崩溃了,就需要这个功能。一定只把它用作最后的方法,就是说只有因为这样的崩溃导致服务器无法启动的时候才使用。 运行这个命令之后,可能就可以启动服务器了,但是,一定要记住数据库可能因为部分提交的事务而含有不完整的数据。你应该马上转储数据,运行initdb,然后重新加载。在重新加载之后,检查不完整的部分然后根据需要进行修复。 这个命令只能由安装服务器的用户运行,因为它需要对数据目录的读写权限。出于安全考虑,pg_resetxlog不使用环境变量PGDATA,你必须在命令行上声明数据目录。 如果pg_resetxlog抱怨说它无法判断用于pg_control的有效数据,那么你可以强制它继续处理,方法是声明-f(强制)开关。在这种情况下,那些丢失了的数据将用模糊的近似数值代替。大多数字段都可以匹配上,但是下一个 OID 、下一个事务 ID 、下一个事务 ID 的 epoch(时间点)、下一个多事务 ID(两阶段提交的东西)、下一个多事务偏移量、WAL 开始地址、数据库区域字段可能需要手工帮助,前面六个可以用下面讨论的开关设置。pg_resetxlog自己的环境是猜测区域字段的来源;看看LANG等东西,它们应该和initdb运行的环境相匹配。如果你不能判断所有这些字段的正确数值,那么-f仍然可以使用,但是这样恢复过来的数据库正确性更值得怀疑:立即转储和重新加载是必须的。在转储之前不要执行任何修改数据的操作,因为任何这样的动作都可能把事情搞得更糟糕。 -o,-x,-e,-m,-O,-l开关允许手工设置下一个 OID 、下一个事务 ID 、下一个事务 ID epoch 、下一个多事务 ID 、下一个多事务偏移量、WAL 起始位置的数值。只有在pg_resetxlog无法通过读取pg_control判断合适的数值的时候才需要它。安全的数值可以用下面的方法判断:
-n(无操作)开关指示pg_resetxlog打印从pg_control重新构造的数值然后不修改任何值就退出。这主要是一个调试工具,但是在pg_resetxlog真正处理前进行的整洁性检查的时候可能会有用。 注意在服务器运行的时候一定不要运行这个命令。如果发现在数据文件目录里有锁文件,那么pg_resetxlog将拒绝启动。如果服务器崩溃,那么可能会剩下一个锁文件;如果这样,你可以删除该锁文件以便允许pg_resetxlog运行。但是在你这么做之前,一定要确保没有任何后端服务器进程仍在运行。 postgres名称postgres--PostgreSQL 数据库服务器语法postgres[option...] 描述postgres是 PostgreSQL 数据库服务器。客户端应用程序为了访问数据库,将通过 TCP Socket 或 Unix domain socket 连接到一个运行中的postgres进程。然后该postgres实例将启动(fork)一个新的、独立的服务器进程来处理这个连接。 一个postgres总是管理来自同一个数据库集群的数据。一个数据库集群是一组在同一个文件系统位置("数据区")存放数据的数据库。一个系统上可以同时运行多个postgres进程,只要他们使用不同的数据区和不同的端口号(见下文)。postgres启动时需要知道数据区的位置,该位置必须通过-D选项或PGDATA环境变量指定。通常,-D或PGDATA都直接指向由 initdb 创建的集群目录。其他可能的文件布局在节17.2里面有讨论。 缺省时postgres在前台启动并将日志信息输出到标准错误。但在实际应用中,postgres应当作为后台进程启动,而且多数是在系统启动时自动启动。 postgres还能以单用户模式运行。这种用法的主要用于 initdb 的初始化过程中。有时候它也被用于调试灾难性恢复。不过,单用户模式运行的服务器并不适合于调试,因为没有实际的进程间通讯和锁动作发生。当从 shell 上以单用户模式调用时,用户可以输入查询,然后结果会在屏幕上以一种更适合开发者阅读(不适合普通用户)的格式显示出来。在单用户模式下,将把会话用户 ID 设为 1 并赋予超级用户权限。该用户不必实际存在,因此单用户模式运行的服务器可以用于对某些意外损坏的系统表进行手工恢复。 选项postgres接受下列命令行参数。关于这些选项的更详细讨论请参考章17。你也可以通过设置一个配置文件来减少敲击这些选项。有些(安全的)选项还可以从连接过来的客户端设置,以一种应用无关的方法仅对该会话生效。比如,如果设置了PGOPTIONS环境变量,那么基于libpq的客户端就都把那个字符串传递给服务器,并被服务器解释成postgres命令行选项。 通用用途
半内部选项还有几个其它的选项可以声明,主要用于调试用途。这些东西在这里列出只是给 PostgreSQL 系统开发人员使用的。强烈反对使用这些选项。另外这些选项的任何一项都可能在未来版本中消失而不加说明。
单用户模式的选项下面的选项仅在单用户模式下可用。
环境变量
诊断一个提到了semget或shmget的错误信息可能意味着你需要重新配置你的内核,提供足够的共享内存和信号灯。更多讨论,参阅节16.4。你也可以通过降低 shared_buffers 值以减少 PostgreSQL 的共享内存的消耗,或者降低 max_connections 值减少 PostgreSQL 的信号灯的消耗。 如果碰到一个说另外一个服务器正在运行的错误信息,可以根据不同的系统使用命令 $ ps ax | grep postgres 或 $ ps -ef | grep postgres 如果确信没有冲突的服务器正在运行,那么你可以删除消息里提到的锁文件然后再次运行。 抱怨无法绑定端口的错误信息可能表明该端口已经被其它非 PostgreSQL 进程使用。如果终止postgres后又马上用同一个端口运行它,也可能得到这个错误信息;这时,你必须多等几秒,等操作系统关闭了该端口后再试。最后,如果你使用了一个操作系统认为是保留的端口,也可能导致这个错误信息。例如,我的 Unix 版本认为低于 1024 的端口号是"可信任的",因而只有 Unix 超级用户可以使用它们。 注意如果有可能,不要使用SIGKILL杀死主postgres服务器进程。这样会阻止postgres在退出前释放它持有的系统资源(例如共享内存和信号灯)。这样可能会影响到将来启动新的postgres进程。 可以使用SIGTERM,SIGINT,SIGQUIT信号正常结束postgres服务器进程。第一个信号将等待所有的客户端退出后才退出。第二个将强制断开所有客户端,而第三个将不停止立刻退出,导致在重启时的恢复运行。SIGHUP会重新加载服务器配置文件。也可以向一个单独的服务器进程发送SIGHUP信号,但是这样做没什么意义。 pg_ctl工具可以用于安全而有效地启停postgres,推荐使用。 要推出一个正在运行的查询,可以向正在执行该查询的进程发送SIGINT信号。 主postgres服务器进程向子进程发送SIGTERM信号让它们正常退出;发送SIGQUIT信号立即退出且不做清理工作,用户应当尽量避免使用该信号。同时,发送SIGKILL信号也是不明智的:主postgres进程将把这个信号当作崩溃信号,然后会强制其他兄弟进程作为标准的崩溃回复过程退出。 臭虫--选项在FreeBSD或OpenBSD上无法运行,应该使用-c。这在受影响的系统里是个臭虫;如果这个毛病没有修补好,将来的 PostgreSQL 版本将提供一个绕开的办法。 用法启动一个单用户模式的服务器: postgres --single -D /usr/local/pgsql/data other-options my_database 用-D给服务器提供正确的数据库目录的路径,或者确保环境变量PGDATA已经正确设置。同时还要声名你想用的特定数据库名字。 通常,独立运行的服务器把换行符当做命令输入完成字符;它还不懂分号的作用,因为那些东西是在psql里的。要想把一行分成多行写,你必需在除最后一个换行符以外的每个换行符前面敲一个反斜杠。 但是如果使用了-j命令行选项,新行将不被当作命令结束符。此时服务器将从标准输入一直读取到 EOF 标志为止,然后把把所有读到的内容当作一个完整的命令字符串看待,并且反斜杠与换行符也被当作普通字符来看待。 输入 EOF(Control+D)即可退出会话。如果你已经使用了-j则必须连续使用两个 EOF 才行。 请注意单用户模式运行的服务器不会提供复杂的行编辑功能(比如,没有命令行历史)。 例子用缺省值在后台启动postgres: $ nohup postgres >logfile 2>&1 </dev/null & 在指定的端口启动postgres: $ postgres -p 1234 这条命令将在端口 1234 启动postgres。你应该这样使用psql与之连接: $ psql -p 1234 或者设置环境变量PGPORT: $ export PGPORT=1234 $ psql 命名的运行时参数可以用下列的风格之一设置: $ postgres -c work_mem=1234 $ postgres --work-mem=1234 两种形式都覆盖那些现有的在postgresql.conf里面的work_mem设置。请注意在参数名里的下划线在命令行上可以写成下划线,也可以写成连字符。除了用于短期的实验以外,更好的习惯是编辑postgresql.conf里面的设置,而不是倚赖命令行开关设置参数。 又见initdb,pg_ctl postmasterNamepostmaster--PostgreSQL 数据库服务器Synopsispostmaster[option...] Descriptionpostmaster是postgres的别名,反对使用。 又见postgres (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |