启动和停止Greenplum数据库和停止客户端进程操作
在一个Greenplum数据库管理系统中,所有主机上的数据库实例(Master和所有的Segment)一起被启动或者停止,启停操作统一由Master实例发起,它们步调一致,在外界看来是一个完整的数据库管理系统。
由于一个Greenplum数据库系统分布在很多机器上,启动和停止一个Greenplum数据库系统的过程与普通PostgreSQL数据库的启动和停止过程不同。
分别使用gpstart 和 gpstop 工具来启动和停止Greenplum数据库。这些工具位于Greenplum数据库Master主机的$GPHOME/bin 目录下。
Important: 不要采用kill命令来直接杀掉任何后台Postgres进程。 可以使用数据库内命pg_cancel_backend()来完成此操作。
采用 kill -9 或 kill -11 可能引发数据库损坏并且妨碍根据目前数据库的表现进行问题根源分析。
具体的详细一些命令可以查看官方手册,或者查看https://blog.csdn.net/murkey/article/details/105625363
启动Greenplum数据库
在Master实例上,通过执行gpstart可以启动一个初始化好的Greenplum数据库系统。
可以使用gpstart工具来启动一个已经由gpinitsystem工具初始化好的Greenplum数据库系统,前提是该系统已经被gpstop工具停止。 gpstart 通过启动整个Greenplum数据库集群中的所有Postgres数据库实例来启动Greenplum数据库。gpstart 会精心安排这一过程并且以并行的方式执行它。
在Master主机上运行gpstart以启动一个Greenplum数据库:
$ gpstart
重启Greenplum数据库
停止Greenplum数据库系统然后重新启动它。
执行gpstop工具并带有-r选项时,会停止Greenplum数据库并在数据库完全关闭后重新启动它。
要重启Greenplum数据库,在Master主机上输入下面的命令:
$ gpstop -r
仅重新载入配置文件更改
重新载入对Greenplum数据库配置文件的更改而不中断系统。
gpstop 工具可以在不中断服务的前提下重新载入对 pg_hba.conf配置文件和Master上postgresql.conf、 pg_hba.conf文件中的运行 参数进行更改。 活动会话将会在它们重新连接到数据库时使用这些更新。 很多服务器配置参数需要完全重启系统(gpstop -r)才能激活。有关服务器配置参数的信息请见 Greenplum Database Reference Guide。
使用gpstop工具重新载入配置文件更改而不关闭系统:
$ gpstop -u
以维护模式启动Master
只启动Master来执行维护或者管理任务而不影响Segment上的数据。
例如,可以用维护模式连接到一个只在Master实例上的数据库并且编辑系统目录设置。 更多有关系统目录表的信息请见Greenplum Database Reference Guide。
-
使用-m模式运行gpstart:
$ gpstart -m
-
以维护模式连接到Master进行目录维护。例如:
$ PGOPTIONS='-c gp_session_role=utility' psql postgres
-
在完成管理任务后,停止处于维护模式的额Master。然后以生产模式重启它。
$ gpstop -mr
Warning:
对维护模式连接的不当使用可能会导致不一致的系统状态。只有技术支持才应该执行这一操作。
停止Greenplum数据库
gpstop工具可以停止或者重启Greenplum数据库系统,它总是运行在Master主机上。 当被激活时,gpstop 会停止系统中所有的postgrespostgres进程,包括Master和所有的Segment实例。 gpstopgpstop工具使用一种默认的最多64个并行工作线程的方式来关闭构成整个Greenplum数据库集群的Postgres实例。 系统在关闭之前会等待所有的活动事务完成。要立即停止Greenplum数据库,可以使用快速模式。
-
要停止Greenplum数据库:
$ gpstop
-
要以快速模式停止Greenplum数据库:
$ gpstop -M fast
默认情况下,如果有任何客户端连接存在,就不允许关闭Greenplum数据库。 使用-M fast选项可以在关闭前回滚所有正在进行中的事务并且中断所有连接。
停止客户端进程:
Greenplum数据库会为每一个客户端连接唤起一个后台进程。具有SUPERUSER权限的Greenplum用户可以取消或直接终止这些客户端后台进程。
使用pg_cancel_backend()函数可以取消某个活动查询或队列中的后台进程。使用pg_terminate_backend()可以直接终端访问Greenplum数据库的客户端连接。
pg_cancel_backend()
函数有两种表现形式:
-
pg_cancel_backend( pid int4 )
-
pg_cancel_backend( pid int4, msg text )
pg_terminate_backend()
函数也有两种同样地表现形式:
-
pg_terminate_backend( pid int4 )
-
pg_terminate_backend( pid int4, msg text )
如果提供了msg信息, Greenplum数据库会将取消信息的msg内容一并返回给客户端。msg 最大为128字节; 任何超出该长度的信息都会被Greenplum数据库直接截断。
如果pg_cancel_backend()和pg_terminate_backend()函数执行成功,会返回状态true, 相反的会返回false。
要取消或中断后台进程,必须先查出要处理的后台进程ID。进程ID可以从pg_stat_activity视图的procpid
列得到。
例如,如果要看所有运行中和等待中查询的进程信息,可以执行:
=# SELECT usename, procpid, waiting, current_query, datname FROM pg_stat_activity;
上例语句部分查询结果如下:
archdata=# SELECT usename, procpid, waiting, current_query, datname archdata-# FROM pg_stat_activity; usename | procpid | waiting | current_query | datname ---------+---------+---------+----------------------------------------------------------+----------- gpadmin | 18841 | f | SELECT usename, procpid, waiting, current_query, datname | archdata : FROM pg_stat_activity; gpmon | 25532 | f | <IDLE> | gpperfmon (2 rows)
我们可以从查询结果中找到对应查询或客户端连接的进程ID(procpid)。
例如,下面语句会取消上面输出中的等待查询,并将"Admin canceled long-running query."信息反馈给客户端。
=# SELECT pg_cancel_backend(31905 ,'Admin canceled long-running query.'); ERROR: canceling statement due to user request: "Admin canceled long-running query."
pg_cancel_backend() 取消后台操作,回滚未提交事物
pg_terminate_backend() 中断session,回滚未提交事物
这里和oracle类似kill session的操作是pg_terminate_backend()
session A: archdata=# create table tb1 (a int primary key); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tb1_pkey" for table "tb1" CREATE TABLE archdata=# postgres=# begin; postgres=# insert into tb1 select generate_series(1,100000000) session B: archdata=# SELECT usename, procpid, waiting, current_query, datname FROM pg_stat_activity; archdata=# SELECT usename, procpid, waiting, current_query, datname archdata-# FROM pg_stat_activity; usename | procpid | waiting | current_query | datname ---------+---------+---------+----------------------------------------------------------+----------- gpadmin | 18841 | f | insert into tb1 select generate_series(1,100000000); | archdata gpmon | 25532 | f | <IDLE> | gpperfmon gpadmin | 18974 | f | SELECT usename, procpid, waiting, current_query, datname | archdata : FROM pg_stat_activity; gpadmin | 19158 | f | insert into tb1 select generate_series(1,100000000); | archdata (4 rows) archdata=# postgres=# select pg_cancel_backend(19158); pg_cancel_backend ------------------- t session A: archdata=# insert into tb1 select generate_series(1,100000000); ERROR: canceling MPP operation (entry db 10.102.254.27:5432 pid=19158) archdata=# commit; ROLLBACK archdata=# select *from tb1; a --- (0 rows) archdata=# session B: archdata=# SELECT usename, procpid, waiting, current_query, datname FROM pg_stat_activity; usename | procpid | waiting | current_query | datname ---------+---------+---------+----------------------------------------------------------+----------- gpadmin | 18841 | f | <IDLE> | archdata gpmon | 25532 | f | <IDLE> | gpperfmon gpadmin | 18974 | f | SELECT usename, procpid, waiting, current_query, datname | archdata : FROM pg_stat_activity; pg_terminate_backend() 举例: session A: archdata=# create table tb2(a int primary key); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tb2_pkey" for table "tb2" CREATE TABLE archdata=# postgres=# begin; BEGIN postgres=# archdata=# insert into tb2 select generate_series(1,100000000); 运行中 session B: archdata=# SELECT usename, procpid, waiting, current_query, datname archdata-# FROM pg_stat_activity; usename | procpid | waiting | current_query | datname ---------+---------+---------+----------------------------------------------------------+----------- gpadmin | 18841 | f | insert into tb2 select generate_series(1,100000000); | archdata gpmon | 25532 | f | <IDLE> | gpperfmon gpadmin | 18974 | f | SELECT usename, procpid, waiting, current_query, datname | archdata : FROM pg_stat_activity; gpadmin | 19974 | f | insert into tb2 select generate_series(1,100000000); | archdata archdata=# select pg_terminate_backend(19974); pg_terminate_backend ---------------------- t (1 row) session A: archdata=# insert into tb2 select generate_series(1,100000000); ERROR: terminating connection due to administrator command (entry db 10.102.254.27:5432 pid=19974) archdata=# commit; WARNING: there is no transaction in progress COMMIT postgres=# select * from tb2; a --- (0 rows)