PostgreSQL初试

文章目录

  • 1 PostgreSQL 简介
  • 2 PostgreSQL 与 MySQL 的区别
  • 3 PostgreSQL 的安装
    • 1_Linux部署
    • 2_容器化部署
  • 4 PostgreSQL的配置
    • 1_远程连接配置
    • 2_配置数据库的日志
    • 3_设置数据库密码
  • 5 PostgreSQL 基本操作
    • 1_用户操作
    • 2_权限操作
    • 3_创建一个自己的用户
    • 4_差异补充
  • 6 安装图形化界面
    • 1_使用 pgAdmin(官方推荐)
    • 2_DBeaver(多数据库通用)
    • 3_DataGrip(JetBrains 出品)
    • 4_Navicat for PostgreSQL(商业)
  • 7 总结
    • 1_安全卸载
    • 2_结语

1 PostgreSQL 简介

PostgreSQL 是一个功能强大、开源的对象-关系型数据库系统,以其可靠性、数据完整性、可扩展性而著称,底层使用 C 语言实现。

它采用与 Linux 内核相同的开源协议 —— BSD 协议

这一协议非常宽松,与 MIT 协议类似,允许你在遵守基础条款的前提下进行二次开发,甚至将其商业化并收费。

自 1986 年起由加州大学伯克利分校开始开发,PostgreSQL 目前在全球范围拥有活跃的社区和商业支持。

PostgreSQL 最初的前身是名为 Ingres 的数据库系统。

后来为了改进 Ingres 的架构并解决其存在的问题,开发者将新系统命名为 Postgres,意指 “Ingres 的后继者(Post-Ingres)”。

随后,为了强调其对 SQL 的支持,最终定名为 PostgreSQL

PostgreSQL 拥有一个非常活跃的开源社区,通常每三个月会发布一个小版本,频繁的更新使得常见的 bug 能够被及时修复。

虽然 PostgreSQL 在国外应用广泛,但在国内目前仍以 MySQL 为主流。

不过,许多国产数据库产品都是基于 PostgreSQL 二次开发的,例如:

  • 华为的 GaussDB
  • 腾讯的 TBase

此外,许多企业从 Oracle 迁移数据库时,也选择 PostgreSQL 作为替代方案,各大云厂商(如阿里云、腾讯云、华为云)均已支持 PostgreSQL。

得益于开源生态,PostgreSQL 社区提供了大量的数据迁移工具,方便用户从其他数据库系统平滑迁移(pgloader)。

主要特性:

  • 完整的 ACID 支持
  • 支持复杂查询、并发控制、多版本并发控制(MVCC)
  • 支持存储过程、触发器、自定义类型、扩展模块
  • 原生 JSON/JSONB 支持,适合构建混合结构的数据系统

PostgreSQL 官方网站:https://www.postgresql.org/

PostgreSQL 中文社区:http://www.postgres.cn/index.php/v2/home

2 PostgreSQL 与 MySQL 的区别

技术没有好坏之分,主要看能否解决你的业务需求,其次查看社区的活跃度以及更新的频次。

对比项PostgreSQL 15MySQL 8.0
数据类型丰富(布尔、网络地址、XML、数组…)支持类型较基础
序列(Sequence)机制支持不支持
扩展性高,支持扩展、插件、自定义操作符较低
并发控制MVCC(40 亿事务版本号)MVCC(不同的实现)
高并发读写性能指标强(极限负载)出现波峰后下滑
JSON 支持原生 JSON/JSONB,强大查询功能支持 JSON,但功能弱
同步复制机制异步、同步只支持异步
存储过程支持多种语言(PL/pgSQL、Python、JavaScript 等)主要是 SQL 和最近支持的其他语言
适用场景企业级复杂系统、GIS、大数据处理轻量应用、Web 项目、CMS 系统
开源协议BSD 协议GPL 协议(严格)

总结:MySQL 轻便易用,适合中小项目;PostgreSQL 功能强大,更适合对复杂业务和数据一致性有高要求的系统。


3 PostgreSQL 的安装

仅在Linux中尝试安装,不推荐大家在Windows下安装。

