1. PostgreSQL与mysql的优劣势。

PostgreSQL的优势

  1. 稳定性和可靠性:在崩溃、断电等灾难场景下,它也能保持良好的抗打击能力。其主备复制属于物理复制,数据一致性更加可靠,复制性能更高。
  2. 性能和扩展性:在高并发读写和负载逼近极限的情况下,PostgreSQL仍能维持较好的性能指标。支持多种集群架构,提供了灵活的同步策略和操作方式,具有良好的扩展性。
  3. 数据类型和功能丰富度:PostgreSQL拥有丰富的数据类型,它还支持函数和条件索引等功能,为数据库调优提供了更多灵活性。
  4. 无锁定特性:PostgreSQL的“无锁定”特性,这种特性在处理高并发场景时具有很大优势,可以避免因锁定而导致的性能下降。
  5. 开源免费:PostgreSQL是完全免费的开源软件,用户无需考虑版权问题。

PostgreSQL的劣势

  1. 复杂性:相比一些其他数据库系统,PostgreSQL的配置和管理可能更加复杂。
  2. 缺乏商业支持:相比其他数据库系统,其商业支持可能相对有限。
  3. 文档和学习资源:与一些主流数据库相比,PostgreSQL的学习资源和文档可能相对较少。

MySQL的优势

  1. 开源和免费:MySQL是开源软件,用户可以免费获取和使用。
  2. 良好的性能:能够处理大量数据和高并发请求,并提供快速的数据读取和写入操作。
  3. 可扩展性:MySQL具有良好的可扩展性,可以通过主从复制、分区和集群等技术来扩展数据库的容量和吞吐量。
  4. 简单易用:MySQL具有较简单的安装和配置过程,同时提供了直观的管理工具和命令行接口,使得开发者可以快速上手并进行数据库操作。
  5. 强大的功能集:MySQL提供了丰富的功能和工具,包括事务支持、触发器与存储过程、索引和优化器等。

MySQL的劣势

  1. 不适合大规模数据仓库:在处理大规模数据仓库和复杂查询时,MySQL可能会遇到性能瓶颈。
  2. 有限的功能集:相比一些商业数据库管理系统,MySQL在某些高级功能方面可能有所欠缺,如空间数据处理或图形数据处理等特殊需求。
  3. 数据一致性:MySQL默认的隔离级别是可重复读(Repeatable Read),在某些情况下可能导致并发操作时的数据不一致问题。
  4. 存储限制:MySQL在某些方面存在存储限制,如最大表格大小、最大索引长度等,可能会对处理大型数据集或具有复杂数据结构的应用程序造成限制。

2. PGSQL的二进制安装和编译安装。

 PGSQL的安装有种方式
1.二进制安装分为centos系统和ubuntu系统

 二进制centos系统安装步骤

# Install the repository RPM:
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Disable the built-in PostgreSQL module:
yum -qy module disable postgresql
# Install PostgreSQL:
yum install -y postgresql14-server
# Optionally initialize the database and enable automatic start:
 /usr/pgsql-14/bin/postgresql-14-setup initdb#初始化数据库
 systemctl enable --now postgresql-14 #进行开机自启

 二进制Ubuntu系统安装步骤

sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt -y install postgresql-14
su - postgres
/usr/lib/postgresql/14/bin/initdb -D /var/lib/postgresql/data #初始化数据
/usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/data -l logfie start #启动pgsql

2.编译安装

下载PGSQL的tar包,在官网下载或在国内官方镜像站下载也可以
wget https://mirrors.aliyun.com/postgresql/source/v14.4/postgresql-14.4.tar.gz
yum install -y gcc make readline-devel zlib-devel #安装依赖包
tar xf postgresql-14.4.tar.gz#解压
cd postgresql-14.4
./configure #--prefix可以自己指定安装目录,如果不指定。默认的安装目录为/usr/local/pgsql
make 
make install
useradd  -s /bin/bash -m -d /home/postgres postgres #创建postgres用户
echo 123456 | password --stdin postgres #为posrgres用户创建密码
mkdir /usr/local/pgsql/data #创建文件夹
chown -R postgres.postgres /usr/local/psql/data #修改用户与用户组
su - postgres #切换用户
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data ##初始化数据
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfie start #启动pgsql

