PostgreSQL


介绍

PGSQL

  • 开源
  • 关系型数据库
  • 底层基于C实现
  • BDS协议

版本选择

  • 如果为了稳定的运行,推荐使用12.x版本
  • 如果想体验新特性,推荐使用14.x版本

PGSQL允许跨版本升级,而且没有什么大问题

PGSQL国外使用的比较多,国内以MySQL为主

很多国产数据库基于PGSQL做的二次封装:比如华为GaussDB还有腾讯的Tbase等等

PGSQL因为开源,有很多数据迁移的工具,可以快速的从MySQL,SQLServer,Oracle平转到PGSQL中,比如pgloader

对比MySQL

MySQL PGSQL
数据类型不够丰富 数据类型丰富
不支持序列概念,Sequence 有序列的概念的
性能优化监控工具不是很多,定位问题的成本是比较高 插件丰富
主从复制没有一个官方的同步策略,同步问题难以解决。 支持主从复制的同步操作,可以实现数据的0丢失,PostgreSQL的MVCC实现和MySQL不大一样,一行数据会存储多个版本。最多可以存储40亿个事务版本

安装

推荐Linux,不推荐Windows安装

Linux的版本尽量使用7.x版本,最好是7.6或者是7.8版本

官方下载地址

# 下载PGSQL的rpm包
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装客户端
sudo yum install postgresql12
# 安装服务端(可选)
sudo yum install -y postgresql12-server
# 数据库初始化并开机自启
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12
# 配置防火墙
firewall-cmd --permanent --add-port=5432/tcp  
firewall-cmd --permanent --add-port=80/tcp  
firewall-cmd --reload

配置

安装成功,默认创建用户:postgres

配置和数据路径:/var/lib/pgsql/12/data

postgreSQL的核心文件,都属于postgres用户

远程连接

PostgreSQL默认情况下不支持远程连接

  • MySQL给mysql.user追加用户,一般是采用grant的命令
  • PostgreSQL要基于配置文件修改,才能制定用户是否可以远程连接

1、修改配置文件 ../data/pg_hba.conf,(用户级)

# 第一块
local:代表本地连接,host代表可以指定连接的ADDRESS
# 第二块
database编写数据库名,如果写all,代表所有库都可以连接
# 第三块
user编写连接的用户,可以写all,代表所有用户
# 第四块
address代表那些IP地址可以连接
# 第五块
method加密方式,这块不用过多关注,直接md5
# 允许任意地址的全部用户连接所有数据库
host    all             all             0.0.0.0/0               md5

img

2、修改配置配置在postgresql.conf(服务级)

默认PGSQL只允许localhost连接,修改为*,允许所有地址连接,或者指定放行的地址

img

重启服务生效

sudo systemctl restart postgresql-12

日志

默认情况下,只保存7天的日志,循环覆盖

# 代表日志是开启的。
logging_collector = on
# 日志存放的路径,默认放到当前目录下的log里
log_directory = 'log'
# 日志的文件名,默认是postgresql为前缀,星期作为后缀
log_filename = 'postgresql-%a.log'
# 默认一周过后,日志文件会被覆盖
log_truncate_on_rotation = on
# 一天一个日志文件
log_rotation_age = 1d
# 一个日志文件,没有大小限制
log_rotation_size = 0

img

基本命令

postgresql数据管理系统使用命令方式有两种:
\1. 内部命令,以反斜线开始 \ ,如: \l 显示所有数据库
\2. 标准SQL命令,以分号;或 \g 结束,可以使用多行

连接参数

img

# 切换用户并连接 - 在postgres用户下
su postgres
psql -U postgres # 快速登录(全部使用默认设置)
# 切换用户并连接 - 非postgres用户下
psql -h 127.0.0.1 -p 5432 -U postgres  # 默认打开postgres数据库
psql -h 127.0.0.1 -p 5432 -d dba -U postgres  # 打开dba数据库
Password for user postgres:

# 设置用户密码
ALTER USER postgres WITH PASSWORD 'postgres' 

# 数据库命令
\l                         # 列出所有数据库
\c database     # 选择database库
\dt                     # 查看所有表
\c interface     # 切换数据库
select * from apps limit 1;  # 查看某个库中某个表的记录
\encoding         # 显示字符集
\q                      # 退出

