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

pg运维踩坑记

IT那活儿 2021-09-09
776

一. 杀会话

都知道可以通过数据库查到pid,然后kill -9就可以强制杀会话了,如果用Oracle和MySQL的认知做pg数据库的操作,那就大错特错了。

kill -9的危害Pg 看到一个被支持的被终止kill -9。它知道后端可能已经损坏了共享内存——例如,因为你可以在将页面写入 shm 或修改页面的过程中中断它——所以当它注意到后端突然消失时,它会终止并重新启动所有其他后端并以非零错误代码退出。正确的方法是通过下列2种方式杀进程

1. 库里调用存储过程

可以根据pg_stat_activity的几个字段找到需要杀掉的会话

通过SELECT pg_terminate_backend(pid)可以杀掉想要的会话。yxptest=# SELECT pg_terminate_backend(38531);

会话端会出现如下界面

2. 库外使用pg_ctl命令

pg_ctl kill       SIGNALNAME PID

SIGNALNAME 的含义

千万不要kill -9!!!

二. 删用户

pg建用户很简单,和我们经常操作的一样,但是删除的时候,可能让很多人头疼不已,因为会报很多依赖关系的错误。

有一个方式可以把用户的依赖全部删除,相应的后果就是用户相关的对象一并删除,属于高危操作。

下面我建一个简单用户和一个测试表

yxptest=# create user test ENCRYPTED password 'Hb_bss2021';yxptest=# \c yxptest yxptest=# create schema test authorization test;yxptest=# create table t1(id int);

这里我们可以看到schema和talbe的owner都是test。

我们做下删除操作

yxptest=> \c yxptest root
yxptest=# drop user test;

这样的删除操作,是会报依赖关系的错误。

常规办法,是一个个解除依赖,但是pg有个快速的方法,如下所示

yxptest=# drop owned by test cascade;yxptest=# drop user test;

这样的方法虽然省事,但是有个致命的问题,我们需要知道。

drop owned by test cascade 会把所有对象的owner是test的删除,包括数据之类的。

这点我们需要再三确认,如果不是很确定,可以先做一个如下操作。

yxptest=# REASSIGN OWNED BY test TO root;
yxptest=# drop user test;

这样可以确保这个用户下的对象的保留。

运维的坑总会不经意间出现,记得填好自己。

END

更多精彩干货分享

点击下方名片关注

IT那活儿

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论