1_Linux部署

进入官网选择Linux和对应的发型商,比如我的是红帽系的系统:

在这里插入图片描述

点击后跳转到如下地址:https://www.postgresql.org/download/linux/redhat/

选择好对应的PostgreSQL版本、服务器型号和架构后将出现安装命令,直接复制即可。

在这里插入图片描述
命令如下(如果网络不好直接粘贴下面命令即可):

# 下载PostgreSQL的rpm包
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PostgreSQL15的软件程序,需要下载,需要等一会,一般不会失败,即便失败,他也会重新帮你找镜像
sudo yum install -y postgresql15-server
# 数据库初始化
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
# 设置开启启动项,并设置为开启自行启动
sudo systemctl enable postgresql-15
# 启动PostgreSQL
sudo systemctl start postgresql-15

可能出现的问题:镜像不存在或镜像仓库问题(可以使用国内镜像源比如阿里镜像站)、插件等相关依赖不存在(配置 Epel 镜像即可解决)、端口占用、Linux网络问题等等。。。。

2_容器化部署

如果有docker直接运行如下命令即可:

# 指定好容器名、用户、密码、默认数据库、容器内数据存放路径、端口号、卷挂载路径
docker run -d \--name postgres \-e POSTGRES_PASSWORD=postgres \-e POSTGRES_USER=postgres \-e POSTGRES_DB=postgres \-e PGDATA=/var/lib/postgresql/data/pg_data \-p 5432:5432 \-v pg_data:/var/lib/postgresql/data/pg_data \postgres:15
# 可以使用 docker volume inspect pg_data 查看挂载路径
# 默认在/var/lib/docker/volumes/pg_data/_data目录下

4 PostgreSQL的配置

要搞两个配置信息,关于PostgreSQL的远程连接配置以及PostgreSQL的日志配置。

配置文件通常位于:

/var/lib/pgsql/<version>/data # version = 15

主要文件:

  • postgresql.conf:设置端口、日志、连接数等
  • pg_hba.conf:配置客户端认证方式(local/host/md5/trust 等)

查看 data 目录下的所有配置文件

ll /var/lib/pgsql/15/data

在这里插入图片描述

上图可以看到,postgreSQL的核心文件,都属于postgres用户,操作的时候,尽可能的别用root用户,容易玩出坑,尽可能先切换到postgres用户。

1_远程连接配置

PostgreSQL默认情况下不支持远程连接的,这个跟MySQL几乎一样。

也就是说PostgreSQL也要基于配置文件修改,才能制定用户是否可以远程连接。

直接去修改pg_hba.conf配置文件,用户以及对应数据库和连接方式的编写模板

在这里插入图片描述

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

在这里插入图片描述

为了实现远程连接,除了用户级别的这种配置,还要针对服务级别修改一个配置,服务级别的配置在postgresql.conf

在这里插入图片描述

发现默认情况下,PostgreSQL只允许localhost连接,直接配置为*即可解决问题,为了生效,一定要记得重启PostgreSQL服务

# postgres密码不管,直接root用户
sudo systemctl restart postgresql-15

2_配置数据库的日志

查看postgresql.conf文件

在这里插入图片描述

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

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

3_设置数据库密码

默认的用户和密码配置

sudo -u postgres psql
\password postgres

5 PostgreSQL 基本操作

由于当前PostgreSQL服务就在本机,所以直接执行以下命令

# 切换到postgres用户
su postgres
# 进入 PostgreSQL 命令行
psql

使用 psql --help,查看psql命令的完整参数如下:

在这里插入图片描述

PostgreSQL中类似于MySQL中的 DQL、DDL、DML 这些数据库级别的命令基本相同。

我们主要看一些PostgreSQL特有的服务级别的命令,常用命令如下:

\dt         	-- 查看所有表
\l          	-- 查看所有数据库
\du         	-- 查看所有用户
\q          	-- 退出 psql
\? [commands]   -- 显示反斜线命令的帮助
\? options      -- 显示 psql 命令行选项的帮助
\? variables 	-- 显示特殊变量的帮助
\h [NAME]   	-- SQL命令语法上的说明,用*显示全部命令的语法说明

