TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!
  1. 首页
  2. 数据库
  3. 正文

PostgreSQL 基操

2025年2月25日 2536点热度 8人点赞 0条评论

PostgreSQL

官网:https://www.postgresql.org/

中文手册:http://www.postgres.cn/docs/15/index.html

1.)安装PgSQL

1.1)源安装

https://www.postgresql.org/download/linux/ubuntu/

 root@pg-1:~# sudo apt install -y postgresql-common
 root@pg-1:~# sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
 root@pg-1:~# sudo apt install curl ca-certificates
 root@pg-1:~# sudo install -d /usr/share/postgresql-common/pgdg
 root@pg-1:~# sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
 root@pg-1:~# 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'
 ​
 root@pg-1:~# apt update
 root@pg-1:~# apt-cache madison postgresql
 postgresql | 17+274.pgdg22.04+1 | https://apt.postgresql.org/pub/repos/apt jammy-pgdg/main amd64 Packages
 postgresql |     14+238 | https://mirrors.aliyun.com/ubuntu jammy/main amd64 Packages
 postgresql-common |        238 | https://mirrors.aliyun.com/ubuntu jammy/main Sources
 root@pg-1:~# sudo apt -y install postgresql=14+238
 `初始化并启动`
 # 方法一
 root@pg-1:~# pg_createcluster 14 main --start  # 14 指的版本
 # 方法二
 root@pg-1:~# su - postgres 
 postgres@pg-1:~$ /usr/lib/postgresql/14/bin/initdb -D /var/lib/postgresql/data
     Success. You can now start the database server using:
     
         /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start
     
 `启动服务`
 postgres@pg-1:~$ /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start
 postgres@pg-1:~$ lsof -i :5432
 COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
 postgres 4653 postgres    5u  IPv4  47470      0t0  TCP localhost:postgresql (LISTEN)
 ​
 `停止服务`
 postgres@pg-1:~$ /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/data -l logfile stop
 `修改配置`
 postgres@pg-1:~$ vim  /var/lib/postgresql/data/postgresql.conf 
 ...
 listen_addresses = '192.168.139.161'
 ​
 `进入数据库`
 postgres@pg-1:~$ psql 

1.2)二进制安装

 #!/bin/bash
 #
 #********************************************************************
 #Author:            tanghao
 #QQ:                2826588067
 #Date:              2025-02-25
 #FileName:          install_postgresql.sh
 #URL:               https://www.stangj.com
 #Description:       The test script
 #Copyright (C):     2024 All rights reserved
 #********************************************************************
 ​
 POSTGRESQL_VERSION=15.12
 INSTALL_DIR=/apps/pgsql
 DATA_DIR=/apps/pgsql/data
 DB_USER=postgres
 CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
 . /etc/os-release
 ​
 color () {
     RES_COL=60
     MOVE_TO_COL="echo -en \\033[${RES_COL}G"
     SETCOLOR_SUCCESS="echo -en \\033[1;32m"
     SETCOLOR_FAILURE="echo -en \\033[1;31m"
     SETCOLOR_WARNING="echo -en \\033[1;33m"
     SETCOLOR_NORMAL="echo -en \E[0m"
     echo -n "$1" && $MOVE_TO_COL
     echo -n "["
     if [ $2 = "success" -o $2 = "0" ] ;then
         ${SETCOLOR_SUCCESS}
         echo -n $"  OK  "    
     elif [ $2 = "failure" -o $2 = "1"  ] ;then 
         ${SETCOLOR_FAILURE}
         echo -n $"FAILED"
     else
         ${SETCOLOR_WARNING}
         echo -n $"WARNING"
     fi
     ${SETCOLOR_NORMAL}
     echo -n "]"
     echo 
 }
 ​
 ​
 install_postgresql () {
     if [ $ID = 'centos' -o $ID = 'rocky' ];then
         yum install -y  gcc make readline-devel zlib-devel
     elif [ $ID = 'ubuntu' ];then
         apt update
         apt install -y  gcc make libreadline-dev zlib1g-dev
     else
         color "不支持此操作系统,退出!" 1
         exit
     fi
     if [ ! -f  postgresql-${POSTGRESQL_VERSION}.tar.gz ] ;then
         wget https://ftp.postgresql.org/pub/source/v${POSTGRESQL_VERSION}/postgresql-${POSTGRESQL_VERSION}.tar.gz
         
     fi
     tar xf postgresql-${POSTGRESQL_VERSION}.tar.gz
     cd postgresql-${POSTGRESQL_VERSION}
      ./configure --prefix=${INSTALL_DIR}
     make -j $CPUS world
     make install-world
     
     useradd -s /bin/bash -m -d /home/$DB_USER  $DB_USER
     
     mkdir ${DATA_DIR} -pv
     chown -R $DB_USER.$DB_USER ${DATA_DIR}/
     
     cat > /etc/profile.d/pgsql.sh <<EOF
 export PGHOME=${INSTALL_DIR}
 export PATH=${INSTALL_DIR}/bin/:\$PATH
 export PGDATA=${DATA_DIR}
 export PGUSER=postgres
 export MANPATH=${INSTALL_DIR}/share/man:$MANPATH
 ​
 alias pgstart="pg_ctl -D ${DATA_DIR} start"
 alias pgstop="pg_ctl -D ${DATA_DIR} stop"
 alias pgrestart="pg_ctl -D ${DATA_DIR} restart"
 alias pgrestatus="pg_ctl -D ${DATA_DIR} status"
 EOF
     
     su - $DB_USER -c 'initdb'
     
 }
 start_service () {
     cat > /lib/systemd/system/postgresql.service <<EOF
 [Unit]
 Description=PostgreSQL database server
 After=network.target
 ​
 [Service]
 User=postgres
 Group=postgres
 ​
 ExecStart=${INSTALL_DIR}/bin/postmaster -D ${DATA_DIR}
 ExecReload=/bin/kill -HUP $MAINPID
 ​
 [Install]
 WantedBy=multi-user.target
 ​
 EOF
     systemctl daemon-reload
     systemctl enable --now postgresql.service
     systemctl is-active postgresql.service
     if [ $? -eq 0 ] ;then 
         color "PostgreSQL 安装成功!" 0  
     else 
         color "PostgreSQL 安装失败!" 1
         exit 1
     fi   
 }
 ​
 ​
 install_postgresql
 start_service

