天天看点

PostgreSQL PG数据库 相关

PostgreSQL PG

2019/09/12 Chenxin

简介

PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。PostgreSQL最初设想于1986年,当时被叫做Berkley Postgres Project。该项目一直到1994年都处于演进和修改中,直到开发人员Andrew Yu和Jolly Chen在Postgres中添加了一个SQL(Structured Query Language,结构化查询语言)翻译程序,该版本叫做Postgres95,在开放源代码社区发放。

安装与部署

加入系统镜像

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

安装客户端

yum install postgresql11

安装服务端

yum install postgresql11-server

安装生成文件

[root@localhost ~]# tree /var/lib/pgsql/  这里存放数据文件
/var/lib/pgsql/
└── 11
    ├── backups
    └── data    当前为空
[root@localhost pgsql-11]# pwd      这里存放二进制和说明手册
/usr/pgsql-11
[root@localhost pgsql-11]# ls
bin  lib  share
           

初始化数据库

/usr/pgsql-11/bin/postgresql-11-setup initdb

[root@localhost 11]# ls /var/lib/pgsql/11/data/ 原先为空,生成很多数据文件
base    log           pg_dynshmem  pg_ident.conf  ...
           

设置开机启动

systemctl enable postgresql-11

systemctl start postgresql-11

配置

允许外部连接,包含端口: 5432配置
vim /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = \'*\'  或 listen_addresses = \'you_ip\'

修改认证方式为md5(不适合sonar,sonar调用JDBC用的是明文密码)
vim /var/lib/pgsql/11/data/pg_hba.conf 
# TYPE  DATABASE  USER     ADDRESS    METHOD
host    all       all     0.0.0.0/0 md5

适合sonar方式
...
# IPv4 local connections:
host    all   all    127.0.0.1/32    password #默认的ident修改为password.
...

具体的认证方式说明,请参考本文"权限"章节.
           

重启

systemctl restart postgresql-11

修改默认用户密码

su postgres
$ psql
postgres=# \password postgres
或
sudo -u postgres psql postgres
# \password postgres
Enter new password: 这里暂时配置为 PGsqlLG2019
           

其他

暂时无需执行

yum install postgresql11-devel postgresql11-llvmjit

登陆与操作指令

  • ssh登陆机器后,su postgres

    $ psql 进入sql命令行模式,如下

postgres=# 在此提示符后输入指令
           

再比如

bash-4.2$ psql -U postgres -d postgres
psql (11.5)
输入 "help" 来获取帮助信息.
postgres=# 
           
  • pg的sql指令
默认的用户和数据库名称都是postgres
psql -U user -d dbname

切换数据库,相当于mysql的use dbname
\c dbname

列举数据库,相当于mysql的show databases
\l

列举表,相当于mysql的show tables
\dt

查看表结构,相当于desc tblname,show columns from tbname
\d tblname

\di 查看索引 

创建数据库: 
create database [数据库名]; 

删除数据库: 
drop database [数据库名];  

重命名一个表: 
alter table [表名A] rename to [表名B]; 

删除一个表: 
drop table [表名]; 

在已有的表里添加字段: 
alter table [表名] add column [字段名] [类型]; 

删除表中的字段: 
alter table [表名] drop column [字段名]; 

修改数据库列属性
alter table 表名 alter 列名 type 类型名(350)

重命名一个字段:  
alter table [表名] rename column [字段名A] to [字段名B]; 

给一个字段设置缺省值:  
alter table [表名] alter column [字段名] set default [新的默认值];

去除缺省值:  
alter table [表名] alter column [字段名] drop default; 

在表中插入数据: 
insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......); 

修改表中的某行某列的数据: 
update [表名] set [目标字段名]=[目标值] where [该行特征]; 

删除表中某行数据: 
delete from [表名] where [该行特征]; 
delete from [表名];--删空整个表 

创建表: 
create table ([字段名1] [类型1] ;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;); 

\copyright     显示 PostgreSQL 的使用和发行条款
\encoding [字元编码名称] 显示或设定用户端字元编码
\h [名称]      SQL 命令语法上的说明,用 * 显示全部命令
\prompt [文本] 名称 提示用户设定内部变数
\password [USERNAME] securely change the password for a user
\q             退出 psql

           

权限

从pg_hba.conf文件谈postgresql的连接认证

1./var/lib/pgsql/11/data/pg_hba.conf 配置文件示例

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
#local   all             all                                     trust
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
#host    all             all             127.0.0.1/32            trust
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

# Add this line by handful.
# host    all             all             0.0.0.0/0               md5
           

有以下几个类型

TYPE DATABASE USER ADDRESS METHOD

2.TYPE连接方式

local: Unix 域套接字

host: TCP/IP网络进行的联接.匹配通过 ssl/非ssl 方式的连接。要使用该选项你要在postgresql.conf文件里设置listen_address选项.默认的行为是只在localhost上监听本地连接.

hostssl: 这条记录匹配通过在TCP/IP上进行的SSL联接企图。要使用该选项,服务器编译时必须使用--with-openssl选项,并且在服务器启动时ssl设置是打开的.

hostnossl: 这个和上面的hostssl相反,只匹配通过在TCP/IP上进行的非SSL联接企图。

3.数据库(database)

声明记录所匹配的数据库。

值 all 表明该记录匹配所有数据库;

值 sameuser表示如果被请求的数据库和请求的用户同名,则匹配;

值samegroup 表示请求的用户必须是一个与数据库同名的组中的成员;

值 replication 表示匹配一条replication连接,它不指定一个特定的数据库,一般在流复制中使用;

