当前位置: 首页 > news >正文

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

postgresql 基础架构

专栏内容

  • postgresql内核源码分析
  • 手写数据库toadb
  • 并发编程

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

系列文章

  • 入门准备
  • postgrersql基础架构
  • 快速使用
  • 初始化集群
  • 数据库服务管理
  • psql客户端使用

前言

postgresql 数据库是一款通用的关系型数据,在开源数据库中能与商业数据媲美,在业界也越来越流行。

因为是开源数据库,不仅公开源码,还有很多使用案例,好用的插件,所以它的慢慢变成了数据库的先驱和标准,通过postgresql可以很好从使用到原理,彻底搞懂;

如果是学习编程,也可以学到丰富的编程知识,数据结构,编程技巧,它里面还有很多精妙的架构设计,分层思想,可以灵活定制的思想。

本专栏主要介绍postgresql 入门使用,数据库维护管理,通过这些使用来了解数据库原理,慢慢了解postgresql是什么样的数据库,能做那些事情,以及如何做好服务,最关键的是这些知识都是面试的必备项。

概述

本文主要分享PostgreSQL的基础的架构,方便我们对对PostgreSQL的部件之间如何相互作用的理解将会使本节更易理解,在我们使用的时候,不至于与其它类型的数据库产生混淆;

这里我们会介绍两种视角下的架构,

  • 一是运行架构,当postgresql运行起来时,它是如何提供服务的;
  • 二是逻辑架构,用户创建的各数据库对象之间的关系是怎么样,如何进行组织;

运行架构

原理介绍

在postgresql数据库服务是一种C/S模式,运行之后,之前博客已经介绍过,后台会运行一个主进程,还有几个子进程,它们共同提供服务;

主进程提供网络监听,当客户端有连接到来时,主进程就会创建一个名称为postgres子进程,也叫做后端服务进程,它专门为这个客户端连接提供服务,此时客户端与后端服务进程之间直接通信;
也就是说,服务主进程会为每个客户端连接都创建一个后端服务进程;

客户端可以在不同的机器上,通过tcp/ip协议与服务端进行通讯;
当然客户端是多种多样的,可以是一个面向文本的工具, 也可以是一个图形界面的应用,或者是一个通过访问数据库来显示网页的网页服务器,或者是一个特制的数据库管理工具;

进程介绍

接着上一篇启动的数据库服务继续介绍,我们用psql连接了数据库之后,看看后台进程的变化:

[senllang@hatch bin]$ ps -ef|grep postgres
senllang  149106       1  0 Sep03 ?        00:00:00 /opt/postgres/bin/postgres -D testdemo1
senllang  149107  149106  0 Sep03 ?        00:00:00 postgres: logger
senllang  149108  149106  0 Sep03 ?        00:00:00 postgres: checkpointer
senllang  149109  149106  0 Sep03 ?        00:00:00 postgres: background writer
senllang  149111  149106  0 Sep03 ?        00:00:00 postgres: walwriter
senllang  149112  149106  0 Sep03 ?        00:00:00 postgres: autovacuum launcher
senllang  149113  149106  0 Sep03 ?        00:00:00 postgres: logical replication launcher
senllang  175300  175236  0 08:38 pts/8    00:00:00 ./psql -d postgres
senllang  175301  149106  0 08:38 ?        00:00:00 postgres: senllang postgres [local] idle

较刚启动时,多了两个进程,一个是 psql客户端进程,一个是服务端的子进程postgres,PID为 175301, 进程名称上会显示状态 idle, 当执行SQL时也会显示到这里。
如果有多个客户端连接时,这里就会有多个postgres后端服务进程;

逻辑架构

在使用数据库之前,我们有必要了解一下数据库中的各数据库对象之间的组织关系;

我们已经听说过的数据库里会有:database 数据库, table 表, tablespace 表空间,index 索引, 表字段,数据类型,存储过程,数据库用户,对角访问权限等等,一大堆的概念;

一开始,是不是可以创建表呢,是不可以的,它是有先后顺序的;

它们之间存在两种逻辑上的关联关系:

  • 存储空间关系
  • 命名空间关系

存储空间关系

存储空间关系是什么呢,简单理解就是,目录层次关系,大的是父目录,小的是子目录,先有前者,才可以有后者的存储位置;这是从磁盘存储的角度来看,各数据库对象之间的关系。

