Day01-postgresql数据库基础入门培训

Day01-postgresql数据库基础入门培训

1、PostgresQL数据库简介

  • PostgreSQL【简称:PG】是加州大学伯克利分校计算机系开发的,一个开源免费的关系式数据库管理系统,经过长达15年以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内相对高的声誉。

  • PostgreSQL可以运行在所有主流操作系统上,包括Linux、AIX、HP-UX、Solaris和Windows等34种平台。

  • PostgreSQL是完全的事务安全性数据库,完整地支持外键、联合、视图、触发器和存储过程(并支持多种语言开发存储过程)。

  • PostgreSQL支持了大多数SQL标准的数据类型,包括整型、数值型、布尔型、字节型、字符型、日期型、时间型、二进制的大对像(图片、声音和视频)。

  • PostgreSQL的存储过程开发可以使用众多的程序语言,包括Java、Perl、Python、Ruby、Tcl、C/C++和自带的PL/pgSQL,其中的PL/pgSQL与Oracle的PL/SQL很相似,内置了数百个函数,功能从基本的算术计算和字符串处理到加密逻辑计算并与Oracle有高度兼容性。

  • PostgreSQL支持国际字符集、多字节编码并支持使用当地语言进行排序、大小写处理和格式化等操作。

  • PostgreSQL对很多高级开发语言有原生的编程接口,如C/C++、Java、.Net、Perl、Python、Ruby、Tcl和ODBC以及其他语言等,也包含各种文档。

  • PostgreSQL有很多高级功能,像多版本并发控制(MVCC)、按时间点恢复(PITR)、表空间、异步复制、嵌套事务、在线热备、复杂查询的规划和优化以及为容错而进行的预写日志等。

  • PostgreSQL有很多高品质的图形化的PostgreSQL管理工具软件,包括开源和商业性质的。

  • PostgreSQL的源代码可以自由获取,它的授权是在非常自由的开源授权下,这种授权允许用户在各种开源或是闭源项目中使用、修改和发布PostgreSQL的源代码。用户对源代码的可以按用户意愿进行任何修改、改进。

  • PostgreSQL的快速发展是由于MySQL被Oracle公司收购导致的,同时在2019年微软官宣收购PostgreSQL初创公司Citus Data(OLAP:citus分布式插件)。

2、PostgreSQL行业生态应用

  • PostgreSQL被称为"世界上最先进的开源关系型数据库",属于一专多长的全栈数据库,主要场景应用如下:

    • OLTP交易系统
    • OLAP、批处理、数据仓库
    • 空间与地理数据库(PostGIS)
    • 缓存系统、消息队列/流处理
    • 搜索索引、图数据库
    • NoSOL数据库
    • 时序数据库 【MySQL被称为"世界上最流行的开源关系型数据库"】
  • 在全球数据库排名中,PostgreSQL排名全球第四(统计时间:2023.06)

  • 在商业数据库当中,Oracle属于多专多长的全数据库,全球最强。
  • 在开源数据库当中,MySQL主要应用于互联网业务的OLTP,所以PostgreSQL弥补了MySOL在传统行业不擅长的方向,又解决了商业数据库的成本问题。
  • 随着信创项目的推动,国产数据库主要以Oracle、MySQL、PostgreSQL三个方向为主,目前以PostgreSQL开源进行二次开发的国产数据库应用越来越广,同时国内外使用的客户越来越多,比如:平安、苏宁、人寿、招商,DELL,富士通,SAP苹果,本田,丰田等。
  • PostgreSQL基于云平台的使用,如AWS、阿里云、腾讯、华为都有用到PG的社区版作为数据库可选方案之一

根据中国信通院发布的数据库发展研究报告2021,我国关系型数据库基于MySQL和PostgreSQL二次开发的数量依次占关系型数据库比例为28.40%和29.63%。

  • 从目前国内发布的产品来说,大部分都高度兼容Oracle。
  • 未来国内市场数据库主流的产品线为3种模式:
    • Oracle
    • PostgreSQL
    • MySQL(MySQL+MongoDB+Redis)