PostgreSQL默认会为我们生成三个库,如下

在这里插入图片描述

1_用户操作

构建用户命令巨简单

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

构建一个超级管理员用户

create user root with SUPERUSER PASSWORD 'root';

在这里插入图片描述

退出psql命令行

在这里插入图片描述

尝试使用root用户登录PostgreSQL命令行

psql -h 192.168.200.129 -p 5432 -U root -W
# psql: 错误: 连接到"192.168.200.129"上的服务器,端口5432失败:FATAL:  database "root" does not exist

发现,只有用户不让登录,用户需要有一个数据库,直接构建一个root库

create database root; -- 使用postgre创建

可以在不退出psql的前提下,直接切换数据库\c database_name

在这里插入图片描述

也可以退出psql,重新基于psql命令去切换用户以及数据库。

如果要修改用户信息,或者删除用户,可以查看

# 修改用户,直接基于ALTER命令操作
# 删除用户,直接基于DROP命令操作

如果要查看现在的全部用户信息

在这里插入图片描述

2_权限操作

权限操作前,要先掌握一下PostgreSQL的逻辑结构

逻辑结构图
在这里插入图片描述

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

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

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

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

namespace、schema级别:不用过多了解这个~~

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

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

-- 查看grant命令
\help grant

3_创建一个自己的用户

整体流程如下:

-- 准备用户
create user shenyang with password 'shenyang';
-- 准备数据库
create database shenyang;
-- 切换数据库
\c shenyang;
-- 构建schema
create schema shenyang;
-- 将schema的拥有者修改为 shenyang 用户
alter schema shenyang owner to shenyang;
-- 将shenyang库下的shenyang的schema中的表的增,改,查权限赋予给shenyang用户
grant select,insert,update on all tables in schema shenyang to shenyang;
-- 用postgres用户先构建一张表
create table shenyang.test(id int);
-- 切换到shenyang用户的shenyang库。
\c shenyang -shenyang 
-- 报错:
-- 致命错误:  对用户"-shenyang"的对等认证失败
-- Previous connection kept
-- 上述方式直接凉凉,原因是匹配连接方式时,基于pg_hba.conf文件去从上往下找
-- 找到的第一个是local,匹配上的。发现连接方式是peer。
-- peer代表用当前系统用户去连接PostgreSQL
-- 当前系统用户只有postgres,没有shenyang,无法使用peer连接
-- 想构建shenyang用户时,发现postgreSQL的所有文件拥有者和所属组都是postgres,并且能操作的只有拥有者-- 基于上述问题,不采用本地连接即可。
-- 采用远程连接。
psql -h 192.168.200.129 -p 5432 -U shenyang -W
-- 这样依赖,跳过了local链接方式的匹配,直接锁定到后面的host,host的连接方式是md5,md5其实就是密码加密了。
-- 登录后,直接输入
\dn

查看到当前database下有两个schema

在这里插入图片描述

这种权限的赋予方式,可以用管理员用户去构建整体表结构,如此一来,分配指定用户,赋予不同的权限,就不怕用户误操了。

4_差异补充

还有很重要的一点需要补充:

PostgreSQL填充关键字时并不像MySQL使用``反引号标记,而是使用双引号""


6 安装图形化界面

1_使用 pgAdmin(官方推荐)

  • 下载地址:https://www.pgadmin.org/download/
  • 跨平台支持,功能全面(表管理、SQL 查询、权限配置等)

2_DBeaver(多数据库通用)

  • 官网:https://dbeaver.io/
  • 开源、UI 美观,支持 PostgreSQL、MySQL、Oracle 等

3_DataGrip(JetBrains 出品)

  • 强大的 SQL 编辑器和数据库管理工具,适合高级用户

4_Navicat for PostgreSQL(商业)

  • 功能完整,适合商业场景,但非免费

7 总结

1_安全卸载

使用如下命令完全卸载PostgreSQL,容器化安装则无需考虑数据残留问题

