暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgresql服务启停及原理

服务的启停方法

启动数据库实例的方法有以下两种:

  • 直接运行postgres进程启动。
  • 使用pg_ctl命令启动数据库。

直接启动数据库的示例:

postgres -D /home/osdba/pgdata &
复制

上面的命令中, “-D/home/osdba/pgdata”用于指定数据目录。 命令的最后一个“&”表示后台执行。

使用pg_ctl命令启动数据库的示例:

pg_ctl -D /home/osdba/pgdata start
复制

停止数据库也有两种方法:

  • 直接向运行的postgres主进程发送signal信号, 停止数据库。
  • 使用pg_ctl命令停止数据库。

停止数据库的模式有以下3种:

  • Smart Shutdown: 智能关机模式。
    在接受此关机请求后, 服务器将不允许新连接,等已有的连接全部结束后才关闭数据库。
    如果服务器处于联机备份模式, 它将等到联机备份模式不再活动时才关闭。
    如果联机备份模式处于活动状态, 它将仍然允许超级用户建立新的连接, 这是为了允许超级用户连接上来以终止联机备份模式。 如果向处于恢复状态的服务器(如Standby数据库) 发送智能关机请求, 服务器会等待恢复和流复制中的正常会话全部终止后才会停止。 这种停库模式用得比较少, 因为在这种模式下, 用户主动断开数据库连接后数据库才会停止, 如果用户一直不断开连接, 服务器就无法停止。
  • Fast Shutdown: 快速关闭模式。
    不再允许新的连接, 向所有活跃服务进程发送SIGTERM信号, 让它们立刻退出, 然后等待所有子进程退出并关闭数据库。 如果服务处于在线备份状态, 将直接终止备份, 这将导致此次备份失败。 这种关机模式比较常用。
  • Immediate Shutdown: 立即关闭模式。
    主进程postgres向所有子进程发送SIGQUIT信号, 并且立即退出, 所有的子进程也会立即退出。 采用这种模式退出时, 并不会妥善地关闭数据库系统, 下次启动时数据库会重放WAL日志进行恢复, 因此建议只在紧急的时候使用该方法。

直接向数据库的主进程发送的signal信号有以下3种:

  • SIGTERM: 发送此信号为Smart Shutdown关机模式。
  • SIGINT: 发送此信号为Fast Shutdown关机模式。
  • SIGQUIT: 发送此信号为Immediate Shutdown关机模式。

pg_ctl命令用不同的命令行参数来表示不同的关机模式:

  • pg_ctl stop -D DATADIR -m smart: 表示Smart Shutdown关机模式。
  • pg_ctl stop -D DATADIR -m fast: 表示Fast Shutdown关机模式。
  • pg_ctl stop -D DATADIR -m immediate: 表示Immediate Shutdown关机模式。

pg_ctl工具

pg_ctl是一个实用工具, 它具有以下功能:

  • 初始化PostgreSQL数据库实例。
  • 启动、 终止或重启PostgreSQL数据库服务。
  • 查看PostgreSQL数据库服务的状态。
  • 让数据库实例重新读取配置文件。
  • 允许给一个指定的进程发送信号。
  • 在Windows平台下允许为数据库实例注册或取消一个系统服务。

初始化PostgreSQL数据库实例的命令:

pg_ctl init[db] [-s] [-D datadir] [-o options]
复制

上面的示例中调用initdb命令创建了一个新的PostgreSQL数据库实例, 其参数说明如下:

  • -s: 只打印错误和警告信息, 不打印提示性信息。
  • -D datadir: 指定数据库实例的数据目录。
  • -o options: 直接传递给initdb命令的参数, 具体可见initdb命令的帮助信息。

指定目录:

 pg_ctl init -D /home/osdba/pgdata
复制

加上“-s”参数只会输出错误或告警信息:

pg_ctl init -s -D /home/osdba/pgdata
复制

启动PostgreSQL数据库的示例如下:

pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path] [-c]
复制

参数说明如下:

  • start: 启动数据库实例。
  • -w: 等待启动完成。
  • -t: 等待启动完成的等待秒数, 默认为60秒。
  • -s: 只打印错误和警告信息, 不打印提示性信息。
  • -D datadir: 指定数据库实例的数据目录。
  • -l: 把服务器日志输出附加在filename文件上, 如果该文件不存在则自动创建。
  • -o options: 声明要直接传递给postgres的选项, 具体可见postgres命令的帮助信息。
  • -p path: 指定postgres可执行文件的位置。 默认postgres可执行文件来自与pg_ctl相同的目录, 不必使用该选项, 除非进行一些特殊的操作, 或者产生postgres执行文件找不到的错误。
  • -c: 提高服务器的软限制(ulimit -c) , 尝试允许数据库实例在发生某些异常时产生一个coredump文件, 以便进行问题定位和故障分析。

使用示例:

pg_ctl start -w -D /home/osdba/pgdata
复制

停止PostgreSQL数据库的示例如下:

pg_ctl stop [-W] [-t seconds] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
复制

其参数说明如下。

  • -W: 不等待数据库停止, 就返回命令。
  • -m: 指定停止的模式。 停止的几种模式前面已做介绍, 这里不再赘述。
    未说明的参数的含义与启动数据库命令中的相应参数含义相同。