从国内外数据库源流分支来说(依托开源协议来构建或二次开发),源流于PostgreSQL的开源协议框架,据不完全准确统计,列举部分-Part1:

  • EDB(Enterprise Postgres Database)
  • PostGlS、Citus、Timescaledb、PipelineDB
  • GreenPlum
  • 电信TeleDB
  • 腾讯TDSQL PostgreSQL版(原TBase)
  • 阿里PolarDB for PostgreSQL/AnalyticDB PostgreSQL
  • 人大金仓KingBase

源流于PostgreSQL的开源协议框架,据不完全准确统计,列举部分-Part2:

  • 瀚高HighGo DB
  • 酷克HASHDATA
  • 优炫UXDB
  • 亚信AntDB
  • 偶数HAWQ
  • 华为GaussDB A(200+300)
  • 华为openGauss

源流于PostgreSQL的开源协议框架,据不完全准确统计-Part3

其中基于华为qpenGauss又包括-Part1:

  • 中国移动-磐维数据库
  • 中国联通-CUDB
  • 海量Vastbase
  • 恩墨MogDB
  • 神舟通用
  • 南大通用Gbase 8c/8s
  • 恒生电子LightDB

源流于PostgreSQL的开源协议框架,据不完准确统计-Part4

其中基于华为openGauss又包括-Part2:

  • 超聚变FusionDB
  • 虚谷伟业-有蓉数据库
  • 北京太阳塔LNXDB-RDS
  • 沐融信息MuDB
  • 天曦TXDB

3、PostgreSQL版本发展与特性

PostgreSQL最新正式版15.3(2023.6),2023年发布正式版16.1。

各版本发布的时间与生命周期如下:

postgresql各版本特性介绍:https://www.postgresql.org/about/featurematrix/

PostgreSQL各版本特性介绍:

  • 1986年:Postgre诞生

  • 1989年:Postgres 1 发布

  • 1990年:Postgres 2 发布,重写了规则系统

  • 1991年:Postgres 3 发布,改进了规则系统,增加了对多种存储系统支持的能力,并且改进了查询引擎。

  • 1993年:Postgres 4 发布,随便用户与特性需求急剧增加,随后该项目正式终止

  • 1994年:新增SQL语言解释器,建立了Postgres95。

  • 1996年:Postgres改名PostgreSQL,正式社区化发展。

  • 1997年:PostgreSQL 6.0 发布,第一个正式版本,后续1997年~1999年期间陆续发布了6.1/6.2/6.3/6.4/6.5,新增的功能有:

    • 多列索引、序列、货币和时间数据类型,GEQO。
    • JDBC接口、触发器、服务端编程接口、约束,SOL92标准的子查询
    • 增加了可读视图、PL/pgTGL。
    • MVCC、临时表、更多的SOL语句支持。
  • 2001年:PostgreSQL7.0发布,增加了外键、JOIN连接。

  • 2001年:PostgreSQL7.1发布,增加了WAL预写式日志、外连接。

  • 2002年:PostgreSQL7.2发布,支持PostGlS,索引,函数,增加了PL/Python。

  • 2003年:PostgreSQL7.3发布,增加了模式、表函数、prepared query。

  • 2004年:PostgreSQL7.4发布,优化了JOIN和数据仓库函数。

  • 2005年:PostgreSQL8.0发布,支持Win平台/增加savepoints/表空间/时间点恢复。

  • 2005年:PostgreSQL8.1发布,性能增强、增加了两阶段提交、表分区、位图索引扫描、共享行锁、角色。

  • 2006年:PostgreSQL8.2发布,性能增强,增加了在线重建索引/咨询锁/热备

  • 2008年:PostgreSQL8.3发布,增加全文搜索、SQL/XML、枚举类型、UUID类型等

  • 2009年:PostgreSQL8.4发布,窗口查询,数据透视,递归查询,并行恢复,列级权限,CTE公用表表达式。

  • 2010年:PostgreSQL9.0发布,支持Windows 64位系统,增加内置二进制流复制、热备、内置升级功能。

  • 2011年:PostgreSQL9.1发布,增加同步复制、无日志表、序列快照隔离级别、SELinux集成、扩展、外部表,可写CTE公用表表达式。

  • 2012年:PostgreSQL9.2发布,增加级联流复制、原生JSON支持、增强锁管理、range类型、索引扫描、空间分区GIST索引。

  • 2013年:PostgreSQL9.3发布,增加触发器、视图、可写外部表、物化视图、复制功能增强,横向连接LATERAL JOIN、。

  • 2014年:PostgreSQL9.4发布,Linux大页支持,增加了JSONB、RANGE类型,ALTER SYSTEM语法、不阻塞读的刷新物化视图、动态注册/起停后台进程、逻辑API、GIN索引增强。

  • 2016年:PostgreSQL9.5发布,新的BRIN索引,增加UPSERT插入更新、CUBE/ROLLUP/GROUPING SETS分组集合等语法,行级安全

  • 2016年:PostgreSOL9.6发布,支持并行查询,FDW功能增强,多机同步standby,快速清空大表。