# 卸载PostgreSQL,清空全部数据
version=15 # 定义你自己的版本号
sudo systemctl stop postgresql-${version} # 停止服务
sudo yum remove -y postgresql${version}\* # 卸载软件和软件包
# 删除所有相关目录
sudo rm -rf /var/lib/pgsql/${version}/
sudo rm -rf /usr/pgsql-${version}/
sudo rm -rf /var/log/pgsql/
# 删除用户和用户组
sudo userdel postgres
# sudo groupdel postgres
# 删除仓库配置
sudo yum remove -y pgdg-redhat-repo
# 完整清理检查
sudo find / -name "*pgsql*" -o -name "*postgres*" 2>/dev/null

2_结语

PostgreSQL 是一个值得深入掌握的数据库系统,它不仅稳定高效,而且功能强大,支持丰富的扩展能力。

无论是从性能、SQL 规范支持,还是企业级部署能力来看,它都具备成为核心数据库的实力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/904141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fortran语言,do-end do循环,相互包含测试,自动性能优化

1&#xff09;上代码 !$omp parallel private(n, j, dx, dy, dz, r, a)do n 1, nsteps!$omp dodo i 0, nparticles - 1x_tmp(i) x(i) vx(i) * dty_tmp(i) y(i) vy(i) * dtz_tmp(i) z(i) vz(i) * dtdo j 0, nparticles - 1dx x(j) - x(i)dy y(j) - y(i)dz z(j) - z(…

Cona编译问题

问题描述 Clion 使用conan插件配置了C工程&#xff0c;然后想通过命令行进行编译执行。 出现以下错误 CMake Error at /usr/local/Cellar/cmake/3.30.1/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):Could not find toolchain file: conan_toolchain.cmake…

Qt实现 hello world + 内存泄漏(5)

文章目录 实现hello world的两种方式通过图形化的方式通过纯代码的方式1. 新老头文件的说明2.堆或栈上创建对象的选择3.QString的说明 内存泄漏问题 实现hello world的两种方式 通过图形化的方式 通过图形化的方式&#xff0c;在界面上创建出一个控件&#xff0c;显示出hello …

【翻译、转载】【译文】模型上下文协议(Model Context Protocol, MCP)简介

原文地址&#xff1a; https://michaelwapp.medium.com/model-context-protocol-mcp-an-introduction-guide-25736f3dd672 在人工智能和 AI 驱动应用日新月异的格局中&#xff0c;一种与大型语言模型&#xff08;LLM&#xff09;交互的新方式正在兴起。随着 AI 智能体&#x…

[方法论]软件工程中的软件架构设计:从理论到实践的深度解析

文章目录 软件架构设计&#xff1a;从理论到实践的深度解析引言一、软件架构设计的核心目标体系1.1 质量属性矩阵1.2 架构权衡艺术 二、架构设计方法论演进2.1 传统设计范式2.2 现代架构方法论2.3 设计模式演化路径 三、主流架构风格全景图3.1 单体架构&#xff08;Monolithic&…

【win11 】win11 键盘测试

我的键盘是支持mac和win的&#xff0c;fn tab 就能切换&#xff0c;有可能是用错了模式&#xff0c;导致 我alt a 就会弹出 win11的 wifi 等菜单控制 键盘测试网站 https://keyboard.bmcx.com/ 识别到我按下的是alt

Linux环境部署iview-admin项目

环境&#xff1a;阿里云服务 系统&#xff1a;CentOS7.X系统 1、下载源码安装包 wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz2、解压并放入指定目录 tar -xf node-v14.17.3-linux-x64.tar.xz && mv node-v14.17.3-linux-x64 /usr/local/no…

VSCode常用插件推荐

文章目录 VSCode常用插件推荐1 Git相关插件2 代码格式3 AI工具4 语言插件通用工具参考 VSCode常用插件推荐 1 Git相关插件 2 代码格式 3 AI工具 4 语言插件 通用工具 参考 50 个 VSCode 必装插件推荐 https://mp.weixin.qq.com/s/b_OKvg3hdavtnv7pbWcKWg

【Unity】使用XLua进行热修复

