PostgreSQL数据库是目前功能最强大的开源数据库,支持丰富的数据类型(如JSON和JSONB类型、数组类型)和自定义类型。而且它提供了丰富的接口,可以很容易地扩展它的功能,如可以在GiST框架下实现自己的索引类型等,它还支持使用C语言写自定义函数、触发器,也支持使用流行的语言写自定义函数,比如其中的PL/Perl提供了使用Perl语言写自定义函数的功能,当然还有PL/Python、PL/Tcl,等等。它最早由加拿大安大略省立大学的计算机科学教授Michael Stonebraker和他的同事们在1986年开始研发,最初是针对Ingres数据库管理系统的一个应用程序。1995年,PostgreSQL正式成为了一个独立的项目。
PostgreSQL在很多方面都非常出色,如可扩展性、并发访问、完整性、安全性等,日益受到越来越多的开发者和企业的青睐。它不仅仅是一个可靠的数据存储和查询引擎,还提供了丰富的函数库、数据类型和支持多种编程语言的API,更重要的是,它免费使用,不受商业利益影响。
以下是一些PostgreSQL的特性和优势:
(1)维护者是PostgreSQL Global Development Group,首次发布于1989年6月。
(2)操作系统支持WINDOWS、Linux、UNIX、MAC OS X、BSD。
(3)从基本功能上来看,支持ACID、关联完整性、数据库事务、Unicode多国语言。
(4)表和视图方面,PostgreSQL支持临时表,而物化视图,可以使用PL/pgSQL、PL/Perl、PL/Python或其他过程语言的存储过程和触发器模拟。
(5)索引方面,全面支持R-/R+tree索引、哈希索引、反向索引、部分索引、Expression 索引、GiST、GIN(用来加速全文检索),从8.3版本开始支持位图索引。
(6)其他对象上,支持数据域,支持存储过程、触发器、函数、外部调用、游标7)数据表分区方面,支持4种分区,即范围、哈希、混合、列表。
(7)从事务的支持度上看,对事务的支持与MySQL相比,经历了更为彻底的测试。
(8)My ISAM表处理方式方面,MySQL对于无事务的MyISAM表,采用表锁定,1个长时间运行的查询很可能会阻碍对表的更新,而PostgreSQL不存在这样的问题。
(9)从存储过程上看,PostgreSQL支持存储过程。因为存储过程的存在也避免了在网络上大量原始的SQL语句的传输,这样的优势是显而易见的。
(10)用户定义函数的扩展方面,PostgreSQL可以更方便地使用UDF(用户定义函数)进行扩展。
(1)最新版本和历史版本不分离存储,导致清理老旧版本时需要做更多的扫描,代价比较大但一般的数据库都有高峰期,如果合理安排VACUUM,这也不是很大的问题,而且在PostgreSQL9.0中VACUUM进一步被加强了。
(2)在PostgreSQL中,由于索引完全没有版本信息,不能实现Coverage index scan,即查询只扫描索引,不能直接从索引中返回所需的属性,还需要访问表,而Oracle与Innodb则可以。
版本 | 新增特性 |
---|---|
pg9 | 1.继承式分区 2.手动添加触发器或规则 |
pg10 | 1.声明式分区 2.分区索引手动创建,不能基于分区父表创建 |
pg11 | 1.新增哈希分区 2.基于的分区表创建索引 3.支持update分区 4.会创建一个默认default分区 5.分区支持创建主键、外键、索引、触发器 |
pg12 | 1.新增哈希分区 2.alter table attach partitions不会阻塞查询 |
pg13 | 1.支持before trigger(不允许改变插入数据的目标分区) 2.支持逻辑复制 |
1.最大可用模式most_available_sync
pg流复制一直有个痛点就是在一主一从同步模式下,如果备库宕机,主库会hang,同步模式不会自动降级,需要依靠第三方工具进行判断和监控,或者使用一主多备quorum的方式来防止备库异常对主库的影响。
openGauss中支持了最大可用模式,开启该参数后在主从连接正常的情况下处于同步模式,如果备机断连会立刻切为异步模式,如果备机再次启动会自动连接并切为同步模式。
这个降级切换时间非常快,切换过程甚至不会hang,而且没有超时窗口参数来进行设置,这一点是个不足的地方。
2.xid不可耗尽
openGauss将transactionid由int32改为了int64,64位的xid永远不可能耗尽,虽然xid改为了64位,但是过期的xid依旧需要freeze清理,只是永远不用担心会发生xid回卷宕机的风险。
3.流复制环境自动创建物理
openGauss中搭建主从流复制环境后会默认自动创建一个slot_name为对端nodename的物理复制槽,为了防住备库需要的xlog被主库删除或清理。
4.增量检查点
openGauss支持了增量检查点,通过enable_incremental_checkpoint参数开启。Pg中的检查点执行时会将buffer中所有的脏页刷到磁盘,需要在checkpoint_timeout*checkpoint_completion_target时间内完成刷脏页动作。刷脏对数据库是消耗非常大的动作,高斯中的增量检查点会小批量的分阶段的滚筒式的去进行脏页刷盘,同时更新lsn信息,回收不需要的xlog日志。
5.双写double write
我们知道操作系统数据块是4k,数据库一般是8k/16k/32k,这样有可能造成页面断裂问题,一个数据库数据块刷到操作系统的过程中可能发生宕机造成块损坏数据库无法启动。
mysql通过双写double write来解决这个问题,oracle不管这个问题,出了事情通过rman或者dg备库来恢复,pg通过full_page_write来解决这个问题,就是在数据页第一次发生变更的时候将整个页面记录到xlog日志中,这样出了问题就有了完整的数据页加xlog日志进行恢复,但是这样带来的问题就是大大增加了xlog的日志量,也对性能有一定影响。
openGauss实现了类似mysql的双写,写数据块的同时将脏页也写到一个共享的双写空间里,如果发生问题会从双写空间里找到完整的数据页进行恢复。双写特性参数enable_double_write需要配合增量检查点一起使用。
6.客户端密码认证增强
pg默认的密码加密算法为md5,openGauss增强为sha256,该功能需要配合客户端改造才能兼容。
7.xlog预分配
pg中的xlog日志是在写满后才会分配下一个日志,这样带来的问题是在操作系统写一个16M的xlog日志时会有等待,那时候可能会卡一下,这也是为什么pg在做并发insert测试的时候性能抖动的原因。
openGauss中实现了xlog预分配,在xlog未写满时就分配下面一个或者几个xlog,经压测性能较稳定。
8.流复制线程连接认证
openGauss中主备的复制线程要连接对端服务器时默认需要进行ssl认证,pg是不需要的,增强了安全,可以通过将remote_read_mode设置为non_authentication关闭认证(如果不关闭就需要配置相关ca证书密钥,否则以-M primary/standby方式启动数据库会失败)。
9.dbe_perf性能监控schema
openGauss在每个库下面会默认存在一个dbe_perf的性能监控视图,类似mysql的performance_schema,里面有几百个性能视图,虽然这些视图大部分pg里面都有,但是单独做到一个schema里方便查看和管理。
10.流复制环境主库归档xlog数量最大值限制
xlog最大值的硬限制,通过max_size_for_xlog_prune参数控制,他不管xlog的删除会不会影响备机,只要超过该值就进行删除。可以防止主备长期断连造成主库目录爆掉
11.public schema安全权限增强
openGauss将每个数据库下的默认的public schema做了安全增强,默认普通用户没有权限在public下创建对象,需要进行授权。不敢说这个是不是改进,因为既然叫public,就是给大家用的。
12.摒除recovery.conf文件
使用replconninfo配置主备连接信息,application_name等相关配置并入postgresql.conf,简化流程,方便主备进行来回切换,pg12的流复制也摒弃了recovery.conf文件。
13.基于数据页的复制
openGauss支持基于redo的复制、基于数据页的复制以及两种混合复制,通过enable_data_replicate和enable_mix_replication参数进行控制
14.支持列存表,列存缓冲区
openGauss支持了列存表,通过cstore_buffers控制列存缓冲区大小,列存表支持压缩。并且当前版本的高斯优化了列存表的并发插入性能,解决了插入时一行数据占一个cu造成空间急剧膨胀的问题。通过开启enable_delta_store参数控制列存表的插入使用临时表向主表merge的方式进行,既保证了性能,也解决了膨胀的问题
15.内存表
支持基于llvm的内存查询引擎,支持高吞吐、低延迟访问。
16.NUMA架构优化
通过numa绑核,减少跨核内存访问的时延问题,提升CPU利用率,提升多线程间同步性能,xlog日志批量插入,热点数据分散处理。
17.用户资源管理
支持多租户环境下的cpu内存限制,配置资源池,调用操作系统cgroup实现。
18.wdr报告
支持类似oracle awr性能报告。
19.内存池memorypool
在更上一层管理数据库内存使用,限制一个数据库节点可用的最大物理内存。
20. 查询内存限制query_mem
可以对某个查询使用的内存进行限制。
21.异步直接io
开启磁盘预分配,io预取,提升写入性能。
22.列存表delta merge性能增强
开启enable_delta_store参数控制列存表的插入使用临时表向主表merge,提升性能,解决膨胀。
23.并行回放
支持备机并行回放日志,提高复制性能。
24.会话超时
Session_timeout参数控制会话超时时间,防止由于线程长期不释放造成数据库意外宕机。
25.主备从与一主多备
除了支持一主多备模式,也支持主备从模式,主备机直接物理复制,从机默认没有数据,当主库宕,备机和从机组成新的复制关系,从机开始复制数据,这样节省了空间的同时保证了高可用。
26.线程池
进程模型改为线程模型,线程池支持上万的并发,通过线程池实现session和thread之间的解耦,提高线程的利用率,高并发下不会导致线程的频繁切换。
27.commit log由256k改为16M
为了配合64位xid。
1.pg_stat_replication视图丢失
pg中查看复制状态的基本视图被丢掉了,虽然使用gs_ctl query命令也可以复制状态,但是pg_stat_replication还可以查看主从lag信息,高斯中无法查询。
2.编译过于复杂,依赖过多
编译需要很多依赖,而且版本固定,造成跨平台编译难度很大,平台通用性差,你可能发现编译华为的第三方编译工具比编译数据库还麻烦。
3.不支持并行
目前高斯还不支持并行,希望后续引入pg9.6开始支持的并行功能。
4.没有postgresql.auto.conf
无法使用alter system set配置相关参数
5.不支持pitr
目前还不支持基于时间点的恢复,据说830版本会支持。
6.不支持插件
这是一个极大的劣势,pg良好的扩展性在于他支持插件,吸引了很多开发者开发基于pg的插件,而openGauss中已经不支持插件。
7.社区刚刚起步,参与度不高
openGauss社区刚刚起步,目前活跃度不高,希望未来越来越好吧,也希望高斯中的优秀特性也能被pg吸收。
8.周边工具
高可用工具、数据同步工具不具备。
9.性能与原生pg存在差距
使用并发工具压测数据库代码速度发现与原生pg存在差距,同时目前不支持并行,所以分析类场景也有不足。
10.copydir限制
openGauss中将数据库数据导入目录限制到数据目录下的pg_copydir中,这个是很不人性化的设计,试想生产环境需要导数,需要先拷贝到数据目录下,容易造成数据目录满。
PostgreSQL中文社区:
http://www.postgres.cn/index.php/v2/home
1. 创建用户
[root@localhost ~]# useradd postgres
2. 下载安装包
安装包下载地址:
https://ftp.postgresql.org/pub/source/v13.1/postgresql-13.1.tar.gz
3. 解压
[root@localhost src]# tar xf postgresql-13.1.tar.gz
4. 编译安装
[root@localhost src]# cd postgresql-13.1/
--prefix=xxx 指定安装位置,默认会将程序安装到/usr/local/pgsql下
[root@localhost postgresql-13.1]# ./configure --prefix=/opt/pgsql
[root@localhost postgresql-13.1]# make && make install
5. 创建数据库数据目录
[root@localhost postgresql-13.1]# mkdir -p /opt/pgsql/data
[root@localhost postgresql-13.1]# chown postgres.postgres /opt/pgsql/data/
6. 初始化数据库
[root@localhost postgresql-13.1]# su postgres
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/initdb -D /opt/pgsql/data/
7. 启动数据库
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data/ -l logfile start
查询postgresql端口,默认端口号为5432
[postgres@localhost postgresql-13.1]$ ss -antl|grep 5432
LISTEN 0 128 *:5432 *:*
LISTEN 0 128 [::]:5432 [::]:*
查询postgresql运行状态
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data/ -l logfile status
pg_ctl: server is running (PID: 12307)
/opt/pgsql/bin/postgres "-D" "/opt/pgsql/data"
连接数据库
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/psql
psql (13.1)
Type "help" for help.
postgres=#
8. 编辑环境变量
//为了方便执行,编辑postgres用户的PATH环境变量
[postgres@localhost postgresql-13.1]$ vim ~/.bashrc
export PATH=/opt/pgsql/bin:$PATH
[postgres@localhost postgresql-13.1]$ source ~/.bashrc
创建用户,设置密码
postgres=# create database cxdata;
CREATE DATABASE
postgres=# alter user postgres with password 'cxdata@123';
ALTER ROLE
修改文件1
注:文件中每行前面的序号为行号,编辑的时候直接输入行号gg,就可以到达指定行。
[postgres@localhost postgresql-13.1]$ vim /opt/pgsql/data/postgresql.conf
59 listen_addresses = '*'
修改文件2
其中0.0.0.0/0表示运行任意ip地址访问,设置md5开启密码验证
[postgres@localhost postgresql-13.1]$ vim /opt/pgsql/data/pg_hba.conf
88 local all all md5
90 host all all 0.0.0.0/0 md5
重启数据库
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data/ -l logfile stop
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data/ -l logfile start
测试远程连接
主机:192.168.5.57
数据库:cxdata
用户名:postgres
密码:cxdata@123
-D 数据目录
pg_ctl -D /opt/pgsql/data/ start //启动
pg_ctl -D /opt/pgsql/data/ stop //关闭
pg_ctl -D /opt/pgsql/data/ restart //重启
pg_ctl -D /opt/pgsql/data/ status //查看服务状态
2.连接数据库
-U 指定用户 -d 指定数据库 -h 要链接的主机 -W 提示输入密码
psql -U postgres (psql -U username -d databse_name -h host -W)
3.切换数据库
\c dbname
4.列举表
\dt
5.查看表结构
\d tblname
6.查看索引
\di
7.创建数据库
create database dbname;
8.删除数据库
drop database dbname;
9.重命名一张表
alter table [表名A] rename to [表名B]
10.删除一张表
drop table
更多常用命令请查看:
https://www.coonote.com/note/postgresql-cmd.html
请查看此篇:
https://blog.csdn.net/LG_15011399296/article/details/123705384
//全备
[root@localhost pgsql]# pg_dumpall -h 127.0.0.1 -U postgres > /opt/all_dbbak.sql
//导入数据库
[root@localhost pgsql]# psql -h 127.0.0.1 -U postgres < /opt/all_dbbak.sql
//单备
[root@localhost ~]# pg_dump -h 127.0.0.1 -U postgres school > /opt/school.sql
//导入数据库
[root@localhost ~]# psql -U postgres school
//创建表
school=# create table student (id int, name char(32), age int);
//备份表
[root@localhost ~]# pg_dump -h 127.0.0.1 -U postgres school -t student >/opt/student.sql
school=# drop table student;
//导入表
[root@localhost ~]# psql -U postgres -d school
环境说明:
系统版本 | IP | 角色 | 数据库版本 |
---|---|---|---|
CentOS7.6 | 192.168.5.57 | 主 | postgresql-13.1 |
CentOS7.6 | 192.168.5.58 | 从 | postgresql-13.1 |
前提条件:
[root@localhost ~]# psql -Upostgres -d postgres
postgres=# create user repl login replication encrypted password 'repl';
[postgres@localhost root]$ vim /opt/pgsql/data/postgresql.conf
59 listen_addresses = '*'
290 max_wal_senders = 32 //同步最大的进程数量
[postgres@localhost root]$ vim /opt/pgsql/data/pg_hba.conf
96 host replication repl 192.168.5.0/24 md5
前提条件:
[postgres@localhost postgresql-13.1]$ /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data/ -l logfile stop
waiting for server to shut down.... done
server stopped
[postgres@localhost postgresql-13.1]$ rm -rf /opt/pgsql/data/*
[postgres@localhost bin]$ ./pg_basebackup -h 192.168.5.57 -D /opt/pgsql/data/ -U repl -P -v -R -X stream -C -S pgstandby1
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/2000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "pgstandby1"
32179/32179 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/2000138
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: renaming backup_manifest.tmp to backup_manifest
pg_basebackup: base backup completed
复制后从节点的配置文件会和主节点的一样,并且一并复制的还有数据库文件,里面的数据也一样,意味着主节点有什么用户数据从节点也有。
-h –指定作为主服务器的主机。
-D –指定数据目录。
-U –指定连接用户。
-P –启用进度报告。
-v –启用详细模式。
-R–启用恢复配置的创建:创建一个standby.signal文件,并将连接设置附加到数据目录下的postgresql.auto.conf。
-X–用于在备份中包括所需的预写日志文件(WAL文件)。流的值表示在创建备份时流式传输WAL。
-C –在开始备份之前,允许创建由-S选项命名的复制插槽。
-S –指定复制插槽名称。
[postgres@localhost data]$ cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=repl password=repl channel_binding=disable host=192.168.5.57 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'pgstandby1'
[postgres@localhost data]$
postgres=# SELECT * FROM pg_replication_slots;
-[ RECORD 1 ]-------+-----------
slot_name | pgstandby1
plugin |
slot_type | physical
datoid |
database |
temporary | f
active | t
active_pid | 2338
xmin |
catalog_xmin |
restart_lsn | 0/3000060
confirmed_flush_lsn |
wal_status | reserved
safe_wal_size |
postgres=# SELECT * FROM pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 2338
usesysid | 24604
usename | repl
application_name | walreceiver
client_addr | 192.168.5.58
client_hostname |
client_port | 53320
backend_start | 2023-06-13 11:13:37.124903+08
backend_xmin |
state | streaming
sent_lsn | 0/3000060
write_lsn | 0/3000060
flush_lsn | 0/3000060
replay_lsn | 0/3000060
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2023-06-13 11:14:36.53047+08
postgres=# SELECT * FROM pg_stat_wal_receiver;
pid | status | receive_start_lsn | receive_start_tli | written_lsn | flushed_lsn | received_tli | last_msg_send_time | last_msg_receipt_time | latest_end_lsn | latest_end_tim
e | slot_name | sender_host | sender_port | conninfo
-------+-----------+-------------------+-------------------+-------------+-------------+--------------+-------------------------------+-------------------------------+----------------+----------------------
---------+------------+--------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
10997 | streaming | 0/3000000 | 1 | 0/3001CD8 | 0/3001CD8 | 1 | 2023-06-13 11:53:40.527471+08 | 2023-06-13 11:53:39.837223+08 | 0/3001CD8 | 2023-06-13 11:22:07.5
94397+08 | pgstandby1 | 192.168.5.57 | 5432 | user=repl password=******** channel_binding=disable dbname=replication host=192.168.5.57 port=5432 fallback_application_name=walreceiver sslmode=disable
sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any
(1 row)
主库操作
postgres=# create database pyd;
CREATE DATABASE
从库操作
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
pyd | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
school | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres+
| | | | | =c/postgres
(5 rows)
[postgres@localhost data]$ pg_ctl -D /opt/pgsql/data/ -l logfile stop -m fast
[postgres@localhost pgsql]$ ./bin/pg_ctl -D /opt/pgsql/data/ promote
[postgres@localhost pgsql]$ ./bin/pg_controldata -D /opt/pgsql/data/
#查看状态为in production对外提供服务,另外standby.signal文件自动删除
重建standby.signal文件
[postgres@localhost ~]$ cd /opt/pgsql/data/
[postgres@localhost data]$ touch standby.signal
[postgres@localhost data]$ vim postgresql.auto.conf
primary_conninfo = 'user=repl password=repl channel_binding=disable host=192.168.5.58 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'pgstandby1'
新主库若没有配置复制槽,需要配置下
SELECT * FROM pg_create_physical_replication_slot(‘pgstandby1’);
SELECT slot_name, slot_type, active FROM pg_replication_slots;
启动备库
[postgres@localhost ~]$ pg_ctl -D /opt/pgsql/data/ start
pg_controldata #查看状态为in archive recovery