2)基础使用PgSQL

2.1)初始化实例

范例: 创建新的数据库实例数据

 # chown postgres:/pgsql/
 # su - postgres
 $ pg_ctl init -D /pgsq1/data2

2.2) 服务管理

2.2.1)查看服务状态

 pg_ctl status -D [datadir]
 ### 示例
 # su - postgres
 $ pg_ctl status -D /pgsql/data2

2.2.2)启动服务

 pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path][-c]
 # 参数说明如下。
 start #启动数据库实例
 -w #等待启动完成
 -t #等待启动完成的等待秒数,默认为60秒
 -s#只打印错误和警告信息,不打印提示性信息
 -D datadir#指定数据库实例的数据目录
 -1 #服务器日志输出附加在“filename”文件上,如果该文件不存在则创建它
 -o options #声明要直接传递给postgres 的选项,具体可见postgres命令的帮助-p path #指定postgres可执行文件的位置。默认情况下postgres可执行文件来自和pg_ct1相同的目录,不必使用该选项。除非要进行一些不同寻常的操作,或者产生了postqres执行文件找不到的错误-c #提高服务器的软限制(ulimit -c),尝试允许数据库实例在有异常时产生一个coredump文件,以便于问题定位和故障分析

范例

 # su - postgres
 $ pg_ctl start -D /pgsql/data2
 $ pg_ctl status -D /pgsql/data2

2.2.3)停止服务

 # su - postgres
 $ pg_ctl stop -D /pgsql/data2
 $ pg_ctl status -D /pgsql/data2

2.2.4) 重启服务

 # su - postgres
 $ pg_ctl restart -D /pgsql/data2
 $ pg_ctl status -D /pgsql/data2

2.2.5)加载配置

在配置文件中改变参数后,需要使用上面这条命令使参数生效

 #修改配置文件 postgresq1.conf 后,让修改生效的方法有两种
 #方法一:在操作系统使用下面命令
 pg_ctl reload [-s][-D datadir]
 ​
 #方法二:在 psql 中使用如下命令
 postgres=# select pg_reload_conf();
 #注意:加载配置操作只针对一些配置的修改生效,有些配置需要重新启动服务才能生效

范例

 # su - postgres
 $ pg_ctl reload -D /pgsql/data2
 #注意:修改端口不支持reload,只能restart

3)PostgreSQL管理

3.1)配置文件解释

PostgreSQL使用环境变量PGDATA指向的目录做为数据存放的目录。这个目录是在安装时指定的,所以在安装时需要指定一个合适的目录作为数据目录的根目录,而且,每一个PG数据库实例都需要有这样的一个目录。此数据目录的初始化是使用命令initdb来完成的。

初始化完成后,PGDATA数据目录下就会生成三个配置文件

 postgresq1.conf #数据库实例的主配置文件,基本上所有的配置参数都在此文件中。
 pg_hba.conf     #认证配置文件,配置了允许哪些IP的主机访问数据库,认证的方法是什么等信息,
 pg_ident.conf   #认证方式ident的用户映射文件。