它们的前后顺序关系,或者是大小包含关系为

  • 数据库集群目录 这是最大的,这个数据库服务对应的数据都存放在这个目录下面;
  • tablespace 表空间,虽然叫做表空间,但是它目的是指定一个存储区域,刚初始化的集群,会有一个默认表空间,就在集群目录下,所有不指定表空间的数据库对象,都在默认表空间下;
  • database 数据库,其实每个数据为也对应了一个目录,那么在这个库下的所有内容都存放在此目录下面; 数据库 这个词有多个理解,大的来讲,数据库服务有时也简称数据库,小的来讲,只是database这个数据库对象,这里我们指数据库对象中的database;

表空间这一层级,主要是为了方便扩展存储空间;
因为目录没有办法跨磁盘空间,当集群目录对应的磁盘空间不足时,要么更换更大磁盘,将数据拷过去,这样旧的磁盘又会浪费,而且磁盘空间总不可能无限大,所以要扩展空间的话,可以再建一个表空间,表空间指定存储的位置在新在磁盘空间即可;

我们创建的表,索引,视图,存储过程,都在database这一级下存储;
数据库登陆的用户,角色数据,是最大的数据库集群目录下存储,它是公共数据,只要grant了权限,所有database都可以使用;
对于数据类型,这些大多是系统默认的,还有一部分是用户自定义的,也属于公共数据,存储在集群目录一级;

命名空间关系

命名空间,有点类似于目录关系,但它是逻辑上的,并不像目录是物理存在的;逻辑命名空间的目的,主要是为了方便管理和组织这些数据库对象,在内部可以方便查找,对于用户来讲也可以进行分组管理,精细化的权限控制。

主要分为以下命名空间层次:

  • tablespace 这是最大的一层,这与存储层次相同,用户不需要关心表空间,因为访问存在的数据库对象,它的表空间是确定的;如果需要创建时,需要指定,当然必须有对应表空间的使用权限才可以创建对象;
  • database 处于第二层,也是登录时必须指定的空间层次,所有在用户登录后,就不需要指定;
  • schema 处于第三层,一个database中,可以有多个schema,默认的schema名称为public,访问数据库对象时以 schema名称.数据库对象 的方式引用;

我们举例来说明,先创建一个目录,用来新建表空间

[senllang@hatch bin]$ mkdir tablespace_test1

新建表空间 tblspc_test1, 指定它的存储路径在刚才新建的目录下

postgres=# create tablespace tblspc_test1 location '/opt/postgres/bin/tablespace_test1';
CREATE TABLESPACE

新建一个schema test1

postgres=# create schema test1;
CREATE SCHEMA

设置当前的查找路径, 默认为public,现在设置为public和test1, 这样两个schema下的内容都可以看到

postgres=# set search_path TO 'public' ,'test1';
SET
postgres=# \dList of relationsSchema |   Name    | Type  |  Owner
--------+-----------+-------+----------public | tbl_user  | table | senllangtest1  | tbl_test1 | table | senllang
(2 rows)

可以看到 tbl_user 所属的schema为 public, 而test1所属的schema为 test1;

当我们有多个用户,多个应用数据时,它们又需要交互,在后面我们讲到用户和权限时,就可以看到它们真正的用途了。

总结

接触任何事务,都从第一眼看到了解开始,postgresql数据库的了解也是一样,我们可以看到它的服务启动后的进程组,了解它的进程关联;

数据库的数据存储组织的空间关系,有助于我们认识它内部的运行机制,在我们使用SQL进行数据操作时,有会用到命名空间的关系。

本文将从看到的开始,为后续继续学习做好基础,有兴趣的同学关注本专栏;

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

相关文章:

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

postgresql 基础架构 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...

是的,决定放弃算法去机器学习了

可是梦想啊!~她永存心间!!! 我啊~本是执着于这些算法的怪咖,梦想是icpc,ccpc~ 可是啊~ 在以后的科研和工作中,这些算法很多都是用不到的,学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)

Python03(循环语句) 文章目录 Python03(循环语句)一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求: 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案

安科瑞 华楠 1 背景概述 5G发展,基站先行。5G基站的选址建设,是保证5G信号覆盖的基础,因此5G基站建设是5G产业布局的一部分,也是5G成熟的基础。 2G、3G、4G均是低频段信号传输,宏基站几乎能应付所有的信号覆盖。但由…...

操作系统-线程复用