为了加快市场推广,跟进Oracle版本策略,平均每年发布一个大版本:

  • 2017年:PostgreSQL 10发布,支持逻辑复制,内置分区表,增强并行查询机制,数据库编程能力,并行功能增强,全文检索支持JSON和JSONB数据类型,估值计算,文本挖掘,物联网优化,GIS业务优化,图像搜索,基因测序,3D数据处理,机器学习UDF库等。

  • 2018年:PostgreSQL 11发布,分区表的改进与增强,存储过程支持事务,并行能力的增强,增加对JIT编译的支持,其它功能完善。

  • 2019年:PostgreSQL 12发布,分区性能提升,B树索引增强,公用表表达式(CTE),准备好的计划控制,即时编译,校验和控制,在线重建索引,支持SQL/JSONpath,支持生成列,新增 Pluggable Table Storage Interface等。

  • 2020年:PostgreSQL 13发布,Btree索引优化,支持增量排序,支持并行vacuum index,支持可信插件,支持扩展统计信息,支持hash aggregation使用磁盘存储,逻辑复制对分区表的支持。

  • 2021年:PostgreSQL 14发布,数据类型与函数更多支持,管理功能增强,复制和恢复增强,索引功能改进,性能提升,安全增强等。

  • 2022年:PostgreSQL 15发布,大数据集的排序性能提升,各类查询也进行了优化,支持使用LZ4、Zstandard算法进行压缩备份,引入了jsonlog数据格式用于日志记录,安全性增强,删除public模式的创建权限。

  • 2023年:PostgreSQL 16发布,可以实现级联逻辑复制,支持更多的并行查询,安全增强,监控管理增强。

4、PostgreSQL体系结构介绍

应用程序的访问架构

PostgreSQL体系结构

它由共享内存、一系列后台进程和数据文件组成。

PostgreSQL进程分为主进程与辅助进程。

主进程:

  • Postmaster进程是整个数据库实例的总控进程,负责启动关闭该数据库实例。

辅助进程:

  • SysLogger(系统日志)进程
  • BgWriter(后台写)进程
  • WALWrite(预写式日志)进程
  • PgArch(归档)进程
  • AutoVacuum(系统自动清理)进程
  • PgStat(统计收集)进程
  • CheckPoint(检查点)进程

PostgreSQL的逻辑结构分为实例、数据库、schema、对象;

实例中允许创建多个数据库,每个数据库中可以创建多个schema,每个schema下面可以创建多个对象。对象包括表、索引、视图、序列、函数等。

表空间是物理结构,同一表空间下可以有多个数据库。