3.2)数据库相关概念

3.2.1)数据库结构组织

image-20250224214002650

在一个PostgreSQL数据库系统中,数据的组织结构可以分为以下五层:

  • 实例: 一个PostgreSQL对应一个安装的数据目录$PGDATA,即一个instance实例

  • 数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的内容

  • 默认情况下初始实例只有三个数据库:postgres、template0、template1

  • 模式:一个数据库可以创建多个不同的名称空间即Schema,用于分隔不同的业务数据表和索引:一个数据库可以有多个

  • 表和索引。在PostgreSQL中表的术语称为 Relation,而在其他数据库中通常叫Table

  • 行和列:每张表中有很多列和行数据。在 PostgreSQL 中行的术语一般为“Tuple”,而在其他数据库中则叫“Row"。

3.2.2)PostgreSQL中的术语

PostgreSQL有一些术语与其他数据库中不一样,了解了这些术语的意思,就能更好地看懂PostgreSQL中的文档。

与其他数据库不同的术语如下

  • Relation:表示表table或索引index,具体表示的是Table还是 Index需要看具体情况

  • Tuple:表示表中的行,在其他数据库中使用Row来表示

  • Segment:每个表和索引都单独对应一个文件,,即为segment,如果文件大小超过1GB,会创建多个相同名称但后缀不同的文件

  • Page:表示在磁盘中的数据块。在文件中以块为单位存放数据,默认值为8KB,最大可以为32KB

  • Buffer:表示在内存中的数据块。

范例:编译时可以指定片段大小

 [root@ubuntu2004 postgresq1-12.9]#./configure --help | grep segsize
 --with-segsize=SEGSIZE 设置表段大小为 GB[1]

3.2.3)PostgreSQL中的 schema

 #创建模式
 create schema schema_name;
 #删除模式
 drop schema schema_name;
 #查看模式
 \dn

要访问指定模式中的对象,需要先指定一个包含模式名及表名的名字,模式和表之间用一个“点”分开如下:

 schema_name.table_name

3.3)psql工具基本用法

psql的历史命令与补全的功能

  • 可以使用上下键把以前使用过的命令或SQL语句调出来

  • 连续按两个tab键表示把命令补全或给出提示输入

 psql -h <hostname or ip> -p <端口> [数据库名称] -U[用户名称]
 -h #指定要连接的数据库主机名或IP地址,默认1ocal socket登录(由配置项unix_socket_directories指定)
 ​
 -p #指定连接的数据库端口
 #最后两个参数是数据库名和用户名
 ​
 #这些连接参数也可以用环境变量指定,比如:
 export PGDATABASE=testdb
 export PGHOST=10.0.0.200
 export PGPORT=5432
 export PGUSER=postgres
 #然后运行psql即可,其效果与运行 psq1-h 10.0.0.200-p 5432 testdb postgres 相同。
 #可通过下面命令査看详细帮助:man /apps/pgsq1/share/man/man1/psql.1

范例:psql本地登录PGSQL

 #方法1
 [root@rocky8 ~]# psql -d postgres -U postgres
 psq1(12.9)Type "help" for help.
 postgres=#
 ​
 #方法2
 [root@rocky8 ~]#su - postgres
 [postgres@rocky8 ~]$psql
 psq7(15.12)Type "help" for help.
 postgres=#

范例:远程登录

 #注意:默认PostgresQL不支持远程登录,需要修改配置和授权才可以
 #如果不指定he11odb数据库,默认连接和用户名同名的数据库
 [root@rocky8 ~]# psq1 -h 10.0.0.200 -p 5432 hellodb postgres
 Password for user postgres:
 psq1(15.12)
 Type "help" for help.
 hellodb=#

范例:psql命令中直接执行 SQL

 [root@rocky8 ~]# psql -U postgres -h 10.0.0.200 -p 5432 -d postgres -c "select current_time'
 Password for user postgres:
 current_time
 04:43:48.508999+00
 (1 row)

范例:psql命令中执行文件中的 SQL

 [root@rocky8 ~]#cat test.sql 
 select current_time
 \du
 #方法一
 [root@rocky8 ~]#psql -U postgres -h 10.0.0.200 -p 5432 -d postgres -f test.sql
 ​
 # 方法二
 \i <文件名> 
 #执行存储在外部文件中的sq]语句或命令
 [postgres@rocky8 ~]$psql
 postgres=# \i hellodb.sql

3.4)连接管理

3.4.1)访问控制配置文件

在PostgreSQL中,带有一个网络防火墙的功能的文件pg_hba.conf,可以控制允许设置哪些IP的机器访问数据库服务器。

