进击的PostgreSQL

news/2024/7/9 21:58:44 标签: postgresql, 数据库

目录

前言

一、什么是PostgreSQL

1.PostgreSQL的定义

2.PostgreSQL功能和特性

2.1数据类型

2.2数据完整性

2.3并发性、性能

2.4可靠性、灾难恢复

2.5安全

2.6扩展

2.7国际化、文本搜索

二、部署PostgreSQL

1.下载与安装

2.配置数据库

3.配置远程访问

4.修改配置文件

5.常用命令

5.1数据库

5.2数据表 

5.3数据库备份与还原


前言

PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。

一、什么是PostgreSQL

1.PostgreSQL的定义

PostgreSQL 是一款开源的、免费的关系型数据库管理系统。它具有以下特点:

  • 高度可扩展: PostgreSQL 允许在不同规模的应用程序中灵活扩展,从小型网站到大型企业级系统都可以使用。
  • 支持复杂数据类型: 除了常见的数据类型外,PostgreSQL 还支持 JSON、数组、范围、几何图形、全文搜索等多种复杂数据类型。
  • ACID 兼容: 它严格遵循 ACID(原子性、一致性、隔离性、持久性)属性,确保数据的完整性和一致性。
  • 丰富的扩展支持: PostgreSQL 提供了丰富的扩展支持,允许开发人员自定义和添加功能,以满足各种需求。
  • 高级优化器: 它具有强大的查询优化器,能够自动优化查询以提高性能。

 官网:PostgreSQL: The world's most advanced open source database

2.PostgreSQL功能和特性

  • 多版本并发控制(MVCC) PostgreSQL 使用多版本并发控制来管理事务,这意味着它可以支持高并发访问,每个事务都可以看到一致的快照数据。
  • 外键支持 PostgreSQL 提供了完整的外键支持,可以维护表之间的关联关系,并确保数据的完整性。
  • 复杂查询 PostgreSQL 支持复杂查询,包括联接、子查询、窗口函数等,使您能够灵活地查询和分析数据。
  • 全文搜索 它内置了全文搜索功能,允许您执行高效的文本搜索和分析。
  • 复制和高可用性 PostgreSQL 提供了复制和高可用性解决方案,包括流复制、逻辑复制和自动故障转移。

2.1数据类型

  • 基元:整数、数字、字符串、布尔值
  • 结构化:日期/时间、数组、范围/多范围、UUID
  • 文档:JSON/JSONB、XML、KEY-VALUE (HSTORE)
  • 几何:点、线、圆、多边形
  • 自定义:复合、自定义类型

2.2数据完整性

  • 唯一,不为空
  • 主键
  • 外键
  • 排除约束
  • 显式锁、咨询锁

2.3并发性、性能

  • 索引:B 树、多列、表达式、部分索引
  • 高级索引:GiST,SP-Gist,KNN Gist,GIN,BRIN,覆盖索引,布隆过滤器
  • 复杂的查询规划器/优化器,仅索引扫描,多列统计信息
  • 事务,嵌套事务(通过保存点)
  • 多版本并发控制 (MVCC)
  • 并行化读取查询和构建 B 树索引
  • 表分区
  • SQL 标准中定义的所有事务隔离级别,包括可序列化
  • 表达式的实时 (JIT) 编译

2.4可靠性、灾难恢复

  • 预写日志记录 (WAL)
  • 复制:异步、同步、逻辑
  • 时间点恢复 (PITR),活动备用
  • 表空间

2.5安全

  • 身份验证:GSSAPI、SSPI、LDAP、SCRAM-SHA-256、证书等
  • 强大的门禁系统
  • 列级和行级安全性
  • 使用证书和其他方法进行多重身份验证

2.6扩展

存储函数和过程
过程语言:PL/pgSQL、Perl、Python 和 Tcl。还有其他语言可以通过扩展使用,例如Java,JavaScript(V8),R,Lua和Rust。
SQL/JSON 路径表达式
外部数据包装器:使用标准 SQL 接口连接到其他数据库或流
可定制的表存储界面
许多提供附加功能的扩展模块,包括 PostGIS

2.7国际化、文本搜索

  • 支持国际字符集,例如通过 ICU 排序规则
  • 不区分大小写和不区分重音的排序规则
  • 全文搜索

二、部署PostgreSQL

1.下载与安装

// 下载
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
// 安装
yum install -y postgresql15-server
// 初始化数据库
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
// 设置开机启动
sudo systemctl enable postgresql-15