数据库是逻辑结构,是表、索引、视图、存储过程、函数等对象的集合,一个数据库下可以有多个schema。

模式是逻辑结构,是对数据库的逻辑划分。

在oracle中用户和schema基本上可以画上等同关系,但是pg中两者没有这样严格的对应关系

将数据文件中的空间从逻辑上划分成一个个页面(数据块)

数据页大小:默认为8K

(可支持4K=16TB,8K=32TB,16K=64TB,32K=128TB)

页面可以分成两种:

  • 数据页面:数据页面是用来存储用户数据的
  • 控制页面:控制页面用来管理这些数据页面

数据库共享缓存中的空间划分也是按页为基本单位,一个页的大小与数据文件中页的大小一致,这样便于整页读取数据文件,并放入到数据库Buffer中,从Buffer写入数据文件也同理,保证了缓存与数据文件结构和内容上的一致性。

数据库包含的文件种类:

  • 数据库文件:数据库对象,如:数据库、表,索引,序列等对象。
  • 控制文件:用来记录数据库集群的状态信息,如:版本信息、集群所管理的各种文件信息、检查点信息、事务状态信息等
  • 参数文件:存放数据库运行参数
  • 日志文件:记录数据修改操作的日志,用于系统发生故障时进行数据恢复。
  • 临时文件:存放数据库进行计算的过程中,生成的各种中间对象,如排序运算的外存归并单元。

PostgreSQL由一系列数据库组成。

一套PostgreSQL程序称之为一个数据库群集。

当initdb()命令执行后,template0,template1,和postgres数据库被创建。

template0和template1数据库是创建用户数据库时使用的模版数据库,他们包含系统元数据表。

initdb()刚完成后,template0和template1数据库中的表是一样的。但是template1数据库可以根据用户需要创建对象。用户数据库是通过克隆template1数据库来创建的;

一个表空间可以被多个数据库同时使用。此时,每一个数据库都会在表空间路径下创建为一个新的子路径。

创建一个用户表空间会在$PGDATA\pg_tblspc目录下面创建一个软连接,连接到表空间制定的目录位置。

PostgreSQL内存主要为分共享内存与本地内存。

共享内存

PostgreSQL启动后,会生成一块共享内存,用于做数据块的缓冲区,以便提高读写性能。WAL日志缓冲区和Clog缓冲区也存在共享内存中,除此之外还有全局信息比如进程、锁、全局统计等信息也保存在共享内存中。

其中最重要的组成部分是Shared Buffer和WAL Buffer。

本地内存

非全局存储的数据都存在本地内存中,主要包括:

临时缓冲区:用于访问临时表的缓冲区

work_mem:内部排序操作和Hash表在使用临时操作文件之前使用的存储缓冲区。

manintance_work mem:在维护操作比如:VACUUM(收集表和索引的统计信息,整理表和索引)、CREATE INDEX、ALTER TABLE ADD FOREIGN Key等中使用的内存缓冲区。

5、PostgreSQL与MySQL的区别