HBA的意思是host-based authentication,也就是基于主机的认证,即实现PostgreSQL防火墙功能

initdb初始化数据目录时,会生成一个默认的pghba.conf文件。

pg_hba.conf文件为pg实例的防火墙配置文件。配置文件格式分为5部分:

 TYPEDATABASE  USER  ADDRESS  METHOD

范例:

 #如果一台机器只给数据库使用,而没有其他用途,则可以在 pg_hba.conf 中加上下面一行配置:
 local all all trust
 #该配置表示在这台机器上,任何操作系统的用户都可以使用任何数据库用户(包括数据库超级用户)连接到数据库而不需要任何密码。因为这台主机只供数据库使用,可以把不用的操作系统用户都禁止掉,以保证安全性。
 ​
 #如果数据库中有一个用户“dba”,操作系统中也有一个用户“dba#在操作系统"dba”用户下连接数据库不需要密码验证的设置方法:
 local all dba ident
 ​
 #如果想在数据库主机上使用密码验证,可以使用下面的配置项:
 local all all md5
 ​
 #如果想让其他主机的连接都使用md5密码验证,则使用如下配置:
 host all all 0.0.0.0/0 md5
 ​
 #允许用户通过10.0.0.0/24的远程主机进行md5验证登录
 #TYPE DATABASE USER  ADDRESS   METHOD
 host  all     all   10.0.0.0/24 md5
 ​
 #允许用户 tang 通过任意远程主机进行md5验证登录test数据库
 #TYPE DATABASE USER  ADDRESS   METHOD
 host  all     tang   0.0.0.0/0 md5

3.4.2)打开远程连接

默认安装完的PG只监听local。如果要远程连接,需要监听对外提供服务的IP地址。 范例: 实现远程连接

 $ psql 
 psql (15.12)
 Type "help" for help.
 ​
 postgres=# ALTER USER postgres with password '123456';
 ALTER ROLE
 ​
 root@pg-1:~# vim /data/pgsql/postgresql.conf 
 ...
 listen_addresses = '0.0.0.0'            # what IP address(es) to listen on;
 ...
 root@pg-1:~# vim /data/pgsql/pg_hba.conf 
 ...
 # IPv6 local connections:
 host    all             all             ::1/128                 trust
 host    all             all             0.0.0.0/0                 md5 # 允许数据库中所有用户通过任何地址进行密码连接
 ​
 #重启服务生效
 postgres@pg-1:~$ pg_ctl restart -mf # 也可以 pg_ctl restart 

范例: 利用.pgpass文件实现免密码连接远程posgresql

 [root@rocky8 ~]#vim .pgpass
 #hostname:port:database:username:password
 10.0.0.200:5432:testdb:postgres:123456
 [root@rocky8 ~]#chmod 600 .pgpass
 [root@rocky8 ~]#11 .pgpass
 -rw-------1 root root 8l Dec 30 10:04 .pgpass
 ​
 #psq1默认连接本机,需要指定和.pgpass文件内容相匹配信息才可以使用.pgpass文件连接
 [root@rocky8 ~]# psq1 -h 10.0.0.200 -U postgres -d testdb -w
 ..
 testdb=# \c
 You are now connected to database "testdb" as user "postgres"
 testdb=#

3.5)常用操作

3.5.1)查看psql帮助

 #列出psq1帮助用法
 help
 #列出以\开头的命令,即psql的命令
 \?
 #列出所有SQL命令的帮助,注意:SQL语句必须以
 \h
 #查看指定SQL的帮助
 \h create database
 \help create user

3.5.2)数据库的创建和删除

创建数据库可以使用SQL语句 create database 实现,也可以利用 createdb 命令创建数据库

创建数据库

 #方法1
 [root@ubuntu2204 ~]# createdb -h 10.0.0.200 -p 5432 -U postgres testdb
 Password:
 #方法2
 postgres@ubuntu2204:~$ 
 psq1postgres=# create database testdb;

删除数据库

 postgres@ubuntu2204:~$psql
 postgres=# drop database testdb;

3.5.3)管理和查看模式

一个数据库包含一个或多个已命名的模式,模式又包含表。模式还可以包含其它对象,包括数据类型、函数、操作符等。同一个对象名可以在不同的模式里使用而不会导致冲突;比如,schema1和schema2都可以包含-一个名为test的表

 #创建模式
 create schema schema_name;
 #删除模式
 drop schema schema_name;
 #列出所有schema
 postgres=# \dn
 ​
 postgres=# create database testdb;
 CREATE DATABASE
 postgres=# \c testdb
 testdb=# create schema schema_test;
 testdb=# create table schema_test.t1(id int);
 CREATE TABLE
 testdb=# \dn
          List of schemas
     Name     |       Owner       
 -------------+-------------------
  public      | pg_database_owner
  schema_test | postgres
 (2 rows)
 testdb=# \dt schema_test.*
            List of relations
    Schema    | Name | Type  |  Owner   
 -------------+------+-------+----------
  schema_test | t1   | table | postgres
 (1 row)