3. pg服务管理相关命令 pg_ctl 和psql命令选项及示例和不同系统的初始化操作

pg_ctl是一个使用的命令行工具其常见功能为
1.初始化PGSQL数据库实例

   pg_ctl init -D /usr/local/pgsal/data

2.启动、终止或重启PGsql数据库服务

   pg_ctl start|stop|restart

3.查看PGSQL数据库的状态

   pg_ctl status

4.让数据库实例重新读取配置文件

   pg_ctl reload

 psql是pgsql中一个命令行交互的客户端工具,类似mysql的mysql的命令行工具,允许交互输入SQL或命令。
 psql常见的参数

参数描述
-h指定要连接的数据库地址,默认是localhost
-p指定连接的数据库端口
-d指定要连接的数据库
-U指定以什么用户进行连接

 远程连接PGSQL数据库

   psql -h 10.76.0.184 -U postgres -d postgres -p 5432

4. pg数据库结构组织

在PGsql中数据库的组织架构可以分为五层

  1. 实例:一个PGSQL对应一个安装的数据目录即一个instance实例
  2. 数据库,一个PGSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的内容
  3. 模式,一个数据库可以创建多个不同的名称空间schema,用于分隔不同的业务数据
  4. 表和索引:一个数据库可以有多个表和索引
  5. 行和列:每张表中有很多列和行数据。

5. 实现pg远程连接。输入密码和无密码登陆

 默认pgsql是不允许其余远程用户对其进行连接的,因为该服务器默认是监听在127.0.0.1的地址上的,其端口号为5432

[root@rocky8-0.183 ~]$ss -ntl  
State            Recv-Q           Send-Q                     Local Address:Port                     Peer Address:Port          Process           
LISTEN           0                128                              0.0.0.0:22                            0.0.0.0:*                               
LISTEN           0                244                            127.0.0.1:5432                          0.0.0.0:*                               
LISTEN           0                128                                 [::]:22                               [::]:*           

 远程用户有密码连接操作(客户端IP为10.76.0.183,服务端ip为10.76.0.184)

服务端操作若为编译安装没有指定安装目录的话则为一下该目录,若pgsql的初始data目录应与下列不同。
[root@centos8-0.184 ~]$vim /usr/local/pgsql/data/postgresql.conf
[root@rocky8-0.183 ~]$vim /var/lib/pgsql/14/data/postgresql.conf 若为二进制安装则postgresql.conf在该目录下
在postgresql.conf配置文件中找到监听的地址#listen_addresses = 'localhost' 默认为localhost,将其更改为*表示允许全部地址。
[root@rocky8-0.183 ~]$psql -U postgres -h 10.76.0.184
psql: error: connection to server at "10.76.0.184", port 5432 failed: FATAL:  no pg_hba.conf entry for host "10.76.0.183", user "postgres", database "postgres", no encryption

 进行连接报错,显示的是在pg_hba.conf配置文件中该客户端ip地址没有通过验证, 因此还需要更改pg_hba.conf文件
 在PostgresSQL中,带有一个网络防火墙的功能的pg_hba.conf,可以控制允许设置哪些IP的机器访问数据库服务器
 在initdb初始化数据目录时,会生成一个默认的pg_hba.conf文件,该文件由很多记录组成,每条记录占一行。
 MD5表示使用密码进行验证
 trust:允许无条件连接,允许任何PostgreSQL用户身份登录,而无需密码或任何其他身份验证。
在这里插入图片描述

