一、配置文件
postgresql.conf
该文件包含一些通用设置,比如内存分配、新建database的默认存储位置、PostgresSQL服务器的IP地址,日志的位置以及许多其他设置。
pg_hba.conf
该文件用于控制PostgreSQL服务器的访问权限,具体包括:允许哪些用户连接到哪个数据库,允许哪些IP连接到本服务器,以及指定连接时使用的身份验证模式。
pg_ident.conf
如果该文件存在,则系统会基于文件内容将当前登录的操作系统用户映射为一个PostgreSQL数据库内部用户的身份来登录。有些人会把操作系统的root用户映射为PostgreSQL的postgres超级用户账号。
查找上述配置文件的具体位置,以超级用户的身份链接到任何一个数据库上并执行如下查询语句即可找到。
SELECT name, setting FROM pg_settings WHERE category = 'File Locations';
1.1让配置文件生效
有些配置项修改后需要重启PostgreSQL服务实例才能生效,重启时会关闭所有客户端连接。有的配置项只需重新加载一下配置文件即可生效,伺候连接上来的新用户都会自动读取到新的配置。重新加载配置文件时,原来已连接的用户会话不会受到影响。如果你不确定修改了某个配置后是否需要重启,请查看下该配置项的context属性,如果是postmaster,那么需要重启;如果是user,那么重新加载配置文件即可。
- 重新加载配置文件
pg_ctl reload -D 你的数据目录
如果再redhat linux、centos或者ubuntu等操作系统中以服务的形式安装了PostgreSQL,那么可以使用以下命令:
service postgresql-9.5 reload
命令中的postgresql-9.5是你的服务名。
还有一种加载配置文件的的方法是以超级用户身份登录到任何数据库并执行一下SQL:
SELECT pg_reload_conf();
- 重启PostgreSQL运行实例
一些底层的配置修改后必须重启PostgreSQL服务实例才能生效。PostgreSQL运行实例无法通过执行PostgreSQL本身的命令行来实现重启,只能通过操作系统的命令来实现。在linux/Unix系统上,如果PostgreSQL实例是以服务形式运行的,执行如下命令:
service postgresql-9.6 restart
如果不是以服务形式运行,请执行:
pg_ctl restart -D 你的数据目录
1.2 postgresql.conf
postgreSQL9.4引入一个重要的变更,该版本引入一个新的名为postgresql.auto.conf的配置文件,其中的配置项会覆盖postgresql.conf的同名配置项。建议:不要直接修改postgresql.conf,而是优先修改postgresql.auto.conf。
- 查看postgresql.conf中的配置
通过查询pg_settings视图即可查看所有配置项内容,无须打开配置文件。
SELECT
name,context,unit,setting,boot_val,reset_val
FROM pg_settings
WHERE name IN ('listen_addresses', 'deadlock_timeout', 'shared_buffers', 'effective_cache_size', 'work_mem', 'maintenance_work_mem')
ORDER BY context,name;
(1) context字段代表配置项的作用范围。
context值为usr表示是用户级配置项,它可以被每个用户单独修改,也就是说该配置项针对每个用户都可以是不同的值,用户修改后会在自己的所有会话中生效。如果是一个超级用户修改了一个usr级的配置项,那么所有此后连接上的用户都会将这个修改过的值作为默认值。
context值为superuser表示是超级用户级配置项,只能由超级用户来修改,修改并且重新加载后会在所有用户会话中生效。非超级用户不能在自己的会话中修改覆盖这个值。
context值为postmaster表示是整个服务实例级配置项(postmaster就代表了PostgreSQL服务实例),更改后需要重启PostgreSQL服务才能生效。
(2)setting指当前设置,boot_val是指默认设置,reset_val是指重新启动服务器或重新加载设置之后的新设置。修改了设置后,一定要记得查看一下seting和rest_val并确保二者是一致的,否则说明设置并未生效,需要重新启动服务器或许重新加载设置。
9.5版本中引入一个新的pg_file_settings视图,通过该视图也可以进行配置信息查询,查询该视图会列出每个配置项所属的配置文件。其中applied字段表示该配置项是否已经生效,如果值为f,表示需要重启服务器或者重加载配置文件。如果postgresql.conf和postgresql.auto.conf中存在同名配置,那么后者会覆盖前者,前者在pg_file_settings中对应的条目会显示applied字段为false。
SELECT name,sourcefile,sourceline,setting,applied
FROM pg_file_settings
WHERE name IN ('listen_addresses','deadlock_timeout','shared_buffers','effective_cache_size','work_mem','maintenance_work_mem')
ORDER BY name;
特别注意postgresql.conf和postgresql.auto.conf中的以下网络配置。
listen_addresses
表示PostgreSQL服务使用的IP地址,一般会设置为localhost,表示本机的IPV6或者IPV4地址。设置为 * ,表示使用任意本机IP地址均可连接到PostgreSQL服务。
port
PostgreSQL服务的侦听端口,默认值为5432。
max_connections
系统允许的最大并发连接数。
log_destination
配置日志文件的输出格式而非输出的物理位置。默认值是stdrr。如果希望保存日志内容以做分析,建议设置为csvlog。如果要记录日志,logging_collection配置项为on。
- 修改postgresql.conf中的配置项的值
使用ALTER SYSTEM_SQL命令。例如:
ALTER SYSTEM SET work_mem = '500MB';
该命令不会直接修改postgresql.conf文件本身,而是会去修改postgresql.auto.conf。
如果需要时常修改很多配置项,可以尝试分门别类的存放到多个配置文件中,然后通过postgresql.conf中使用include或者include_if_exists前缀来引入这些配置文件。
include '配置文件名'
这里的配置文件名可以是绝对路径也可以是相对路径,相对路径的起始位置就是postgresql.conf文件本身所在的位置。
1.3 pg_hba.conf
pg_hba.conf文件指定了哪些IP地址和哪些用户可以连接到PostgreSQL数据库,同时还规定了用户必须使用何种身份验证方式登录。针对该文件的修改可动态生效,执行一次配置重加载即可。
TYPE | DATABASE | USER | ADDRESS | METHOD | |
---|---|---|---|---|---|
host | all | all | 127.0.0.1/32 | ident | 1 |
host | all | all | ::1/128 | trust | 2 |
host | all | all | 192.168.54.0/24 | md5 | 3 |
hostssl | all | all | 0.0.0.0/0 | md5 | 4 |
host | replication | all | 127.0.0.1/32 | trust | 5 |
host | replication | all | ::1/128 | trust | 6 |
- 身份验证模式。一般有以下几种常用选项:ident、trust、md5、peer以及password
- 第二项配置IPV6
- 第三项配置IPV4
- 第四项是ssl
- 第五项是允许与本节点构成复制关系的其他PostgreSQL服务器节点的IP网段。
1.3.1身份验证方法
trust
用户无需提供密码就可以连接到数据库。只要源端IP地址、连接用户名、要访问的database名正确,用户就可以连接上。
md5
该模式很常用,要求连接发起者携带用md5算法加密的密码。
password
该模式要求连接发起者携带明文密码进行身份验证。
ident
系统会将请求发起者的操作系统用户映射为PostgreSQL数据库内部用户,并以该内部用户的权限登录,且无需提供密码。windows不支持。
peer
该模式下系统会直接从操作系统内核获取当前发起者的操作系统用户名,如果与其请求连接的PostgreSQL用户名一致,即可连接成功。
cert
该模式要求客户端必须使用SSL方式进行连接。
二、连接管理
2.1. 有些时候我们会需要杀掉正在运行的操作,要想终止正在执行的语句并杀掉连接,请使用以下步骤。
(1). 查询出活动连接列表及其进程ID。
SELECT * FROM pg_stat_activity;
pg_stat_activity视图包含每个连接上最近一次执行的语句、使用的用户名(usename字段)、所在的database名(datname字段)以及语句开始执行的时间。通过查询该视图可以找到需要终止的会话所对应的进程ID。
(2). 取消连接(假设对应的进程号是1234)上的活动查询。
SELECT pg_cancel_backend(1234);
该操作不会终止连接本身。
(3).终止该连接。
SELECT pg_terminate_backend(1234);
如果你未停止某个连接上正在执行的语句就直接终止该连接,那么语句也会被停止掉。
PostgreSQL支持在SELECT查询语句中调用函数。例如:如果你希望一次性终止某个用户的所有连接,那么可以执行以下语句。
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE usename = 'some_role';
2.2 查看被阻塞语句的情况
pg_stat_activity视图中有关于等待锁的语句信息。
wait_even_type 和 wait_even字段记录看当前会话上的语句在等待什么资源。使用wait_event IS NOT NULL 过滤条件来查找被阻塞的语句。
三、角色
PostgreSQL中使用角色(role)机制来处理用户身份认证。拥有登录数据库权限的角色称为可登录角色。
3.1创建可登录角色
在PostgreSQL安装过程中数据初始化阶段,系统会默认创建一个名为postgres的可登录角色(同时会创建一个名为postgres的同名database)。可以用过前面介绍的ident和peer身份验证机制来将操作系统的root用户映射到数据库的postgres角色,这样可以实现root用户免密登录。以postgres角色登录,然后创建其他已经规划好的角色。
(1). 创建具备登录权限的角色。
CREATE ROLE leo LOGIN PASSWORD 'king' VALID UNTIL 'infinity' CREATEDB;
VALID 字句是可选的,其功能是为此角色的权限设定有效期,如果不写则该角色永久有效。CREATEDB 子句表明为此角色赋予了创建新数据库的权限。
(2). 创建一个具备超级用户权限的角色
CREATE ROLE regina LOGIN PASSWORD 'queen' VALID UNTIL '2020-1-1 00:00' SUPERUSR;
要想创建一个超级用户,创建者自身也必须是一个超级用户。