\d table             # 查看table表结构


\h                         # 显示 SQL 命令的说明
\h select       # 精细显示SQL命令中的select命令的使用方法
\?                      # 显示 pgsql 命令的说明 (pgsql内部命令)

\password postgres # 重新设置用户postgres的密码,然后需要 \q退出后才生效

\du           # 显示所有用户
\conninfo     # 显示当前数据库和连接信息
\e                       # 进入记事本sql脚本编辑状态(输入批命令后关闭将自动在命令行中执行)
\di                      # 查看索引(要建立关联)
\prompt [文本] 名称                   # 提示用户设定内部变数
\encoding [字元编码名称]          # 显示或设定用户端字元编码
# 可以将存储过程写在文本文件中aaa.sql,然后在psql状态下:
\i aaa.sql                                    # 将aaa.sql导入(到当前数据库)
\df                                           # 查看所有存储过程(函数)
\df+ name                                     # 查看某一存储过程
select version();            # 获取版本信息
select usename from pg_user; # 获取系统用户信息
drop User username           # 删除用户

# 可以使用pg_dump和pg_dumpall来完成。比如备份sales数据库: 
pg_dump drupal>/opt/Postgresql/backup/1.bak

SELECT pg_size_pretty(pg_database_size('mydatabase')); # 查看数据库占用磁盘空间大小
\help

General

\copyright show PostgreSQL usage and distribution terms

\g [FILE] or ; execute query (and send results to file or |pipe)

\h [NAME] help on syntax of SQL commands, * for all commands

\q quit psql

Query Buffer

\e [FILE] [LINE] edit the query buffer (or file) with external editor

\ef [FUNCNAME [LINE]] edit function definition with external editor

\p show the contents of the query buffer

\r reset (clear) the query buffer

\s [FILE] display history or save it to file

\w FILE write query buffer to file

Input/Output

\copy ... perform SQL COPY with data stream to the client host

\echo [STRING] write string to standard output

\i FILE execute commands from file

\o [FILE] send all query results to file or |pipe

\qecho [STRING] write string to query output stream (see \o)

Informational

(options: S = show system objects, + = additional detail)

\d[S+] list tables, views, and sequences

\d[S+] NAME describe table, view, sequence, or index

\da[S] [PATTERN] list aggregates

\db[+] [PATTERN] list tablespaces

\dc[S] [PATTERN] list conversions

\dC [PATTERN] list casts

\dd[S] [PATTERN] show comments on objects

\ddp [PATTERN] list default privileges

\dD[S] [PATTERN] list domains

\det[+] [PATTERN] list foreign tables

\des[+] [PATTERN] list foreign servers

\deu[+] [PATTERN] list user mappings

\dew[+] [PATTERN] list foreign-data wrappers

\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions

\dF[+] [PATTERN] list text search configurations

\dFd[+] [PATTERN] list text search dictionaries

\dFp[+] [PATTERN] list text search parsers

\dFt[+] [PATTERN] list text search templates

\dg[+] [PATTERN] list roles

\di[S+] [PATTERN] list indexes

\dl list large objects, same as \lo_list

\dL[S+] [PATTERN] list procedural languages

\dn[S+] [PATTERN] list schemas

\do[S] [PATTERN] list operators

\dO[S+] [PATTERN] list collations

\dp [PATTERN] list table, view, and sequence access privileges

\drds [PATRN1 [PATRN2]] list per-database role settings

\ds[S+] [PATTERN] list sequences

\dt[S+] [PATTERN] list tables

\dT[S+] [PATTERN] list data types

\du[+] [PATTERN] list roles

\dv[S+] [PATTERN] list views

\dE[S+] [PATTERN] list foreign tables

\dx[+] [PATTERN] list extensions

\l[+] list all databases

\sf[+] FUNCNAME show a function's definition

\z [PATTERN] same as \dp

Formatting

\a toggle between unaligned and aligned output mode

\C [STRING] set table title, or unset if none

\f [STRING] show or set field separator for unaligned query output

\H toggle HTML output mode (currently off)

\pset NAME [VALUE] set table output option

(NAME := {format|border|expanded|fieldsep|footer|null|

numericlocale|recordsep|tuples_only|title|tableattr|pager})