序号 特性类型 MySQL PostgreSQL
1 实例与数据库 1.通过MySQL命令(mysqld)启动实例); 2.一个实例可以管理一个或多个数据库; 3.一台服务器可以运行多个 mysqld 实例; 4.一个MySQL实例中的所有数据库共享同一个系统编目。 1.通过Postmaster 进程(pg_ctl)启动实例; 2.一个实例可以管理一个或多个数据库,这些数据库组成一个集群; 3.集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中; 4.使用 initdb 创建第一个数据库。一台机器上可以启动多个实例; 5.每个数据库有自己的系统编目,但所有数据库共享pg_databases
2 配置文件 my.conf Postgresgl.conf
3 数据库连接 使用 CONNECT或 USE 语句连接数据库,这时要指定数据库名,还可以指定用户id和密码。 使用 connect 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。
4 客户机连接文件 my.conf pg_hba.conf
5 数据缓冲区 通过 innodb_buffer_pool _size参数设置数据缓冲区,这个参数最高可以设置为机器物理内存量的 80%。 通过Shared_buffers参数设置数据缓冲区。在默认情况下分配64个缓冲区。默认的块大小是 8K。可以通过设置postgresql.conf 文件中的 shared_buffers 参数来更新缓冲冲区缓存。
6 执行计划 使用 EXPLAIN 命令查看查询的解释计划。 使用 EXPLAIN 命令查看查询的解释计划,返回丰富的信息,
7 备份恢复 InnoDB 使用重做日志记录,支持在线和离线完全备份以及崩溃和事务恢复,也支持热备份。 在数据目录的一个子目录中维护重做日志。支持在线和离线完全备份以及崩溃、时间点和事务恢复,可以支持热备份。
8 取决于存储引擎。例如,NDB存储引擎支持分区表,内存引擎支持内存表。 支持临时表、常规表以及范围和列表类型的分区表,不支持哈希分区表。由于PostgreSQL的表分区是通过表继承和规则系统完成了,所以可以实现更复杂的分区方式。
9 索引 1.取决存储引擎。MyISAM与InnoDB都支持BTREE 2.不支持函数索引,只能在创建基于具体列的索引 1.支持 B-树、哈希、R-树和 Gist 索引。 2.支持函数索引,同时还支持部分数据索引。
10 约束 支持主键、外键、唯一和非空约束。对检查约束进行解析,但是不强制实施。 支持主键、外键、唯一、非空和检查约束。
11 存储过程 支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。存储过程可以用 SQL 和C++ 编写。 没有单独的存储过程,都是通过函数实现的。
12 函数 用户定义函数可以用 SQL、c 和 C++编写 用户定义函数可以用 PL/pgSQL(专用的过程语言)、PL/TcI、PL/Perl、PL/Python、SQL和C编写。
13 触发器 支持事前、事后触发器和语句触发器,触发器语句用过程语言复合语句编写。 支持事前、事后触发器和语句触发器,触发器过程用C编写。
14 物化视图 不支持物化视图。 通过规则系统可以实现物化视图的功能。
15 事务与锁 支持表级和行级锁。 InnoDB 存储引擎支持读未提交(read-uncommitted)、不可重复读(read-committed)、可重复读(repeatable-read)、串行化(serializable)。 使用 SET TRANSACTION ISOLATION LEVEL语句在事务级设置隔离级别。 支持表级和行级锁。 支持的隔离级别是Read Committed(默认-看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read 相似,只能看到在事务启动之前提交的结果)。 使用 SET TRANSACTION 语句在事务级设置隔离级别。 使用 SET SESSION 在会话级进行设置。
16 DBLINK 不支持database link。 有dblink、FDW,可以连接到oracle和mysql上。

6、PostgreSQL与Oracle、MySQL的对比

相关推荐
本就一无所有 何惧重新开始10 小时前
Redis技术应用
java·数据库·spring boot·redis·后端·缓存
isaki13710 小时前
qt day1
开发语言·数据库·qt
流星白龙10 小时前
【Qt】4.项目文件解析
开发语言·数据库·qt
小钻风336610 小时前
HTTPS是如何确保安全的
网络·数据库
CryptoPP11 小时前
获取越南股票市场列表(包含VN30成分股)实战指南
大数据·服务器·数据库·区块链
阿巴~阿巴~12 小时前
Redis重大版本演进全解析:从2.6到7.0
服务器·数据库·redis·ubuntu·缓存·centos
qq_4046433413 小时前
MySQL中RUNCATE、DELETE、DROP 的基本介绍
数据库·mysql
像风一样!13 小时前
MySQL数据库如何实现主从复制
数据库·mysql
大白的编程日记.13 小时前
【MySQL】数据库表的CURD(二)
android·数据库·mysql
友善的鸡蛋14 小时前
项目中执行SQL报错oracle.jdbc.OracleDatabaseException: ORA-00942: 表或视图不存在
数据库·sql·oracle