在pg_hba.conf中添加该行。然后切换用户重启服务
在pgsql数据库中修改postgres密码
[root@centos8-0.184 ~]$su - postgres 
postgres=# ALTER USER postgres with password '123456';
[postgres@centos8-0.184 ~]$pg_ctl restart 
最后在客户端进行有密码的连接,输入密码进行连接即可。
[root@rocky8-0.183 ~]$psql -U postgres -h 10.76.0.184
Password for user postgres: 
psql (14.12, server 14.4)
Type "help" for help.
postgres=# 
postgres的无密码连接利用.pgpass文件,创建.pgpass文件
.pgpass文件格式
#hostname:port:database:username:password
[root@rocky8-0.183 ~]$cat .pgpass 
10.76.0.184:5432:postgres:postgres:123456
修改文件的权限为600
[root@rocky8-0.183 ~]$chmod 600  .pgpass
在进行登录
[root@rocky8-0.183 ~]$psql -U postgres -h 10.76.0.184
psql (14.12, server 14.4)
Type "help" for help.
postgres=# 

6. 总结库,模式,表的添加和删除操作。表数据的CURD。同时总结相关信息查看语句。

登录数据库切换用户然后输入psql就进入数据库了,默认是进入postgres该数据库

参数描述
\l列出所有数据库名
\l+显示数据库详细信息
\c查看当前连接信息
\conninfo查看当前连接详细信息
\c数据库名,连接数据库

创建表

   create table tb1(id serial primary key,name text);

插入数据

   insert into tb1 (name) values (lll);

删除表

   drop table tb1;

7. 总结pg的用户和角色管理。

1. 角色与用户的概念
 角色:在PostgreSQL中,角色是一个用于管理数据库访问权限的实体。它可以拥有数据库对象(如表、视图、函数等)上的权限,也可以将权限授予其他角色或用户。
 用户:在PostgreSQL中,用户和角色在概念上是一致的。通常,我们把拥有登录权限的角色称为用户。
2. 创建用户和角色
 使用CREATE ROLE或CREATE USER命令可以创建新的角色或用户。例如,CREATE ROLE test LOGIN PASSWORD '123456'; 创建了一个名为test的登录角色,并设置了密码为123456。
3. 修改用户和角色
 使用ALTER ROLE命令可以修改角色的属性,如添加或删除权限、修改密码等。例如,ALTER ROLE test CREATEDB; 为test角色添加了创建数据库的权限。
4. 删除用户和角色
  使用DROP ROLE或DROP USER命令可以删除角色或用户。但在删除之前,需要确保该角色或用户没有被其他对象(如表、视图等)所依赖,否则无法直接删除。
5. 授权与撤销权限
 使用GRANT命令可以为角色或用户分配对数据库对象的特定操作权限。例如,GRANT SELECT ON TABLE tb1 TO test; 为test角色分配了对tb1表的SELECT权限。
 使用REVOKE命令可以撤销之前授予的权限。例如,REVOKE SELECT ON TABLE tb1 FROM test; 撤销了test角色对tb1表的SELECT权限。

8. 添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zabbix库有所有权限。

 1.登录到PostgreSQL

   psql -U postgres

 2.创建新模式magedu

   CREATE SCHEMA magedu;

 3.创建zabbix数据库

   CREATE DATABASE zabbix;

 4.创建新用户mage并设置密码为123456

   CREATE USER mage WITH PASSWORD '123456';

 5.设置mage用户的默认模式为magedu

   ALTER USER mage SET search_path TO magedu;

 6. 赋予mage用户对zabbix数据库的所有权限

   GRANT ALL PRIVILEGES ON DATABASE zabbix TO mage;

