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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容