准备工作&#xff1a; &#xff08;1&#xff09;将XLua的Tool拖入Asset &#xff08;2&#xff09;配置热修复 &#xff08;3&#xff09;运行Genrate Code &#xff08;4&#xff09;运行Hotfix Inject In Editor 编写脚本&#xff08;注意类上带有[Hotfix]&#xff09; [Hot…

javaEE——单例模式

目录 前言1.概念2. 实现3. 比较和改进总结 前言 本篇文章来介绍单例模式&#xff0c;并讲述在保证线程安全的前提下&#xff0c;单例模式的写法。 1.概念 单例模式是一种设计模式&#xff0c;可以说是写代码的一种模板&#xff0c;如果在一些固定的场景下按照设计模式进行写…

TS 对象类型

给对象添加类型注解 ![在这里插入图片描述(https://i-blog.csdnimg.cn/direct/6c413992c11142d88106633ec442b905.png) 格式&#xff1a;数据类型名:类型别名 注意&#xff1a;对象类型限制使用分号&#xff0c;如果对象中存在方法就写成&#xff1a;方法&#xff08;&#x…

C++类_虚基类

在 C 里&#xff0c;虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生&#xff0c;而这些基类又从同一个基类派生时&#xff0c;派生类会包含多份间接基类的数据副本&#xff0c;这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中…

详细案例,集成算法

以下是一个使用 随机森林&#xff08;RF&#xff09; 和 XGBoost 解决结构化数据分类问题的完整案例&#xff08;以泰坦尼克号生存预测为例&#xff09;&#xff0c;包含数据处理、建模和结果分析&#xff1a; 案例&#xff1a;泰坦尼克号乘客生存预测 目标&#xff1a;根据乘客…

《C#数据结构与算法》—201线性表

线性表的实现方式 顺序表 线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素&#xff0c;用这种方式存储的线性表叫顺序表。 特点&#xff1a;表中相邻的数据元素在内存中存储位置也相邻。 顺序表接口实现&#xff1a; 方法名参数返回值描述GetLen…

深入解析C++11委托构造函数:消除冗余初始化的利器

一、传统构造函数的痛点 在C11之前&#xff0c;当多个构造函数需要执行相同的初始化逻辑时&#xff0c;开发者往往面临两难选择&#xff1a; class DataProcessor {std::string dataPath;bool verbose;int bufferSize; public:// 基础版本DataProcessor(const std::string&am…

LeetCode 热题 100 189. 轮转数组

LeetCode 热题 100 | 189. 轮转数组 大家好&#xff0c;今天我们来解决一道经典的算法题——轮转数组。这道题在LeetCode上被标记为中等难度&#xff0c;要求我们将数组中的元素向右轮转 k 个位置。下面我将详细讲解解题思路&#xff0c;并附上Python代码实现。 问题描述 给定…

GAEA商业前景和生态系统扩展

GAEA情感坐标系不仅增强了AI对人类情感的理解&#xff0c;也为Web3生态注入了新的活力。通过去中心化的数据存储和共享&#xff0c;GAEA构建了一个开放透明的数据市场&#xff0c;为AI训练提供了优质的数据源。同时&#xff0c;贡献数据的用户将获得灵魂积分&#xff08;SOUL P…

[原创](现代Delphi 12指南):[macOS 64bit App开发]: [2]如何使用跨平台消息框?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

js逆向绕过指纹识别

​​一、兼容性说明​​ 官方支持 curl_cffi 明确支持 Windows 平台&#xff0c;并提供了预编译的安装包。其核心功能&#xff08;如浏览器指纹模拟、HTTP/2 支持&#xff09;在 Windows 上与 Linux/macOS 表现一致。 版本要求 • Python 3.8 及以上版本&#xff08;推荐 Pyth…

聊聊对Mysql的理解

目录 1、Sql介绍 1.1、SQL的分类 1.2、数据库的三大范式 1.3、数据表的约束 1.4、约束的添加与删除 2、核心特性 3、主要组件 4、数据结构原理 5、索引失效 6、常用问题 7、优势与局限 前言 MySQL是一个开源的关系型数据库管理系统(RDBMS)&#xff0c;由瑞典MySQL A…