使用示例:

pg_ctl stop -D /home/osdba/pgdata -m f
复制

重启PostgreSQL数据库的示例如下:

pg_ctl restart [-w] [-t seconds] [-s] [-D datadir] [-c] [-m s[mart] | f[ast] | i[mmediate] ] [-o options]
复制

此命令中的参数与启动或停止命令中的相应参数含义相同, 这里不再赘述。

让数据库实例重新读取配置文件的命令如下:

pg_ctl reload [-s] [-D datadir]
复制

在配置文件中改变参数后, 需要使用上面的命令使参数生效, 如修改pg_hba.conf中的配置后就可以使用该命令使之生效。

使用示例:

pg_ctl reload -D /home/osdba/pgdata
复制

查询数据库实例状态:

pg_ctl status [-D datadir]
复制

使用示例:

pg_ctl status -D /home/osdba/pgdata
复制

下面的命令用于给指定的进程发送信号。
此命令在Windows平台下比较有用, 因为Windows平台下没有kill命令:

pg_ctl kill [signal_name] [process_id]
复制

下面举例说明。

此示例是针对Windows平台下的PostgreSQL数据库的, 在使用psql连接到数据库时, 运行“select pg_sleep(600)”命令, 然后在操作系统的另一个窗口下用“pg_ctl kill”命令中断前一个窗口中正在执行的命令。 连接到psql后, 执行命令之前先查询该连接对应的后台数据库服务的进程号, 命令如下:

select pg_backend_pid();  # 此例中是3900

select pg_sleep(600);
复制

再向此后台数据库服务进程发送kill信号, 取消上面的SQL命令的执行:

pg_ctl kill INT 3900
复制

kill后前面的psql窗口中可以看到输出错误: 由于用户请求而正在取消查询。

不过, 一般都使用函数“pg_cancel_backend(pid int)”来实现上述功能。
在Windows平台下注册和取消服务的命令如下:

pg_ctl register [-N servicename] [-U username] [-P password] [-D datadir] [-w] [-t seconds] [-o options]
pg_ctl unregister [-N servicename]
复制

其参数说明如下:

  • -N servicename: 要注册的系统服务的名称。 此名称将用作服务名和显示名。
  • -P password: 用户启动服务的密码。
  • -U: 用于启动服务的用户名。 如果是域用户, 需要使用“DOMAIN\username”格式。

删除一个服务:

pg_ctl unregister -N postgresql-9.2
复制

增加一个服务:

pg_ctl register -D "C:\Program Files\PostgreSQL\9.2\data"
复制

信号

前面提到过,发送以下几种信息, 数据库实例主进程会产生相应的关机模式。

  • SIGTERM: Smart Shutdown关机模式。
  • SIGINT: Fast Shutdown关机模式。
  • SIGQUIT: Immediate Shutdown关机模式。

发送SIGHUP命令会让服务器重新装载配置文件, 使用“pg_ctl reload”命令和直接调用函数“pg_reload_conf()”时, 其本质也是发送SIGHUP命令给服务主进程。
直接发送SIGINT命令给数据库服务进程, 会导致此服务进程正在执行的SQL命令被取消, 这与调用函数“pg_cancel_backend”效果相同。
而发送SIGTERM信号给数据库服务进程, 同调用“pg_terminate_backend”函数的效果相同。

postgres及单用户模式

启动PostgreSQL数据库服务器, 实际上就是使用不同的参数运行postgres程序。
postgres程序有很多命令行参数,这里主要介绍postgres的单用户模式。

postgres单用户模式就是启动postgres程序时加上“–single”参数, 这时postgres进程不会进入后台服务模式, 而是进入交互式的命令行模式下:

postgres --single -D /home/osdba/pgdata postgres
复制

在此交互模式下可以执行一些命令, 如一些SQL语句等。

单用户模式主要用于修复数据库的以下几种场景:

  • 当多用户模式不接收所有命令时, 可以使用单用户模式连接到数据库。
  • initdb阶段。
  • 修复系统表

有如下场景:
在PostgreSQL中的一条记录上, 事务年龄不能超过2的31次方(21亿左右), 如果超过该范围, 这条数据就会丢失。(具体请了解pg的MVCC、事务回卷、VACUUM等内容)
PostgreSQL数据库不允许这种情况发生, 当记录的年龄离2的31次方还有1千万的时候, 数据库的日志中就会发出如下告警:

WARNING: database "osdba" must be vacuumed within 177000234 transactions
HINT: To avoid a database shutdown, execute a database-wide VACUUM in "osdba".
复制

如果不处理, 当记录的年龄离2的31次方还有1百万时, 出于安全考虑, 数据库服务器将自动禁止来自任何用户的连接, 同时在日志中提示如下信息:

ERROR: database is not accepting commands to avoid wraparound data loss in database "osdba"
HINT: Stop the postmaster and use a standalone backend to VACUUM in "osdba".
复制

在这种情况下, 只能把数据库启动到单用户模式下执行VACUUM命令来修复。

postgres --single -D /home/osdba/pgdata postgres

backend> vacuum full;
backend> Ctrl+D
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论