PostgreSQL  读书会   一期  系统目录 和 系统管理   2_postgresql

接上期PostgreSQL  读书会   一期  系统目录   1  --291页


上期讲到如何停止用户正在执行的session,这里PG 提供了不同的方式来终止。这里扩展一下为什么要停止用户的连接。

可以总结出以下原因

1  用户的查询时间较长,已经影响到正常的系统运作,例如vacuum相关的操作。

2  需要进行删除数据库的操作,但是目前需要进行处理的数据库正在被某些线程占用,所以需要清理这些连接的session

3  由于意外,应用程序大量建立与数据库的连接,并达到最大值,需要临时清理一些连接,在进行应用程序处理异常时,进行一些缓解性的操作。并释放相关的浪费的内存。


PG 提供了pg_terminate_backend(pid) 和 pg_cancel_backend(pid) 两钟方式的操作, 这两种方式最大的不同在于, pg_terminate_backend 会将应用程序与PG的连接断开,应用会报失去连接的错误,而pg_cancel_backend则仅仅停止当前的正在执行的事务,而不会将应用程序和数据库之间做一个了断。

这里举例,如果要删除一个数据库,而这个数据库一直有用户连接,即使不断使用pg_terminate_backend 进行操作,还是不能清理相关的连接。

停止test 库

UPDATE pg_database set datallowconn = 'false' WHERE datname = 'test';

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_应用程序_02

通过设置数据库的是否允许连接的状态,来阻止新的连接,再次连接到禁止连接的数据库上就会报错。

所以一件事情,如果系统的来学习,则会发现更多的问题,更多的答案。

在上面的关于数据库连接和断开连接的事情告一段落后,下面就来到了,数据库的配置方面的事情

书中提到,如何获取PostgreSQL 的设置的参数的三种方式

1 通过postgresql.conf 配置文件来获得

2 通过select current_setting('配置的名字‘) 

3 通过show work_mem 的方式来提供


书里没有提出,此处为扩展,虽然三种方式都可以获得PG的配置值,但实际上postgresql.conf 读出是系统的未曾改变的启动后未改变初始值,如果在系统运行期间改变了可以改变的参数值,则通过postgresql.conf 是无法显示的。


修改部分系统值是可以通过 set_config 来做到的

例如


方式1 ,仅仅对当前运行的语句有效


PostgreSQL  读书会   一期  系统目录 和 系统管理   2_数据库_03

方式2 对当前的session 有效

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_应用程序_04


其实两个方式不同的就是 set_config 后的参数true or false ,选择false 则表明在整个session都生效。在打开一个进程,则还是和postgresql.conf 配置文件的值一致。

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_应用程序_05

当然书中也提示,不是所有的配置都能通过set_config 来进行调整,需要重新启动的值是不能通过  set_config 进行调整的。


PostgreSQL  读书会   一期  系统目录 和 系统管理   2_数据库_06


如何快速的获取postgresql中的系统的配置值,也可以通过下面的语句来做到

SELECT name, current_setting(name), source FROM pg_settings
WHERE source IN ('configuration file');

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_postgresql_07


当然查看数据库的容量也是日常系统管理的一个重要的工作


SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database;

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_postgresql_08

SELECT tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables WHERE schemaname ='public';

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_postgresql_09

上面的方式有点类似于oracle 统计schema 中的表的大小,postgresql和sql server 一样,既有一个instance 下多个库的概念也有一个库下多个schema的概念, ORACLE 和 MYSQL 在这两个概念中都有缺失,这里就不扩展了。


常用的PG如何查看当前库的索引的问题

SELECT indexrelid::regclass, pg_size_pretty(pg_relation_size(indexrelid::regclass)) FROM pg_index WHERE indexrelid::regclass::text like 'idx%';

PostgreSQL  读书会   一期  系统目录 和 系统管理   2_应用程序_10

这里需要统一索引的建立的名字的方式,就更能准确的统计所有符合条件的内存的展现和大小了。



其实开始读书会这个想法的起因是,某个抖音中读书会中提出的,知识碎片化的问题,目前大多数人接触的知识大多是碎片化的,包括抖音,或者公众号,大多都是从一个基础上,产生的内容,没有前因后果,他们假设你不必知道前因后果或者你可以自行脑补前因后果。所以就有我第一期的一段话,看似都懂,但细细的想,又什么都不会的原因可能就源于此。


本期就到这里, page 295


PostgreSQL  读书会   一期  系统目录 和 系统管理   2_应用程序_11