【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 源码如下: <!--引入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,不然可能直接在正文中展示html标签,为不是解析成具体的样式…...
如何使用PyTorch训练LLM
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 像LangChain这样的库促进了上述端到端AI应用程序的实现。我们的教程介绍 LangChain for Data Engineering & Data Applications 概述了您可以使用 Langchain 做什么,包括 LangChain 解决的问题…...
uniapp 手机 真机测试 云打包 要是没申请 可以使用云打包 然后采用 测试权限即可
uniapp 手机 真机测试 打开手机 找到手机的 版本号 点击 知道提示 (启动开发者模式) 然后 在进行usb的连接打开 运行uniapp 到手机基台 手机确认 即可 四, 云打包 要是没申请 可以使用云打包 然后采用 测试权限即可...
RTSP流媒体服务器EasyNVR视频平台以服务方式启动异常却无报错,该如何解决?
EasyNVR是基于RTSP/Onvif协议的安防视频云服务平台,可实现设备接入、实时直播、录像、检索与回放、云存储、视频分发、级联等视频能力服务,可覆盖全终端平台(电脑、手机、平板等终端),在智慧工厂、智慧工地、智慧社区、…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
git: early EOF
macOS报错: 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…...
