PostgreSQL KILL -9 用户连接进程 , OMG 胆真肥

在数据库的服务器上通过linux 命令来将postgresql 杀死 例如 kill -9  xxxx,这样做到底会对postgresql 产生什么影响,不少人都曾经这样干过,为什么说这样做,糟糕透了。

首先我们需要理解一下postgresql 在 linux中的运行机制,system call and fork() system call ,其中

是system call

postgres 102414      1  0 08:34 ?        00:00:00 /usr/local/postgres/bin/postgres -D /pgdata/data

在下边的这些就为 fork() sytem call

postgres 102415 102414  0 08:34 ?        00:00:00 postgres: logger   

postgres 102417 102414  0 08:34 ?        00:00:00 postgres: checkpointer   

postgres 102418 102414  0 08:34 ?        00:00:00 postgres: background writer   

postgres 102419 102414  0 08:34 ?        00:00:00 postgres: walwriter   

postgres 102420 102414  0 08:34 ?        00:00:00 postgres: autovacuum launcher   

postgres 102421 102414  0 08:34 ?        00:00:00 postgres: archiver   

postgres 102422 102414  0 08:34 ?        00:00:01 postgres: stats collector   

postgres 102423 102414  0 08:34 ?        00:00:00 postgres: logical replication launcher 

postgres 102415 102414  0 08:34 ?        00:00:00 postgres: logger   

postgres 102417 102414  0 08:34 ?        00:00:00 postgres: checkpointer   

postgres 102418 102414  0 08:34 ?        00:00:00 postgres: background writer   

postgres 102419 102414  0 08:34 ?        00:00:00 postgres: walwriter   

postgres 102420 102414  0 08:34 ?        00:00:00 postgres: autovacuum launcher   

postgres 102421 102414  0 08:34 ?        00:00:00 postgres: archiver   

postgres 102422 102414  0 08:34 ?        00:00:01 postgres: stats collector   

postgres 102423 102414  0 08:34 ?        00:00:00 postgres: logical replication launcher 

上面的通过调用fork()来创建一个新进程。此系统调用复制当前进程,在进程表中创建一个具有许多与当前进程相同属性的新条目。新创建的进程将是调用进程的子进程

所以父进程为pid 字进程为ppid

当然也可以通过 pstree 来查看当前主线程之间的从属关系

PostgreSQL 调用LINUX 操作系统的信号种类有以下几种

1 Abrt  异常终止信号

 2 int  外部中断,类似于Ctrl +C 的结果

3 quit  直接清理正在运行的线程,并且对临时产生的文件不清理

4  term  这个命令就是就是我们熟悉的 kill  命令

5  hup   重新初始化线程的命令

6 用户调用定义

下面我们做一个test , 看看我们要是kill -9 一个用户连接会有什么问题

下面是在kill 当前连接到数据库的用户process 后的日志

如果图看不清我把关键的一句粘一下

WARNING:  terminating connection because of crash of another server process

我们在对比一下kill 用户连接的进程后的,database 的那些子进程的数字,倒吸一口凉气了吧。

那马上看到这里有人就会产生一个问题,那我怎么kill掉 那个 白占着资源,不干活的用户。

(问题答案将在文末给出)

那么我们翻过来的看一下,在kill -9 一个用户连接的process后会发生什么

1 用户的连接process 被kill -9 干掉2

2 终止任何其他活跃的服务器进程

3 警告因为你的这项操作会导致服务器postgresql其他的进程crash

4 所有的服务器的postgresql processes 重新初始化

也就是日志的这几句话

database system was not properly shut down; automatic recovery in progress

redo starts at 5/1C000098

invalid record length at 5/1C000108: wanted 24, got 0

redo done at 5/1C0000D0

database system is ready to accept connections

OK 到这里你还敢随便 kill -9 人家用户的连接,尤其是几百G 或上T 的大库,Are you crazy ?

那到底正确的做法是什么

pg_terminate_backend 命令在数据库里面去KILL 掉这个用户的连接。

而且不会对数据库产生任何的危害。(见上图)

所以你还在天天的kill -9  用户的process ,建议你住手。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值