安装完成后会默认创建账户postgresql,默认数据库postgres  存储数据库的基础信息
[root@localhost ~]#tail -n1 /etc/passwd
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
[root@localhost ~]#grep postgres /etc/shadow
postgres:!!:19801::::::

2.配置数据库

[root@localhost ~]#su postgres
#切换到postgres用户
bash-4.2$ 
bash-4.2$ 
bash-4.2$ 
bash-4.2$ 
bash-4.2$ psql
#切换SQL模式
could not change directory to "/root"
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# alter user postgres with password 'postgres123';
#修改密码
ALTER ROLE
postgres=# create user test with password 'test';
#创建test用户
CREATE ROLE
postgres=# \q
#退出SQL模式
bash-4.2$ exit
#退出postgres用户
[root@localhost ~]#

3.配置远程访问

将5432端口添加到防火墙列表

// 打开防火墙端口
sudo firewall-cmd --add-port=5432/tcp --permanent
// 刷新防火墙
sudo firewall-cmd --reload
[root@localhost ~]#systemctl start firewalld
[root@localhost ~]#sudo firewall-cmd --add-port=5432/tcp --permanent
success
[root@localhost ~]#sudo firewall-cmd --reload
success

4.修改配置文件

修改监听地址为任意地址,即修改postgresql.conf文件

// 打开配置文件
vi /var/lib/pgsql/15/data/postgresql.conf
// 打开监听注释,监听地址改为*
listen_addresses = '*'
// 保存退出 esc
:wq
[root@localhost ~]#vim /var/lib/pgsql/
15/            .bash_history  .bash_profile  .psql_history  
[root@localhost ~]#vim /var/lib/pgsql/15/data/postgresql.conf 
[root@localhost ~]#sed -n '60p' /var/lib/pgsql/15/data/postgresql.conf 
listen_addresses = '*'		# what IP address(es) to listen on;

5.常用命令

5.1数据库

// 切换到postgres用户
su postgres
// 创建数据库 mydb
create database mydb;
// 查看所有数据库
\l
// 切换到mydb数据库
\c mydb
// 删除
drop database mydb;
[root@localhost ~]#su postgres
bash-4.2$ psql
could not change directory to "/root"
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# create database mydb;
CREATE DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privil
eges   
-----------+----------+----------+-------------+-------------+----------------
-------
 mydb      | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 postgres  | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
 template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres    
      +
           |          |          |             |             | postgres=CTc/po
stgres
 template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres    
      +
           |          |          |             |             | postgres=CTc/po
stgres
(4 rows)

postgres=# create database mydb;
错误:  数据库 "mydb" 已经存在
postgres=# \c mydb
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
You are now connected to database "mydb" as user "postgres".
mydb=# drop database mydb;
错误:  无法删除当前使用的数据库
mydb=# \q
bash-4.2$ psql
could not change directory to "/root"
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# drop database mydb;
DROP DATABASE
postgres=# \c mydb;
连接到套接字"/run/postgresql/.s.PGSQL.5432"上的服务器失败:致命错误:  数据库 "mydb" 不存在
Previous connection kept
postgres=# \q
bash-4.2$ exit

5.2数据表 

// 创建表
create table business_order(id serial primary key,order_no varchar(255),sku_name varchar(255));
// 插入数据
insert into business_order(order_no,sku_name)values('20221126000001','iphone14 plus');
// 查看表内容
select * from business_order;
// 查看表结构
\d business_order
// 查看所有表,序列等
\d
[root@localhost ~]#su postgres
bash-4.2$ psql
could not change directory to "/root"
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# create table business_order(id serial primary key,order_no varchar(255),sku_name varchar(255));
CREATE TABLE
postgres=# insert into business_order(order_no,sku_name)values('20240319000001','Huawei p60');
INSERT 0 1
postgres=# select * from business_order;
 id |    order_no    |  sku_name  
----+----------------+------------
  1 | 20240319000001 | Huawei p60
(1 row)

postgres=# \d business_order
错误:  字段 c.relhasoids 不存在
第1行..., c.relhasindex, c.relhasrules, c.relhastriggers, c.relhasoi...
                                                          ^
postgres=# \d business_order;
错误:  字段 c.relhasoids 不存在
第1行..., c.relhasindex, c.relhasrules, c.relhastriggers, c.relhasoi...
                                                          ^
postgres=# \d
                  List of relations
 Schema |         Name          |   Type   |  Owner   
--------+-----------------------+----------+----------
 public | business_order        | table    | postgres
 public | business_order_id_seq | sequence | postgres
