服务的启停方法
启动数据库实例的方法有以下两种:
- 直接运行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