从 $PGDATA 到文件组:深入解析 PostgreSQL 与 SQL Server 的存储策略

在数据库领域,数据存储和管理的效率与可靠性是决定系统性能、可扩展性和易于管理的关键因素。PostgreSQL 和  SQL Server 在数据存储方面采取了略有不同的方式。
PostgreSQL 中一个数据库管理员经常遇到的关键概念是 $PGDATA 文件夹。在这里,我们将探讨 $PGDATA 文件夹是什么,它的重要性,以及 PostgreSQL 的数据存储架构与  SQL Server 的比较。

什么是 $PGDATA?

$PGDATA 在 PostgreSQL 中指的是包含数据库集群所有配置和数据文件的目录。这是 PostgreSQL 数据存储架构的核心。简单来说,它是 PostgreSQL 存储所有文件的目录,这些文件包括实际数据、配置文件、事务日志以及其他重要信息,确保数据库集群能够正常运行。

$PGDATA 文件夹的关键组成部分

在 $PGDATA 文件夹中,你会发现许多子目录和文件,它们存储数据库的不同方面。

其中一些关键组成部分包括:

  • base 目录:存储集群中每个数据库的实际数据。每个数据库在 base 文件夹中都有一个单独的子目录。

  • PG_VERSION:这是一个小文件,用于存储该集群使用的 PostgreSQL 版本信息,这在升级或迁移时确保兼容性。

  • pg_wal(预写日志):该文件夹包含预写日志(WAL),对于事务的持久性和恢复至关重要。WAL 文件记录了对数据所做的每一次更改,确保在崩溃的情况下数据库可以恢复到一致的状态。

  • pg_hba.conf:负责基于主机的身份验证配置文件,在此文件中,你可以定义允许哪些用户从哪些位置(主机)连接到哪些数据库。

  • postgresql.conf:主要的配置文件,包含 PostgreSQL 实例的所有操作设置,包括内存设置、日志参数和其他与性能相关的设置。

$PGDATA 的重要性

$PGDATA 文件夹至关重要,因为它本质上是 PostgreSQL 的支柱。如果该目录损坏或丢失,集群中的所有数据都会无法恢复。因此,定期保护和备份 $PGDATA 目录是每个数据库管理员的一项基本任务。

PostgreSQL 使用基于文件的存储系统,默认情况下将数据写入 8KB 的页面。页面大小可以在编译 C 源代码时更改。这些页面随后被分组为段并存储在 $PGDATA 目录中。

配置 $PGDATA

在 PostgreSQL 初始化(通常使用 initdb)期间,你可以指定 $PGDATA 目录的位置。你可以通过向 initdb 命令传递 -D 选项或设置 $PGDATA 环境变量来设置位置。例如:

initdb -D /var/lib/postgresql/data

初始化后,PostgreSQL 期望环境变量 $PGDATA 始终指向此位置,无论服务器是启动还是停止。

SQL Server 中的数据存储

虽然 PostgreSQL 依赖于 $PGDATA 文件夹进行核心操作,SQL Server 在数据存储和管理方面采取了略有不同的方式。Microsoft SQL Server 将其数据组织为数据库,每个数据库都有自己的一组数据文件、事务日志文件和备份选项。

在  SQL Server 中,数据库存储在不同类型的文件中:

  • 主数据文件(.mdf):这是存放所有数据库对象(如表、索引、存储过程)的主要数据文件。每个数据库至少有一个 MDF 文件,mdf文件可以理解为数据库的共享表空间,默认所有表都存储在这个mdf文件里。
  • 次要数据文件(.ndf):这些文件是可选的,用于将数据分布到多个磁盘上,从而提高大型系统的性能和可扩展性,ndf文件可以理解为独立表空间,当你把一个文件组附加在ndf文件上,然后指定数据表建立在这个文件组上,相当于把表建立在独立表空间上。
  • 事务日志文件(.ldf):类似于 PostgreSQL 的 WAL,LDF 文件存储数据库中每个事务的日志记录。这对于确保在发生故障时可以回滚事务至关重要,也用于恢复过程。