在其他情况里,这就是一个特定的 PostgreSQL 数据库的名字。 我们可以通过用逗号分隔的方法声明多个数据库。 一个包含数据库名的文件可以通过对该文件前缀 @ 来声明.该文件必需和 pg_hba.conf 在同一个目录。

4.用户名(user)

为这条记录声明所匹配的 PostgreSQL 用户,值 all 表明它匹配 于所有用户。否则,它就是特定 PostgreSQL 用户的名字,多个用户名可以通过用逗号分隔的方法声明,在名字前面加上+代表匹配该用户组的所有用户。一个包含用户名的文件可以 通过在文件名前面前缀 @ 来声明,该文件必需和 pg_hba.conf 在同一个目录。

5.主机地址(address)

指定匹配的客户端的地址,它可以是一个主机名,一个IP地址范围,或者下面提到的这些选项。

一个IP地址范围是一个标准的点分十进制表示的 IP地址/掩码值。注意, 在\'IP地址\',\'/\'和\'掩码值\'之间不要有任何的空白字符。

比如对于IPv4地址来说, 172.20.143.89/32指定单个主机的IP,172.20.143.0/24代表一个小的子网。对于IPv6地址来说,::1/128指定单个主机(这里是本机环回地址),fe80::7a31:c1ff:0000:0000/96 指定一个IPv6的子网。0.0.0.0/0代表所有IPv4地址,::0/0代表所有IPv6地址。

一个IPv4地址选项只能匹配IPv4地址,一个IPv6地址选项只能匹配IPv6地址,即使给出的地址选项在IPV4和IPv6中同时存在。

当然你可以使用 all 选项来匹配所有的IP地址,使用 samehost 匹配服务器自己所有的IP地址,samenet来匹配服务器直接接入的子网。

如果指定的是主机名(既不是IP地址也不是上面提到的选项),这个主机名将会和发起连接请求的客户端的IP地址的反向名称解析结果(即通过客户端的IP解析其主机名,比如使用反向DNS查找)进行比对,如果存在匹配,再使用正向名称解析(例如DNS查找)将主机名解析为IP地址(可能有多个IP地址),再判断客户端的IP地址是否在这些IP地址中。如果正向和反向解析都成功匹配,那么就真正匹配这个地址(所以在pg_nba.conf文件里的主机地址必须是客户端IP的 address-to-name 解析返回的那个主机名。一些主机名数据库允许将一个IP地址和多个主机名绑定,但是在解析IP地址时,操作系统只会返回一个主机名)。

有些主机名以点(.)开头,匹配那些具有相同后缀的主机名,比如.example.com匹配foo.example.com(当然不仅仅只匹配foo.example.com)。

还有,在pg_hba.conf文件中使用主机名的时候,你最好能保证主机名的解析比较快,一个好的建议就是建立一个本地的域名解析缓存(比如nscd)。

本选项只能在连接方式是host,hostssl或者hostnossl的时候指定。

ip地址(ip-address)、子网掩码(ip-mask)

这两个字段包含可以看成是标准点分十进制表示的 IP地址/掩码值的一个替代。例如。使用255.255.255.0 代表一个24位的子网掩码。它们俩放在一起,声明了这条记录匹配的客户机的 IP 地址或者一个IP地址范围。本选项只能在连接方式是host,hostssl或者hostnossl的时候指定。

6.认证方法(authentication method)

trust: 无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。

reject: 联接无条件拒绝,常用于从一个组中"过滤"某些主机。

md5: 要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。

password: 和"md5"一样,但是口令是以明文形式在网络上传递的,我们不应该在不安全的网络上使用这个方式。

gss: 使用GSSAPI认证用户,这只适用于 TCP/IP 连接。

sspi: 使用SSPI认证用户,这只适用于 Windows 连接。

peer: 获取客户端的操作系统的用户名并判断他是否匹配请求的数据库名,这只适用于本地连接。

ldap: 使用LDAP服务进行验证。

radius: 使用RADIUS服务进行验证。

cert: 使用SSL服务进行验证。

pam: 使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)(PAM)来认证。

ident: 在PG11版本中默认有很多这个方式.

权限的其他建议

pg_hba.conf文件是如此重要,我们最好在建立数据库的时候就将它配置好,免得后来配置环境时出一些奇奇怪怪的错误。

在修改pg_hba.conf文件后一定要记得

pg_ctl reload 一下( systemctl reload postgresql-11.service )。
           

当然,还要做好备份。

配置尽量最小配置,比如指定用户名,数据库和可访问IP地址的时候,就只给最小权限,最小范围就好了,避免自己误操作是一回事。

对于访问认证的控制,除了在pg_hba.conf里面设置外,也应该在数据库里再进一步设置,比如给某个用户只授予所需的最低权限,比如对查询用户就只给所需的某几个数据库数据库的读权限,其他的只给数据库表的增删改查权限等,这里不赘述。

慎用trust认证方式,不要怕偷懒输密码.当然实在怕懒可以设置下.pgpass这个文件,懂得自然懂。

最后,对于系统数据库最好还是设置下reject的吧。

备份恢复

可以使用pg_dump和pg_dumpall来完成。比如备份sales数据库:

pg_dump drupal>/opt/Postgresql/backup/1.bak

其他说明

1.PostgreSQL对表名、字段名都是区分大小写的。

在图形化界面可以正常新建。用SQL语句的时候需要加双引号,如果jdbc查询等处,记得使用转义符号。

2.PostgreSQL在SQL语句中对大小写是不敏感的

例如 select ID from t_user 和 select id from t_user 都会从t_user这个表中查询id这个字段。如果要查询大写字母的字段,同样要加上双引号:select "ID" from t_user