3.5.4)查看和连接数据库

 #列出所有数据库名,相当于MySQL中的show databases
 testdb=# \l
 #显示数据库详细信息,比如大小
 testdb=# \l+
 #查看当前连接信息
 testdb=# \c
 You are now connected to database "testdb" as user "postgres".
 #查看当前连接详细信息
 testdb=# \conninfo 
 You are connected to database "testdb" as user "postgres" via socket in "/tmp" at port "5432".
 #连接数据库,相当于use
 postgres=# \c testdb 
 You are now connected to database "testdb" as user "postgres".

3.5.5)管理表

PostgreSQL 支持多种数据类型实现表结构的创建

 testdb=# \c testdb ;
 testdb=# create table tb1 (id serial primary key,name text);
 testdb=# insert into tb1 (name) select(md5(random()::text)) from generate_series(2,10);
 ​
 testdb=# select * from tb1;
  id |               name               
 ----+----------------------------------
   1 | 9a34896c9bf93906ef6262ca7f747def
   2 | 7e6b597084579ad5b17792e5a3fcd365
   3 | 91a8446ff6c28959540bd1ad3d3fd89c
   4 | e3d45ace7a951dedf87f3fc1141a8661
   5 | 306e49b45f645c094b30606e36375d7c
   6 | e7e102aeffadd3978da98e65d720f442
   7 | eb3df6c9cbedbcaa783e5edc45827c76
   8 | f8dff7f866d7690147a772f73ace5930
   9 | e39f839e161bd514c7e60ec683ff8dca
 ​
 # PostgresQL中插入100万条记录只需要花2s
 # 打开时间计算
 testdb=# \timing on
 testdb=# insert into tb1 (name) select(md5(random()::text)) from generate_series(2,1000000);
 INSERT 0 999999
 Time: 2351.579 ms (00:02.352)
 ​
 #复制表结构,不复制数据
 testdb=# create table tb2 ( like tb1 );
 CREATE TABLE
 Time: 2.549 ms
 ​
 testdb=# \d tb2 
                 Table "public.tb2"
  Column |  Type   | Collation | Nullable | Default 
 --------+---------+-----------+----------+---------
  id     | integer |           | not null | 
  name   | text    |           |          | 
 ​
 testdb=# \d tb1
                             Table "public.tb1"
  Column |  Type   | Collation | Nullable |             Default             
 --------+---------+-----------+----------+---------------------------------
  id     | integer |           | not null | nextval('tb1_id_seq'::regclass)
  name   | text    |           |          | 
 Indexes:
     "tb1_pkey" PRIMARY KEY, btree (id)
 ​
 testdb=# select * from tb2 ;
  id | name 
 ----+------
 (0 rows)

3.5.6)查看表和表信息

 #列出所有表,视图,序列
 \d
 #列出public的schema中所有的表名,相当于show tabledt
 \dt
 #查看t1的表信息
 \dt t1
 #支持通配符*和?,以下显示所有t开头的表
 \dt t*
 #列出myschema模式的表结构
 \dt myschema.*
 #查看t1的表结构,相当于desc
 \d t1
 #列出所有表信息,包括大小
 testdb=# \dt+
                                      List of relations
  Schema | Name | Type  |  Owner   | Persistence | Access method |    Size    | Description 
 --------+------+-------+----------+-------------+---------------+------------+-------------
  public | tb1  | table | postgres | permanent   | heap          | 65 MB      | 
  public | tb2  | table | postgres | permanent   | heap          | 8192 bytes | 
  
 #列出表信息的大小信息
 testdb=# \dt+ tb2
                                      List of relations
  Schema | Name | Type  |  Owner   | Persistence | Access method |    Size    | Description 
 --------+------+-------+----------+-------------+---------------+------------+-------------
  public | tb2  | table | postgres | permanent   | heap          | 8192 bytes | 
 (1 row)
 ​
 # 查看所有表
 testdb=# select * from pg_tables;

查看表对应的文件径

 testdb=# select relid from pg_stat_all_tables where relname='tb2';
  relid 
 -------
  16404
 (1 row)
 ​
 Time: 2.637 ms

3.5.7)表的CRUD

