2023年11月8日

PostgreSQL: PostgreSQL 表空间、数据库、模式、角色实践

目录 1. 表空间(tablespace) 2. 数据库(database) 3. 模式(Schema) 4. ​​​​​​​角色(role||user) 5.表空间、数据库、模式之间的关系 1. 表空间(tablespace) 不同的数据库表空间有不同的定义。在postgres中,表空间允许在文件系统中定义数据库对象存储的位置,实质上就是指定一个目录。 1.1 应用场景 存储磁盘没有空间时,可以使用表空间把数据存在其它地方; 利用表空间对数据库进行性能优化。常用来将频繁使用的数据表或者索引放在高性能的硬盘上,而较少使用的放在普通硬盘上。 1.2 初始表空间 自带两个表空间:pg_default,pg_global pg_default 用来存储系统目录对象,用户表、用户表index、临时表、临时表index、内部临时表的默认空间。存储目录:D:\…
2023年11月7日

PostgreSQL: PostgreSQL 详细的PostgreSQL体系架构介绍

PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解。PostgreSQL的主要结构如下: 一、存储结构 PG数据存储结构分为:逻辑存储结构和物理存储存储。其中:逻辑存储结构是内部的组织和管理数据的方式;物理存储结构是操作系统中组织和管理数据的方式。 1、逻辑存储结构 所有数据库对象都有各自的oid(object identifiers),oid是一个无符号的四字节整数,相关对象的oid都存放在相关的system catalog表中,比如数据库的oid和表的oid分别存放在pg_database,pg_class表中。 在逻辑存储结构中有几个术语需要解释: 数据库集群-Database cluster 也叫数据库集簇。它是指有单个PostgreSQL服务器实例管理的数据库集…
2023年11月7日

PostgreSQL: PostgreSQL MVCC 机制解析

导语 PostgreSQL是通过MVCC(Multi-Version Concurrency Control)来保证事务的原子性和隔离性,具体MVCC机制是怎样实现的,下面举些示例来做个简单解析以加深理解。 前提 表中隐藏的系统字段 PostgreSQL的每个表中都有些系统隐藏字段,包括: oid: 对象标识符,生成的值是全局唯一的,表、索引、视图都带有oid,如果需要在用户创建的表中使用oid字段,需要显示指定“with oids”选项。 ctid: 每条记录(称为一个tuple)在表中的物理位置标识。 xmin: 创建一条记录(tuple)时,记录此值为当前事务ID。 xmax: 创建tuple时,默认为0,删除tuple时,记录此值为当前事务ID。 cmin/cmax: 标识在同一个事务中多个语句命令的序列值,从0开始,用于同一个事务中实…
2023年11月7日

PostgreSQL: PostgreSQL 原理及底层实现

pg基础语法 1,事务原理 事务(transaction): 是用户定义的一组数据库操作,要么全做要么全不做,失败即回滚。 事务是恢复和并发控制的基本单元。 保存点(savePoint) 在一个大的事务中,可以把操作过程分成几个部分,第一个部分执行成功后可以建一个保存点,若后面的部分执行失败,则回滚到此保存点,而不必回滚整个事务。 事务的实现即:RDBMS采取何种技术确保事务的ACID特性? 回退(rollback): 撤销sql执行过程。事务管理可以管理insert、update、delete语句;不能回退create、drop操作。 RDBMS(Relational Database Management System,关系数据库管理系统) 是指包括相互联系的逻辑组织和存取这些数据的一套程序 (数据库管理系统软件)。 关系数据库管理系统就…
2023年11月7日

PostgreSQL: PostgreSQL 强制终止取消结束掉正在执行的SQL语句操作任务

结束进程两种方式: SELECT pg_cancel_backend(PID) 取消后台操作,回滚未提交事物 (select); SELECT pg_terminate_backend(PID) 中断session,回滚未提交事物(select、update、delete、drop); SELECT * FROM pg_stat_activity; 根据datid=10841 SELECT pg_terminate_backend (10841); 执行以下命令来停止所有正在执行的任务: 使用 pg_cancel_backend 函数:连接到 PostgreSQL 数据库,并执行以下命令以停止所有正在执行的任务: SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = 'active'; 这将向…
2023年11月7日