\t [on|off] show only rows (currently off)

\T [STRING] set HTML <table> tag attributes, or unset if none

\x [on|off] toggle expanded output (currently off)

Connection

\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}

connect to new database (currently "postgres")

\encoding [ENCODING] show or set client encoding

\password [USERNAME] securely change the password for a user

\conninfo display information about current connection

Operating System

\cd [DIR] change the current working directory

\timing [on|off] toggle timing of commands (currently off)

\! [COMMAND] execute command in shell or start interactive shell

Variables

\prompt [TEXT] NAME prompt user to set internal variable

\set [NAME [VALUE]] set internal variable, or list all if no parameters

\unset NAME unset (delete) internal variable

Large Objects

\lo_export LOBOID FILE

\lo_import FILE [COMMENT]

\lo_list

\lo_unlink LOBOID large object operations

用户操作

构建用户

# 区别就是create user默认有连接权限,create role没有,不过可以基于选项去设置
CREATE USER 名称 [ [ WITH ] 选项 [ ... ] ]
create role 名称 [ [ WITH ] 选项 [ ... ] ]

构建超级管理员用户

create user root with SUPERUSER PASSWORD 'root';

此时不能登录,该用户没有数据库,需要创建这个用户所属数据库

create database root;
psql -h 192.168.11.32 -p 5432 -U root -W # 再去登录

权限操作

img

可以看到PGSQL一个数据库中有多个schema,在每个schema下都有自己的相应的库表信息,权限粒度会比MySQL更细一些

在PGSQL中,权限的管理分为很多层:

server、cluster、tablespace级别:这个级别一般是基于pg_hba.conf去配置

database级别:通过命令级别操作,grant

namespace、schema级别:用的不多

对象级别:通过grant命令去设置

后面如果需要对database或者是对象级别做权限控制,直接基于grant命令去操作即可

\help grant # 查看grant命令

数据类型

PGSQL支持的类型特别丰富,大多数的类型和MySQL都有对应的关系

img

等等

其他

删除重复记录

在PostgreSQL删除重复记录的表中table加一列rownum字段(id为table表中的主键) ,类型设置为serial类型即可,然后执行sql语句:

delete from deltest where rownum not in(
select max(rownum) from deltest 
);

最后删除列rownum即可

图形化界面安装

图形化界面可以连接PGSQL的很多,Navicat(收费)

也可以直接使用PostgreSQL官方提供的图形化界面pgadmin(免费)

python连接脚本

import psycopg2

try:
    # 数据库连接参数
    params = {
        "host": "127.0.0.1",  # 数据库服务器地址
        "database": "intelligence",  # 数据库名称
        "user": "postgres",  # 默认用户
        "password": "123456",  # 默认用户的密码
        "port": "5432"  # PostgreSQL的默认端口
    }
    query = """
        SELECT i.ip, ii.found_time, ii.update_time, t.name, t.threat_level
        FROM ip i
        JOIN ip_intelligence ii ON i.id = ii.ip_id
        JOIN intelligence_tag it ON ii.id = it.intelligence_id
        JOIN tag t ON it.tag_id = t.id
        LIMIT 10;
    """

    # 建立连接
    conn = psycopg2.connect(**params)

    # 创建游标对象
    cur = conn.cursor()

    # 执行SQL查询
    cur.execute(query)

    # 获取查询结果
    results = cur.fetchall()
    
    # 打印结果
    for row in results:
        # print(f"IP: {row[0]}, Found Time: {row[1]}, Update Time: {row[2]}, Name: {row[3]}, Threat Level: {row[4]}")
        # datetime.datetime格式转换为时间戳格式
        print(f"IP: {row[0]}, Found Time: {int(row[1].timestamp())}, Update Time: {int(row[2].timestamp())}, Name: {row[3]}, Threat Level: {row[4]}")

except (Exception, psycopg2.DatabaseError) as error:
    print("Error while connecting to PostgreSQL", error)
    
finally:
    # 关闭数据库连接
    if conn is not None:
        conn.close()

数据类型、索引、视图、触发器、事务、并发、MVCC、锁、备份&恢复、数据迁移、主从操作


文章作者: Nico
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Nico !
  目录