SQL的CRUD,即Insert,update,delete,select 四条语句范例:

 testdb=# create table tb1 (id serial , name varchar(10));
 CREATE TABLE
 Time: 0.870 ms
 ​
 # 查看表结构
 testdb=# \d tb1;
                                    Table "public.tb1"
  Column |         Type          | Collation | Nullable |             Default             
 --------+-----------------------+-----------+----------+---------------------------------
  id     | integer               |           | not null | nextval('tb1_id_seq'::regclass)
  name   | character varying(10) |           |          | 
 ​
 # 插入数据
 testdb=# insert into tb1(name)values('tang');
 INSERT 0 1
 Time: 1.127 ms
 testdb=# insert into tb1 (name) values('hao');
 INSERT 0 1
 Time: 0.575 ms
 ​
 # 查询数据
 testdb=# select * from tb1;
  id | name 
 ----+------
   1 | tang
   2 | hao
 (2 rows)
 ​
 Time: 0.171 ms
 ​
 # 修改数据
 testdb=# update tb1 set name='li' where id=2;
 UPDATE 1
 Time: 0.672 ms
 testdb=# select * from tb1;
  id | name 
 ----+------
   1 | tang
   2 | li
 (2 rows)
 ​
 Time: 0.148 ms
 ​
 # 删除数据
 testdb=# delete from tb1 where id=2;
 DELETE 1
 Time: 0.787 ms
 testdb=# select * from tb1;
  id | name 
 ----+------
   1 | tang
 (1 row)
 ​
 Time: 0.172 ms
 ​
 # 清空表
 testdb=# select * from tb1;
  id | name 
 ----+------
 (0 rows)
 ​
 Time: 0.244 ms

范例: 查看表的列信息及大小

 testdb=# \d tb1
                                    Table "public.tb1"
  Column |         Type          | Collation | Nullable |             Default             
 --------+-----------------------+-----------+----------+---------------------------------
  id     | integer               |           | not null | nextval('tb1_id_seq'::regclass)
  name   | character varying(10) |           |          | 
 ​

3.5.8)索引管理

创建和删除索引

 testdb=# create table tb3(id int,info text,crt_time timestamp);
 CREATE TABLE
 Time: 2.222 ms
 ​
 testdb=# insert into tb3 select generate_series(1,100000),(md5(random()::text)),clock_timestamp();
 INSERT 0 100000
 Time: 90.946 ms
 ​
 testdb=# select * from tb3 limit 3;
  id |               info               |          crt_time          
 ----+----------------------------------+----------------------------
   1 | 58d2c3fa4da4e23456f19c8eb1c38e25 | 2025-02-25 21:36:07.874925
   2 | 56abe68dc73b6a2e768129dff49223b6 | 2025-02-25 21:36:07.874999
   3 | 91388affda276267c5ea770d615bf0d5 | 2025-02-25 21:36:07.875002
 (3 rows)
 ​
 Time: 0.182 ms
 ​
 #创建索引
 testdb=# create index idx_tb3_id on tb3(id);
 CREATE INDEX
 Time: 125.913 ms
 ​
 testdb=# \d tb3 
                            Table "public.tb3"
   Column  |            Type             | Collation | Nullable | Default 
 ----------+-----------------------------+-----------+----------+---------
  id       | integer                     |           |          | 
  info     | text                        |           |          | 
  crt_time | timestamp without time zone |           |          | 
 Indexes:
     "idx_tb3_id" btree (id)
 ​
 #删除索引
 testdb=# drop index idx_tb3_id ;
 DROP INDEX
 Time: 1.014 ms

使用索引

 testdb=# create index idx_tb3_id on tb3(id);
 CREATE INDEX
 Time: 28.773 ms
 # 使用索引查
 testdb=# explain analyze select * from tb3 where id = 9999;
                                                    QUERY PLAN                                              
       
 -----------------------------------------------------------------------------------------------------------
 ------
  Index Scan using idx_tb3_id on tb3  (cost=0.29..8.31 rows=1 width=45) (actual time=0.008..0.009 rows=1 loo
 ps=1)
    Index Cond: (id = 9999)
  Planning Time: 0.124 ms
  Execution Time: 0.019 ms
 (4 rows)
 ​
 Time: 0.344 ms
 ​
 # 不使用索引查
 testdb=# explain analyze select * from tb3 where info = '43f08dd1dff9644b2bfdeba4faaf2d15';
                                            QUERY PLAN                                            
 -------------------------------------------------------------------------------------------------
  Seq Scan on tb3  (cost=0.00..2185.00 rows=1 width=45) (actual time=0.064..6.216 rows=1 loops=1)
    Filter: (info = '43f08dd1dff9644b2bfdeba4faaf2d15'::text)
    Rows Removed by Filter: 99999
  Planning Time: 0.034 ms
  Execution Time: 6.227 ms
 (5 rows)
 ​
 Time: 6.548 ms

