03:PostgreSQL逻辑结构(表空间、数据库、模式、表、索引)

环境规划:

  • 操作系统:CentOS 7.9 64bit
  • PostgreSQL 版本:16.x 或 15.x
  • 安装用户:postgres
  • 软件安装目标路径:/usr/pgsql-<version>
  • 数据库数据目录:/pgdata

目录

表空间Tablespace

  默认表空间

  手动创建的表空间

实例/Database/Schema/对象关系

数据库Database

  默认数据库

  手动创建的数据库

模式Schema

  默认Schema 

  模式搜索路径search_path

  删除public模式

  建议对template1中删除public模式

表Table 

  表创建、插入、删除

  表结构复刻

  临时表

  UNLOGGED表

索引Index 


本文假设已经掌握SQL基本语法和数据库基础概念。因此只简明扼要介绍PostgreSQL的逻辑结构。

表空间Tablespace

  默认表空间

数据库初始化之后自动会创建pg_default和pg_global两个表空间(pg_tablespace视图查看,也可以通过在psql中使用“\db+”查看)。

  • pg_default表空间:是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应存储目录$PADATA/base/  (template0、template1和postgres数据库存放在pg_default表空间下)
  • pg_global表空间:用来存放系统字典表,共享系统目录;对应存储目录$PADATA/global/。相当于oracle数据库的system表空间

  手动创建的表空间

1、为表空间创建存放目录($PGDATA在本环境为/pgdata),在数据库服务器操作系统中以postgres用户执行:

mkdir -p $PGDATA/pg_tblspc/tbs_user1

 2、创建表空间。在psql中执行语句:

CREATE TABLESPACE tbs_user1 LOCATION  '/pgdata/pg_tblspc/tbs_user1';

创建tablespace的其他option选型,请参考官方文档。

实例/Database/Schema/对象关系

在PostgreSQL中,这几者之间关系为:

PG数据库服务(实例)

      └ database1

            └ schemaA

                   └ table_T1

                   └ table_T2

                   └ view_V1

            └ schemaB

      └ database2

            └ schemaA

            └ schemaB

      └ database3

            └ schemaA

            └ schemaB

PG数据库服务(实例)中可以有多个数据库(database),在psql工具中可以通过\c切换所连接的库。每个数据库下有不同的shema、每个schema下有不同的对象。

  • MySQL没有上图中数据库概念,只有上图的schema(在MySQL中schema也称为database,实际应为schema)
  • 在Oracle中,用户与Schema是绑定对应的,一个用户就是一个Schema。

数据库Database

  默认数据库

数据库初始化之后自动会创建postgres、template0、template1三个数据库。

  • postgres数据库:这是默认的管理数据库,用于管理 PostgreSQL 服务器和用户角色。它包含了用于管理服务器和用户的系统表,例如 pg_roles、pg_database 等。通常不建议用于存储实际数据,而仅用于管理目的。
  • template0数据库:这是一个空模板数据库,改模版非常“干净”,且不可修改。可用于创建其他数据库的模板。。
  • template1数据库:与 template0 类似,也是一个模板数据库,可用于创建其他数据库的模板。但与 template0 不同的是,template1 是可以被修改的,比如修改模版字符集、或者可以在其中创建用户自定义的对象,例如函数、表等。默认情况,我们新创建database会以template1库为模板进行创建。

  手动创建的数据库

在psql中执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该库的owner,默认使用template1模板
CREATE DATABASE userdb;--(推荐)指定其中该库的owner、模板、字符编码、表空间。
CREATE DATABASE userdb OWNER user_zyp TEMPLATE template0 ENCODING 'UTF8' TABLESPACE tbs_user1;

更多option选型,请参考官方文档。 

模式Schema

  默认Schema 

创建数据库时会自动会创建information_schema、pg_catalog、pg_toast、public四个模式。

手动创建的模式schema,在psql中(先连接至某个数据库)执行语句:

--(不推荐)最简单创建
--其中:以执行语句的当前用户作为该模式的owner
CREATE SCHEMA 模式名;--(推荐)指定模式owner
CREATE SCHEMA 模式名 AUTHORIZATION 角色名/用户名;--修改已有模式名
ALTER SCHEMA 模式名 RENAME TO 新模式名;--修改已有模式的owner
ALTER SCHEMA 模式名 OWNER TO 角色名/用户名;

更多option选型,请参考官方文档。 

查看对象所属模式:

查看表所属模式
SELECT table_schema, table_name FROM information_schema.tables;查看视图所属模式
SELECT table_schema, table_name FROM information_schema.views;查看存储过程、函数所属模式
SELECT specific_schema, specific_name FROM information_schema.routines;查看序列所属模式
SELECT sequence_schema, sequence_name FROM information_schema.sequences;查看触发器所属模式
SELECT trigger_schema, trigger_name FROM information_schema.triggers;

  模式搜索路径search_path

由于存在多个模式,PostgreSQL提供了模式搜索路径(类似Linux中的PATH环境变量)来查找数据库中各对象。若语句中没有显示指定schema,则从search_path中存的模式列表中搜索:

  • 查找某个对象(表、视图、函数、索引等):则从search_path中左至右搜索,若在某模式下可找到对象,则以该模式下的对象作为选中对象。若遍历所有模式均未找到,则报不存在该对象Did not find any.......。
  • 若需要创建对象,则从search_path中左至右搜索,若某个模式存在且当前用户对该模式具有CREATE权限(Owner永远有创建权限),则以该模式作为新创建对象的所属模式。

查看和修改模式搜索路径search_path:

--查看
SHOW search_path;--修改(当前会话级别)
SET search_path TO "$user", public;--修改(数据库级别,重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user", public;--修改(用户级别,重新登录后生效)
ALTER ROLE 角色名/用户名 SET search_path TO "$user", public;

search_path中:$user 表示模式名等于当前用户名,既仅在当前用户名与schema同名才能匹配上。

  删除public模式

PostgreSQL中每个database都默认存在public模式,而public不是SQL标准概念,在其他数据库软件中也不存在public模式。

因此,为了最大程度兼容,并考虑可一致性,强烈建议删除public模式不使用

若经评估不适合删除public模式,为避免不小心误将对象创建public模式下,至少应撤销在public模式下创建对象权限,命令参考如下

--默认:所有用户对public模式具有CREATE和USAGE权限。
--撤销在public模式下创建对象权限。第一个public指模式名,第二个PUBLIC表示所有用户
REVOKE CREATE ON SCHEMA public FROM PUBLIC;--以超级用户,修改所有用户的search_path,去除public(重新登录后生效)
ALTER ROLE ALL SET search_path TO "$user";--修改数据库,去除public(重新连接生效)
ALTER DATABASE 数据库名 SET search_path TO "$user";--删除模式
DROP SCHEMA public;

  建议对template1中删除public模式

建议将template1模板中的public模式删除,这样使用template1模板在新创建数据库时,新库就不再有public模式

--连接
\c template1;--修改数据库,去除public
ALTER DATABASE template1 SET search_path TO "$user";--删除模式
DROP SCHEMA public;

表Table 

  表创建、插入、删除

略。

注意:在PostgreSQL更新一条数据,源数据并不会覆盖,而是会插入一条新的数据。

  表结构复刻

CREATE TABLE 新表名 (LIKE 母表 like_option)like_option常见的:INCLUDING COMMENTSINCLUDING COMPRESSIONINCLUDING CONSTRAINTSINCLUDING DEFAULTSINCLUDING GENERATEDINCLUDING IDENTITYINCLUDING INDEXES --新的索引名为:新表名_涉及字段名_idxINCLUDING STATISTICSINCLUDING STORAGEINCLUDING ALL

CREATE TABLE LIKE:以母表为源复刻表结构,不涉及数据。

CREATE TABLE AS: 以select结果集创建表并fill填充数据

  临时表

CREATE TEMPORARY TABLE tb_tmp_t1 (name varchar(32));\d+ tb_tmp_t1;

  • 临时表分为两种:会话级别、事务级别。在创建临时表语句增加ON COMMIT选型来区分。
  • 临时表在会话结束后,表即会消失(表数据和表结构均会消失)
  • 临时表所属的schema为特殊schema,名字为pg_temp_N (不同的会话N不同)

  UNLOGGED表

CREATE UNLOGED TABLE tb_unlogged_t01 (name varchar(32));

 UNLOGGED表不会写WAL日志,无法实现主备库之间同步(在主库机器上会存储该表),使用上与普通表没有区别。UNLOGGED在插入/删除/更新性能会略高。

索引Index 

略。

PostgreSQL支持在创建索引是通过选项CONCURRENTLY进行并发创建索引,避免在创建过程中阻塞对表的插入/删除/更新操作。

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

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

相关文章

民国漫画杂志《时代漫画》第15期.PDF

时代漫画15.PDF: https://url03.ctfile.com/f/1779803-1247458444-8befd8?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Nodejs(文件操作,构建服务器,express,npm)

文章目录 文件操作1.读取文件1&#xff09;步骤2&#xff09;范例 2.写文件1&#xff09;步骤2&#xff09;范例 3.删除文件4.重命名文件夹5删除文件夹 Url1.url.parse()2.url.fomat() Query1.query.parse()2.query.stringfy()3.编码和解码 第三方模块1.nodemailer2.body-parse…

BUUCTF-Misc24

从娃娃抓起1 1.打开附件 是两个文本文件 2.电报码 电报码在线翻译网站&#xff1a;https://usetoolbar.com/convert/cccn.html 3.汉字五笔编码 汉字五笔编码在线网站查询&#xff1a;https://www.qqxiuzi.cn/bianma/wubi.php 4.转化为MD5值 将文字保存到文本文档 用winR输入…

部署ELK日志分析系统——超详细

ELK日志分析系统 文章目录 ELK日志分析系统资源列表基础环境一、环境准备二、部署Elasticsearch软件2.1、安装Elasticsearch软件2.2、加载系统服务2.3、更改Elasticsearch主配置文件2.4、创建数据存放路径并授权2.5、启动Elasticsearch2.6、查看节点信息 三、安装Elasticsearch…

【WEEK13】 【DAY5】Shiro第五部分【中文版】

2024.5.24 Friday 接上文【WEEK13】 【DAY4】Shiro第四部分【中文版】 目录 15.7.Shiro请求授权的实现15.7.1.修改ShiroConfig.java15.7.1.1.添加一行验证授权的代码15.7.1.2.重启 15.7.2.修改MyController.java15.7.3.修改ShiroConfig.java15.7.4.重启15.7.5.修改UserRealm.ja…

Jenkins 动态salve简单配置连接 EKS

安装Jenkins helm repo add jenkins https://charts.jenkins.io helm repo update # 当前版本 jenkins-5.1.18.tgz瘦身后的 values.yaml # grep -Ev ^\s*#|^$ values.yaml nameOverride: fullnameOverride: namespaceOverride: clusterZone: "cluster.local" kubern…

C#对文件进行批量重命名或者对某个单独的文件进行改名

目录 一、FolderBrowserDialog 二、OpenFileDialog 三、Path 四、ui设计 五、代码部分 一、FolderBrowserDialog FolderBrowserDialog是一个用于选择文件夹的对话框控件&#xff0c;可以在windows Forms应用程序中使用。使用它可以让用户选择一个文件夹&#xff0c;并返…

【编译原理复习笔记】中间语言

中间语言 中间语言的特点和作用 &#xff08;1&#xff09;独立于机器 &#xff08;2&#xff09;复杂性介于源语言和目标语言之间 中间语言可以使编译程序的结构在逻辑上更为简单明确 常用的中间语言 后缀式 图表示&#xff1a;抽象语法树&#xff0c;有向无环图 三地址代…

【软件设计师】先导

一、考试科目&#xff1a; 上午&#xff1a;计算机与软件工程知识&#xff0c;考试时间150min&#xff0c;75空单选题&#xff08;不一定一题一空&#xff09; 下午&#xff1a;软件设计&#xff0c;考试时间150分钟&#xff0c;问答题&#xff0c;6道只做5大题&#xff08;前四…

【论文阅读】Prompt Fuzzing for Fuzz Driver Generation

文章目录 摘要一、介绍二、设计2.1、总览2.2、指导程序生成2.3、错误程序净化2.3.1、执行过程净化2.3.2、模糊净化2.3.3、覆盖净化 2.4、覆盖引导的突变2.4.1、功率调度2.4.2、变异策略 2.5、约束Fuzzer融合2.5.1、论据约束推理2.5.1、模糊驱动融合 三、评估3.1、与Hopper和OSS…

QTextEdit将多个字符作为一个整体,不可单独修改

考虑一个问题&#xff0c;QTextEdit如何实现类似微信和QQ聊天输入框中的“xxx”效果&#xff0c;其内容作为一个整体&#xff0c;以突出颜色显示&#xff0c;并且不可以单独编辑修改&#xff0c;只能整体删除修改。 突出颜色显示有很多方式可以实现&#xff0c;例如 通过setT…

Rust学习心得

我分享一下一年的Rust学习经历&#xff0c;从书到代码都一网打尽。 关于新手如何学习Rust&#xff0c;我之前在Hacker News上看到了这么一篇教程&#xff1a; 这篇教程与其他教程不同的时&#xff0c;他不是一个速成教程&#xff0c;而是通过自己的学习经历&#xff0c;向需要…

记录一次Netty的WSS异常

概述 业务场景 应用通过 WSS 客户端连接三方接口。在高并发压测时&#xff0c;出现了请求服务器写入失败的异常&#xff0c;该异常是偶发&#xff0c;出现的概率不到千分之一&#xff0c;异常如下图所示。 问题概述 注意&#xff1a; 因为握手是通过 http 协议进行的。所以…

tcpdump源码分析

进入tcpdump.c&#xff08;函数入口&#xff09;之前&#xff0c;先看一些头文件netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作&#xff0c;每一个参数有对应的flag, 在tcpdump 的main 里面&#xff0c; 会根据用户的传入的参数来…

鸿蒙ArkTS声明式开发:跨平台支持列表【触摸事件】

触摸事件 当手指在组件上按下、滑动、抬起时触发。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独…

总是等不是办法,向媒体投稿你得学会用新方法

初入信息宣传领域,我怀揣着对文字的热爱与传播价值的热情,肩负起了单位活动的宣传报道重任。那时的我,满脑子都是传统的投稿思维:精心撰写每一篇稿件,然后逐一搜寻各大媒体的投稿邮箱,一封封邮件满怀期待地发出,像播撒希望的种子,渴望在广袤的媒体土壤中生根发芽。然而,理想很丰…

红蓝对抗-HW红蓝队基本知识(网络安全学习路线笔记)

第一, 什么是蓝队 蓝队&#xff0c;一般是指网络实战攻防演习中的攻击一方。 蓝队一般会采用针对目标单位的从业人员&#xff0c;以及目标系统所在网络内的软件、硬件设备同时执行多角度、全方位、对抗性的混合式模拟攻击手段&#xff1b;通过技术手段实现系统提权、控制业务、…

将点位转换为圆环极坐标绘画

将一段染色体可视化为一个圆环,根据一段基因的起始点和终止点绘画,根据基因的方向绘画箭头,可以任意确定染色体哪个位置在哪个角度上,例如染色体的1700点位在180上,默认是顺时针方向从起始点向终止点绘画。 1.将一段染色体的基因数组加上极坐标绘画属性 function compute…

pycharm连接阿里云服务器过程记录

因为不想用自己的电脑安装anaconda环境,所以去查了一下怎么用服务器跑代码,试着用pycharm连接阿里云服务器,参考了很多博客,自己简单配置了一下,记录一下目前完成的流程. 主要是:阿里云服务器的远程登录和安装anaconda,以及怎么用pycharm连接阿里云服务器上的解释器. 小白刚开始…