操作系统执行线程复用的过程涉及到线程调度和管理。线程复用是指操作系统能够有效地重用现有的线程来执行新的任务,而不必每次都创建新线程。这有助于减少线程创建和销毁的开销,提高系统性能。下面是操作系统如何执行线程复用的关键步骤: 线程…...

通达信自定义副图行业指标K线指标 HYZS_QD

行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…...

MDK-Keil AC6 Compiler屏蔽特定警告

最近在使用STM32CubeMX生成MDK工程是,使用了 AC6 版本的编译器进行编译代码,然后发现了一些警告,但是在 AC5 版本下编译又正常。于是研究了下怎么屏蔽特定的警告,这里记录一下。 1. Keil AC6屏蔽特定警告 遇到的警告如下&#x…...

计算机网络的故事——了解Web及网络基础

了解Web及网络基础 文章目录 了解Web及网络基础一、使用 HTTP 协议访问 Web二、HTTP 的诞生三、网络基础 TCP/IP四、与 HTTP 关系密切的协议 : IP、TCP 和 DNS 一、使用 HTTP 协议访问 Web 根据Web浏览器指定的URL,从对应的服务器中获取文件资源,从而显…...

[系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

自动驾驶——估计预瞄轨迹YawRate

1.Introduction 在ADAS控制系统中,通常根据预瞄距离x去估计横向距离y,有如下关系: y a0 a1 x a2 * x^2 a3 * x^3 ,那么现在有个需求,希望根据上述x和y的关系,去估计规划预瞄轨迹yawRate 2.How to es…...

PMP证书考下来要多少费用?

PMP考试共有三项费用:分为考前费用、考后费用和续证费用。 第一项是考前费用: 1、培训费用,在英文报名时需要填写培训公司名称和35学时的培训证明。一般的培训公司收费不一,有些公司大概是三千元左右,而有些公司可能…...

C动态分配

动态分布与静态发布: 静态分配 1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区,一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…...

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)

了解程序环境和预处理 前言:一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…...

Docker部署EMQX

1、简介 EMQ X (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。 Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。 MQTT 是轻量的 (Lightweight)、发布订阅模式 (Pu…...

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon

Spring Cloud(Finchley版本)系列教程(二) 客户端负载均衡Ribbon 目前主流的负载均衡方案有两种,一种是集中式均衡负载,在消费者与服务提供者之间使用独立的代理方式进行负载,比如F5、Nginx等。另一种则是客户端自己做负载均衡,根据自己的请求做负载,Ribbon就属于客户端自…...

好玩的js特效

记录一些好玩的js特效 1、鱼跳跃特效 引入jquery:https://code.jquery.com/jquery-3.7.1.min.js 源码如下&#xff1a; <!--引入jquery--> <script src"https://code.jquery.com/jquery-3.7.1.min.js"></script> <!--引入跳跃源码--> <s…...

java实现带有html格式和附件的符合RFC822规范的eml格式的信件原文组装

1. 传递html格式的eml信件正文 html传递就是解析成带有< html>标签的字符串在正文中传递即可 From:综合运行平台 to:111qq.com // 重点是格式设置成text/html 编码的话需要设置成UTF-8&#xff0c;不然可能直接在正文中展示html标签&#xff0c;为不是解析成具体的样式…...

如何使用PyTorch训练LLM

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 像LangChain这样的库促进了上述端到端AI应用程序的实现。我们的教程介绍 LangChain for Data Engineering & Data Applications 概述了您可以使用 Langchain 做什么&#xff0c;包括 LangChain 解决的问题&#xf…...

uniapp 手机 真机测试 ​ 云打包 要是没申请 可以使用云打包 然后采用 测试权限即可​

uniapp 手机 真机测试 打开手机 找到手机的 版本号 点击 知道提示 &#xff08;启动开发者模式&#xff09; 然后 在进行usb的连接打开 运行uniapp 到手机基台 手机确认 即可 四&#xff0c; 云打包 要是没申请 可以使用云打包 然后采用 测试权限即可...

RTSP流媒体服务器EasyNVR视频平台以服务方式启动异常却无报错,该如何解决?

EasyNVR是基于RTSP/Onvif协议的安防视频云服务平台&#xff0c;可实现设备接入、实时直播、录像、检索与回放、云存储、视频分发、级联等视频能力服务&#xff0c;可覆盖全终端平台&#xff08;电脑、手机、平板等终端&#xff09;&#xff0c;在智慧工厂、智慧工地、智慧社区、…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...