9. 总结pgsql的进程结构,说明进程间如何协同工作的。

  1. 进程结构
    服务器进程(Postmaster进程):它是PostgreSQL数据库服务器中所有进程的父进程,主要负责执行数据库的初始化、恢复、启动后台进程以及监听客户端的连接请求,通常通过执行带有start选项的pg_ctl工具来启动,在内存中分配共享内存区,并监听默认端口5432(或自定义端口)。
    Backend进程(Backend Process):由Postmaster进程启动,也称为“postgres”进程。
    处理连接的客户端发出的所有查询和语句,每个客户端连接都会导致一个Backend进程的创建。
    通过一个TCP连接与客户端通信,并在客户端断开连接时终止。
    Background进程(Background Process):执行特定任务的进程,如VACUUM、CHECKPOINT、WAL写入等,包括多个后台工作进程,如logger、checkpointer、background writer、walwriter、autovacuum launcher等。
    这些进程负责维护数据库的完整性和性能。
    BgWeiter后台写进程:为了提高插入、删除和更新数据的性能,当往数据库中插入或者更新数据时,并不会马上把数据持久化到文件中,而是先写入buffer中。
    walwriter预写式日志进程:预写式日志是在修改数据之前,必须把这些修改操作记录到磁盘中,这样后面更新实际数据时,就不需要实时的把数据持久化到文件中了。
    checkpointer检查点进程:检查点是事务序列中的点,保证在该点之前的所有日志信息都更新到数据文件中等。
    syslogger系统日志进程:默认没有此进程,在配置文件中设置参数logging_collect为on时,主进程才会启动syslogger辅助进程。
     等…进程。
  2. 进程间协同工作
    Postmaster进程与Backend进程:当Postmaster进程收到来自客户端的连接请求时,它会启动一个新的Backend进程来处理该连接,Backend进程与客户端通信,处理查询,并将结果返回给客户端。
    Backend进程与Backend进程:在并行查询中,多个Backend进程可能协同工作以加速查询处理,通过共享内存和进程间通信机制进行协作。
    Backend进程与Background进程:Background进程负责维护数据库的状态和性能,Backend进程在执行查询时可能会请求Background进程的服务,如请求CHECKPOINT进程进行检查点操作。
    共享内存(Shared Memory):PostgreSQL使用共享内存来缓存数据和事务日志,以减少磁盘I/O,多个进程可以访问共享内存中的数据,从而实现进程间的数据共享和协作。
    进程间通信(IPC):PostgreSQL进程间通过IPC进行通信,包括信号、消息队列和共享内存等,这些通信机制确保了进程之间能够高效、准确地传递信息和数据。

10. pgsql的数据目录中结构,以及每个文件的作用。

  1. 数据目录结构
     在Linux系统中,默认的数据目录可能位于/var/lib/pgsql/data或/var/lib/pgsql/版本/data/
    数据目录中的文件和目录大致可以分为以下几类:
    全局配置文件
       postgresql.conf: 主配置文件,包含了PostgreSQL实例的运行参数和设置。
    认证配置文件
      pg_hba.conf: 定义了哪些用户可以连接到哪个数据库,以及他们使用哪种认证方法。
    版本和状态文件
      PG_VERSION: 存储了当前PostgreSQL的版本信息。
      postmaster.pid: 存储了Postmaster进程的PID(进程ID)。
    日志和事务相关
      pg_commit_ts, pg_dynshmem, pg_logical, pg_multixact, pg_notify, pg_replslot, pg_serial, pg_snapshots, pg_stat, pg_subtrans, pg_twophase, pg_wal, pg_xact 等目录:这些目录包含了与事务、日志和复制相关的文件。
    数据文件
      base: 存储了用户创建的数据库文件,每个数据库在base目录下都有一个子目录。例如,如果有一个名为mydb的数据库,那么在base目录下会有一个与之对应的目录,该目录中存储了mydb的数据表、索引等对象的物理文件。
    global: 存储了一些共享系统表的数据。
    其他目录
       pg_stat_tmp: 存储了统计信息的临时文件。
      pg_tblspc: 存储了指向各个用户自建表空间实际目录的链接。
    2. 重要文件及目录示例说明
     postgresql.conf
      listen_addresses = '*' 表示监听所有IP地址的连接请求.定义了PostgreSQL实例的运行参数,如监听地址、端口、内存设置等。
     pg_hba.conf
      host all all 192.168.1.0/24 md5,定义了哪些用户可以连接到哪个数据库,以及他们使用哪种认证方法。上述示例表示来自192.168.1.0/24网络的用户可以使用MD5密码认证方式连接到所有数据库。
     base
      在base目录下,每个数据库都有一个与之对应的目录,如base/12345可能对应名为mydb的数据库。
    作用:存储了用户创建的数据库文件,包括表、索引、视图等对象的物理文件。
     pg_wal
      包含WAL文件,如000000010000000000000001。作用:存储了事务的预写日志,用于事务的恢复和数据完整性。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