与 PostgreSQL 不同,PostgreSQL将数据存储在 $PGDATA 文件夹中的子目录下,SQL Server 将数据库存储在这些 .mdf、.ndf 和 .ldf 文件中,通常位于管理员在安装或创建数据库时设置的特定目录或磁盘上。

PostgreSQL 与 SQL Server 存储的关键区别

现在我们已经了解了 PostgreSQL 和 SQL Server 如何处理数据存储,以下是它们之间的关键差异:

  • 存储位置

PostgreSQL 将所有数据存储在 $PGDATA 目录中,该目录包含每个数据库的子目录以及 WAL 日志和配置文件。SQL Server 使用单独的文件(.mdf、.ndf、.ldf)来存储每个数据库。管理员可以将这些文件放置在任何磁盘或目录中。

  • 事务日志

PostgreSQL 使用 pg_wal 目录来存储预写日志。SQL Server 使用 .ldf 文件进行事务日志记录,与 PostgreSQL 的 WAL 类似,但每个数据库都有自己的 .ldf 文件。

  • 文件组抽象

SQL Server 提供文件组,这是一层抽象,允许管理员将数据分布在多个存储设备上以提高性能和管理。PostgreSQL 没有类似的抽象层,文件管理完全依赖于操作系统,管理员只能将不同的表空间放置在不同的磁盘上。

  • 配置文件

PostgreSQL 的配置文件紧密集成在 $PGDATA 目录中(如 postgresql.conf、pg_hba.conf),而 SQL Server 的配置文件通常与数据库文件分开存储。

  • 临时数据存储

SQL Server 使用一个专门的系统数据库 TempDB 进行临时数据存储,而 PostgreSQL 则在现有的$PGDATA 目录中使用临时表空间,与SQL Server类似,也是整个实例(集群)共享临时表空间。

总结

虽然 PostgreSQL 和 Microsoft SQL Server 都提供了强大的数据存储机制,但它们的方法却有着根本的不同。PostgreSQL 的 $PGDATA 文件夹是与数据库集群相关的所有内容的中央枢纽,

而 SQL Server 则依赖于更为精细化的 .mdf、.ndf 和 .ldf 文件系统来进行数据存储。每个系统都有其自身的优势,最佳选择通常取决于具体的使用场景、性能需求和系统架构偏好。

理解每个系统存储架构的细微差别对于数据库管理员来说至关重要,因为这将影响到备份策略、性能调优和灾难恢复计划的决策。

参考文章
https://www.javelin-tech.com/blog/2020/06/sizing-the-microsoft-sql-mdf-and-ldf/
https://docs.oracle.com/cd/E19787-01/820-3361/ciadcigh/index.html
https://docs.microfocus.com/UCMDB/11.0/ucmdb-docs/docs/eng/doc_lib/Content/database/PostgresConfig_c_logs.htm
https://www.postgresql.org/docs/current/storage-file-layout.html
https://www.quora.com/What-are-MDF-and-NDF-files-in-an-SQL-server

本文版权归作者所有,未经作者同意不得转载。