(2 rows)

postgres=# \q
bash-4.2$ exit

5.3数据库备份与还原

实际工作中会对数据库进行备份和还原,备份主要有三种格式

  • .bak 即压缩的二进制
  • .sql 即明文存储
  • .tar 即tarball压缩格式

数据库备份分数据库备份,使用 pg_dump 命令;所有数据库备份,使用 pg_dumpall 命令。

// 切换到postgres用户
su postgres
// 单数据库备份-导出到当前目录
pg_dump mydb > mydb.bak
// 所有数据库备份,
pg_dumpall > backup.bak
// 整个数据库备份到指定位置
pg_dump -f /tmp/mydb.bak mydb
// 备份postgres数据库中business_order表
pg_dump -U postgres -f /tmp/mydb.sql -t business_order postgres
// 数据库恢复-直接恢复,注意先新增空数据库
psql -f /tmp/mydb.bak mydb
// 数据库恢复
pg_restore -U postgres -d business_order /temp/mydb.bak
// 查看目录
ls -l
[root@localhost ~]#su postgres
bash-4.2$ psql
could not change directory to "/root"
psql (9.2.24, server 15.6)
WARNING: psql version 9.2, server version 15.0.
         Some psql features might not work.
Type "help" for help.

postgres=# pg_dump mydb > mydb.bak
postgres-# pg_dumpall > backup.bak
postgres-# pg_dump -f /tmp/mydb.bak mydb
postgres-# pg_dump -U postgres -f /tmp/mydb.sql -t business_order postgres
postgres-# psql -f /tmp/mydb.bak mydb
postgres-# pg_restore -U postgres -d business_order /temp/mydb.bak
postgres-# ls -l
postgres-# ll
postgres-# \q
bash-4.2$ exit

异常处理:Navicat连接报错

错误代码:authentication method 10 not supported
处理方案:在 pg_hba.conf 文件中可将新增的 0.0.0.0/0 的模式改为 trust


http://www.niftyadmin.cn/n/5439363.html

相关文章

在Qt中使用线程类QThread

说明 QThread是qt中的一个线程类。目前我了解到的共有两种用法,一种是作为普通的线程,就像c标准库中的std::thread一样,另一种就是作为信号槽的容器,负责调用qt的事件循环。 作为普通线程 重载QThread::run()这个虚函数&#x…

原型,模板,策略,适配器模式

原型模式 原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。 总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型…

leetcode-hot100-图论

200. 岛屿数量 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假…

OpenJudge - 13:大整数的因子

总时间限制: 1000ms 内存限制: 65536kB 描述 已知正整数k满足2<k<9&#xff0c;现给出长度最大为30位的十进制非负整数c&#xff0c;求所有能整除c的k。 输入 一个非负整数c&#xff0c;c的位数<30。 输出 若存在满足 c%k 0 的k&#xff0c;从小到大输出所有这样的…

MySQL事务隔离级别及MVCC详解

MySQL的事务隔离级别及特性如下&#xff1a; SERIALIZABLE&#xff08;串行化&#xff09;&#xff1a;无问题&#xff0c;性能差&#xff1b; REPEATABLE-READ&#xff08;可重复读&#xff09;&#xff1a;幻读&#xff0c;默认隔离级别&#xff1b; READ-COMMITTED&#xf…

Springboot笔记-03

1.properties配置文件 #配制oerson的值 person.lastname张三 person.age12 person.birth2017/12/12 person.bossfalse person.dog.namedag person.dog.age15 person.maps.k1v1 person.maps.k212 person.listsa,b,c运行结果乱码 因为idea默认是utf-8编码而properties是ascall编…

MySQL的锁的类型

乐观锁与悲观锁&#xff1a; 乐观锁&#xff08;Optimistic Lock&#xff09;通常不直接锁定数据&#xff0c;而是在更新时检查数据是否已被其他事务修改。如果发现冲突&#xff0c;则放弃本次操作或重试。 悲观锁&#xff08;Pessimistic Lock&#xff09;则是在操作数据之前…

【Godot4.2】2D导航02 - AstarGrid2D及其使用方法

概述 AstarGrid2D是Godot4.0新增的A*寻路辅助类型。可以看做是Astar2D的加强版。它允许你通过设置其size和cell_size属性来创建一个虚拟的网格。 并使用set_point_solid()这样的方法来在指定位置创建障碍物。 AstarGrid2D的好处是你不再需要手动的添加点以及点与点之间的连接…