3.5.9)表空间

 #列出所有表空间,实际上PostgresQL中的表空间就是对应一个目录,放在这个表空间的表,就是把表的数据文件放到这个表空间下。
 testdb=# \db
        List of tablespaces
     Name    |  Owner   | Location 
 ------------+----------+----------
  pg_default | postgres | 
  pg_global  | postgres | 
 (2 rows)
 ​
 # 创建表空间
 postgres@pg-1:~$ mkdir /tmp/tbs1
 ​
 postgres=# create tablespace tbsl location '/tmp/tbs1';
 CREATE TABLESPACE
 postgres=# create table tb5(id int) tablespace tbsl;
 CREATE TABLE
 ​
 # 数据就在 /tmp/tbs1/ 
 postgres=# select * from pg_relation_filepath('tb5');
           pg_relation_filepath           
 -----------------------------------------
  pg_tblspc/16424/PG_15_202209061/5/16425
 ​
 postgres@pg-1:~$ tree /tmp/tbs1/
 /tmp/tbs1/
 └── PG_15_202209061
     └── 5
         └── 16425

3.5.10)查看系统信息

 #查看版本信息
 postgres=# select version();
                                                 version                                                 
 --------------------------------------------------------------------------------------------------------
  PostgreSQL 15.12 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit
 (1 row)
 ​
 #查看数据库启动时间
 postgres=# select pg_postmaster_start_time();
    pg_postmaster_start_time    
 -------------------------------
  2025-02-25 20:37:44.521253+08
 (1 row)
 ​
 #查看加载配置文件时间
 postgres=# select pg_conf_load_time();
        pg_conf_load_time       
 -------------------------------
  2025-02-25 20:37:44.232002+08
 (1 row)
 ​
 #查看时区和时间
 postgres=# show timezone;
  TimeZone 
 ----------
  PRC
 (1 row)
 ​
 #临时修改
 postgres=# set timezone='Asia/shanghai';
 SET
 ​
 #永久修改时间
 postgres@pg-1:~$ vim /data/pgsql/postgresql.conf 
 timezone = 'Asia/shanghai'
 ​
 postgres@pg-1:~$ pg_ctl reload
 server signaled
 ​
 postgres=# select now();
               now              
 -------------------------------
  2025-02-25 22:03:13.988801+08
 (1 row)
 ​
 #查看当前指定配置
 postgres=# show max_connections;
  max_connections 
 -----------------
  100
 (1 row)

3.5.11)查看用户和权限

 #查看所有用户\du或\dg
 postgres=# \du
                                    List of roles
  Role name |                         Attributes                         | Member of 
 -----------+------------------------------------------------------------+-----------
  postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 ​
 postgres=# \dg
                                    List of roles
  Role name |                         Attributes                         | Member of 
 -----------+------------------------------------------------------------+-----------
  postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 ​
 #查看当前用户
 postgres=# select user;
    user   
 ----------
  postgres
 (1 row)
 ​
 #显示表,视图,序列的权限分配情况
 postgres=# \z
                             Access privileges
  Schema | Name | Type  | Access privileges | Column privileges | Policies 
 --------+------+-------+-------------------+-------------------+----------
  public | tb5  | table |                   |                   | 
 (1 row)
 ​

3.6)用户和角色

3.6.1)创建用户和角色

在PostgreSQL中,用户与角色是没有区别的, 用户和角色可以用来实现以下功能:

  • 用来登录数据库实例、

  • 管理数据库对象

创建用户与角色的语法如下:

 CREATE USER name [[WITH] option [...]
 CREATE ROLE name [[WITH] option [...]
 #上面两个命令都可以创建用户,
   # 不同的是CREATE USER 创建的用户默认可以登录,而 CREATE ROLE不可以登录
 #除了CREATE USER 默认创建出来的用户有LOGIN 的权限,而 CREATE ROLE 创建出来的用户没有“LOGIN"的权限之外,CREATE RULE 与 CREATE USER没有其他任何的区别。

3.6.2)用户管理案例

 #查看帮助
 \h create user
 \h alter user
 \h drop user
 \h create role
 \h alter role
 \h drop role
 #以下两个命令用法相似
 create user  #创建的用户默认可以连接
 create role  #创建的用户默认无法连接
 ​
 #修改用户
 alter user
 #删除用户
 drop user
 ​
 #显出所有用户和角色
 #\du和\dg命令等价。原因是在PostgresQL数据库中用户和角色不分的。

范例

 #创建可以登录的用户和密码
 postgres=# CREATE USER tang WITH PASSWORD '123456';
 #创建不可登录用户
 postgres=# CREATE ROLE hao WITH PASSWORD '123456';
 #创建管理员
 postgres=# CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD '123456';
 #创建复制用户
 postgres=# CREATE USER rePI REPLICATION LOGIN ENCRYPTED PASSWORD '123456';
 #修改密码
 postgres=# ALTER USER admin with password '654321';
 #修改权限和密码
 postgres=# alter user hao with nologin password '258369';
 #删除用户
 postgres=# DROP USER hao;
 #查看所有用户
 postgres=# \du
                                    List of roles
  Role name |                         Attributes                         | Member of 
 -----------+------------------------------------------------------------+-----------
  admin     | Superuser                                                  | {}
  postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
  repi      | Replication                                                | {}
  tang      |                                                            | {}
 # 查看指定用户
 postgres=# \du admin 
            List of roles
  Role name | Attributes | Member of 
 -----------+------------+-----------
  admin     | Superuser  | {}
 ​

3.6.3)权限管理