PostgreSQL: PostgreSQL 的三种日志 pg_log pg_xlog pg_clog

1、日志文件种类 1)$PGDATA/log 运行日志(pg10之前为$PGDATA/pg_log) 2)$PGDATA/pg_wal 重做日志(pg10之前为$PGDATA/pg_xlog) 3)$PGDATA/pg_xact 事务提交日志(pg10之前为$PGDATA/pg_clog) 4)服务器日志,可以在启动的时候指定,比如pg_ctl start -l ./alert.log 一、PostgreSQL有3种日志: 1)pg_log(数据库运行日志)   内容可读    默认关闭的,需要设置参数启动 2)pg_xlog(WAL 日志,即重做日志)    内容一般不具有可读性        强制开启 3)pg_clog(事务提交日志,记录的是事务的元数据)  内容一般不具有可读性 强制开启pg_xlog和pg_clog一般是在$PGDATA/下面…
2023年11月7日

PostgreSQL: 深入理解 PostgreSQL 中的 MVCC(多版本并发控制)机制

一,引言 简要介绍MVCC(多版本并发控制)概念和其在数据库中的重要性。 提出写作目的,即深入理解PostgreSQL中的MVCC机制,并解释读者可以从本文中学到什么。 二,什么是MVCC(多版本并发控制) MVCC,即多版本并发控制,是一种用于处理数据库中并发操作的机制。在传统的并发控制方式中,常见的做法是通过锁定资源来确保在某一时刻只有一个事务可以修改或读取数据,以防止数据不一致或冲突。然而,传统的锁定机制可能会导致性能瓶颈和并发性下降,尤其在高并发访问的情况下。 MVCC通过引入多个数据版本来解决传统锁定机制的一些局限性。在MVCC中,每个数据库事务在读取数据时会看到一个特定的版本,这使得事务之间可以同时进行读写操作,而不会相互干扰。每个事务可以操作自己的数据版本,从而实现了更高的并发性和更好的性能。 MVCC的核心…
2023年11月7日

PostgreSQL: PG的vacuum涉及的参数有哪些? Postgresql Automatic Vacuuming

MVCC如何实现? 简单说,就是更新数据时,保留原先版本的数据,即一行数据存在多个版本。 常见的两种实现方法: 回滚段的实现方法(Oracle、 MySQL Innodb的实现方法) 在原先的数据文件中的旧版本数据不删除,生成新版本的数据(PostgreSQL 的实现方法) 通常与事务的功能集成在一起,但MVCC时事物回滚或提交之后,旧版本的数据仍然需要保留一段时间,是延迟清除的。 旧版本的数据延迟清除的原因: 就是为了提供快照读(一致性致性读)的功能 对于Read Commited隔离级别:需要保证当开始执行一个SQL之后,这个SQL是读一个不变的快照的数据,即使在这个SQL执行过程中有其它的事物提交了,这些提交的数据对于这个SQL也是看不到了,这样保证了数据的一致性。 对于Read Repeatable隔离级别: 从这个事物开始之后,看…
2023年11月2日

PostgreSQL: PostgreSQL pg_stat_statements

【运行缓慢】 执行如下命令,查询单次调用最耗时 SQL TOP 10。 select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 10; 执行如下命令,查询总最耗时 SQL TOP 10。 select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 10; 【IO缓慢】 执行如下命令,查询单次调用最耗 IO SQL TOP 10。 select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 10; 执…
2023年10月29日

PostgreSQL: PostgreSQL MySQL Oracle 中的 schema 及 PostgreSQL中的user

1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace),数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说,在第一次看到pg中的schema的概念时,可能会疑惑,schema不是表示database的吗? 注:mysql中schema和database是一个概念。create database 和create schema的效果是相同的。 Oracle 中的schema的和用户名相同,schema用于 存放对象包括但不限于表、函数、视图、索引等。 schama 在PG中概念最小,在mysql中概念最大 需要注意的是PostgreSQL中的用户(和角色)是全局对象,不是在数据库中定义的,而是在实例级别定义的。(oracle cdb的root# )schema由用户在特定数据库…