从 $PGDATA 到文件组:深入解析 PostgreSQL 与 SQL Server 的存储策略的更多相关文章

  1. SQL SERVER大话存储结构(6)_数据库数据文件

            数据库文件有两大类:数据文件跟日志文件,每一个数据库至少各有一个数据文件或者日志文件,数据文件用来存储数据,日志文件用来存储数据库的事务修改情况,可用于恢复数据库使用.     这里分 ...

  2. SQL SERVER大话存储结构(5)_SQL SERVER 事务日志解析

          本系列上一篇博文链接:SQL SERVER大话存储结构(4)_复合索引与包含索引    1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录 ...

  3. [转] C#实现在Sql Server中存储和读取Word文件 (Not Correct Modified)

    出处 C#实现在Sql Server中存储和读取Word文件 要实现在Sql Server中实现将文件读写Word文件,需要在要存取的表中添加Image类型的列,示例表结构为: CREATE TABL ...

  4. AlwaysOn可用性组功能测试(二)--SQL Server群集故障转移对AlwaysOn可用性组的影响

    三. SQL Server群集故障转移对AlwaysOn可用性组的影响 1. 主副本在SQL Server群集CLUSTEST03/CLUSTEST03上 1.1将节点转移Server02.以下是故障 ...

  5. PostgreSQL、SQL Server数据库中的数据类型的映射关系

    PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关 ...

  6. 如何将SQL Server 2000备份的数据库文件还原(升级)为SQL Server 2005或更高版本的数据库?

    其实很简单,有两种方法. 方法一:将SQL Sever 2000数据库备份的数据库文件名后面加上“.bak”,然后直接在SQL Sever 2005或者高版本软件里面直接还原即可: 方法二:在SQL ...

  7. 将CSV文件中的数据导入到SQL Server 数据库中

    导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...

  8. 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5

    有网友说打开vs2010安装光盘,搜索 SSCERuntime_x86-chs.msi,重新安装之.于是果断搜索,发现SSCERuntime_x86-chs.msi,另外发现一个SSCEVSTools ...

  9. Design5:Sql server 文件组和文件

    1,文件组和文件的作用 Sql Server的数据存储在文件中,文件是实际存储数据的物理实体,文件组是逻辑对象,Sql server通过文件组来管理文件. 一个DataBase有一个或多个FileGr ...

  10. SQL Server 文件和文件组

    文件和文件组简介 在SQL Server中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL Server通过管理逻辑上的文件组的方式来管理文件. ...

随机推荐

  1. 3. 用过Konva吗,用过他的api吗

    基础:使用konva,首先需要创建舞台也就是stage,然后创建一个Layer图层,将图层放到舞台上,将图形等内容放到图层上 ; 第一步:创建一个Stage舞台  , 就是创建一个 stage 实例 ...

  2. 1. 说一下 vue 的父子传参 ?

    主要实现的方式: 1. 第一种方法 ,在子组件标签使用自定义属性="参数"和自定义事件,在子组件内使用 props 接受自定义属性 :如果子组件要修改参数,不能直接修改,因为 vu ...

  3. mysql进阶-存储引擎篇

    本篇是将基础篇的知识进行深化了解底层机制的同时讲解企业中涉及到的高层级知识. 存储引擎 1.MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全 ...

  4. 更改后端的数据格式适配el-tree组织树

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. thinkphp5 模型批量增加数据小记

    楼主最近在学习thinkphp5,真的没应广大使用教程所说:你最好就是没学过thinkphp3.2.要不然苦恼重重. 因为想将一些功能实现一次,故自己写了一个文件上传类. 可以实现单文件,多文件上传( ...

  6. 网页转换为PDF的方法 Python

    前言 近期有些文档是在网站上的,量非常大.加之对于纸质书的喜爱,想把他们整合到一个PDF文档中,然后交由拼多多的老熟人打印店给打一下. 但是这个网站网页转PDF有很多在线网站可以用,不过只能转一个页面 ...

  7. Web渗透10_CSRF SSRF

    1 CSRF漏洞 CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CS ...

  8. freeswitch的话单处理

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 如果对cdr话单要求不高,可以直接使用fs的原始话单文件,使用脚本做一些简单的统计. 环境 CentOS 7.9 freeswitc ...

  9. 轻量级网络-RepVGG 论文解读

    背景知识 VGG 和 ResNet 回顾 MAC 计算 卷积运算与矩阵乘积 点积 ACNet 理解 ACBlock 的 Pytorch 代码实现 摘要 RepVGG 模型定义 RepVGG Block ...

  10. 远程连接服务器时出现“这可能是由于CredSSP加密数据库修正”的错误提示的解决办法

    当我们远程连接服务器时,有时候会出现以下提示,从而导致我们无法成功连接服务器,如下所述: 原因: 远程桌面使用的是"凭据安全支持提供程序协议 (CredSSP) ",这个协议在未修 ...