一个用户的权限分为两类,一类是在创建用户时就指定的权限,这些权限如下:

  • 超级用户的权限

  • 创建数据库的权限

  • 是否允许LOGIN的权限

以上这些权限是创建用户时指定的,后续可使用ALTER ROLE命令来修改。

还有一类权限,是由命令GRANT和 REVOKE来管理的,这些权限如下:

  • 在数据库中创建模式(SCHEMA)

  • 允许在指定的数据库中创建临时表连接某个数据库

  • 在模式中创建数据库对象,如创建表、视图函数等

  • 在一些表中做SELECT、UPDATE、INSERRDELETE等操作等

 #GRANT命令有两个作用
 #1.让某个用户成为某个角色的成员,从而使其拥有角色的权限
 #2.把某些数据库逻辑结构对象的操作权限赋予某个用户(或角色)

PostgresQL中的权限是按以下几个层次进行管理的:

  • cluster权限:实例权限通过pg_hba.conf配置

  • 管理赋在用户特殊属性上的权限,如超级用户的权限、创建数据库的权限、创建用户的权限Login权限等

  • 在数据库中创建模式的权限

  • 表空间权限: 通过grant/revoke控制权限操作表,物化视图,索引等

  • 在模式中创建数据库对象的权限,如创建表、创建索引,等等

  • 查询表、往表中插入数据、更新表、删除表中数据的权限

  • 操作表中某些字段的权限

3.6.4)权限案例

 #授权创建新数据库
 postgres=# alter user tang with CREATEDB;
 #database权限设置 (授权 testdb 数据库)
 postgres=# GRANT create ON DATABASE testdb To tang;
 #schema权限
 ALTER SCHEMA tang OWNER to tang;
 postgres=# \dn
          List of schemas
     Name     |       Owner       
 -------------+-------------------
  public      | pg_database_owner
  schema_name | postgres
 (2 rows)
 postgres=# ALTER SCHEMA schema_name OWNER to tang;
 ​
 #创建 test的schema指定所有者为tang
 postgres=# CREATE SCHEMA IF NOT EXISTS teSt AUTHORIZATION tang;
 ​
 #object权限(授权schema testdb.tb1 有 CRUD 权限)
 GRANT select,insert,update,delete ON testdb.tb1 To tang;
 ​
 #创建数据库并指定所有者的用户
 create user wangs with password '123456';
 CREATE DATABASE zabbix OWNER wangs;

范例: 创建业务用户和授权

 postgres=# create database pinxixi;
 postgres=# \c pinxixi 
 pinxixi=# create user xiaoming with password '123456';
 # 方法一
 pinxixi=# create schema xiaoming ;
 pinxixi=# ALTER SCHEMA xiaoming OWNER to xiaoming;
 # 方法二
 pinxixi=# CREATE SCHEMA AUTHORIZATION xiaoming;
 # 方法三
 pinxixi=# GRANT select,insert,update,delete ON ALL TABLES IN SCHEMA xiaoming to xiaoming

范例:创建只读用户

 # 创建独用户
 CREATE USER readonly with password '123456';
 # 把在 public 的 schema 下现有的所有表的 SELECT 权限赋给用户readonly
 GRANT SELECT ON ALL TABLES IN SCHEMA public To readonly;
标签: 暂无
最后更新:2025年2月28日

tanghao946

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • PostgreSQL
    • 1.)安装PgSQL
      • 1.1)源安装
      • 1.2)二进制安装
    • 2)基础使用PgSQL
      • 2.1)初始化实例
      • 2.2) 服务管理
      • 2.2.3)停止服务
      • 2.2.4) 重启服务
      • 2.2.5)加载配置
    • 3)PostgreSQL管理
      • 3.1)配置文件解释
      • 3.2)数据库相关概念
      • 3.3)psql工具基本用法
      • 3.4)连接管理
      • 3.5)常用操作
      • 3.6)用户和角色

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号