PostgreSQL for Oracle DBAs
简介
以下文章包含帮助 Oracle DBA 了解一些术语和 PostgreSQL 数据库管理的信息。本文旨在介绍 PostgreSQL,而不是教程或对如何管理 PostgreSQL 数据库的完整定义。有关完整文档,请参阅 PostgreSQL 手册。
Oracle
简要描述
- Oracle 数据库服务器由 Oracle 实例和 Oracle 数据库组成。
- Oracle 实例由 Oracle 后台进程和共享全局区 (SGA) 和程序全局区 (PGA) 内分配的内存组成。
- 重要的 Oracle 后台进程如下
- 数据库写入器进程 (DBWn)
- 日志写入器进程 (LGWR)
- 检查点进程 (CKPT)
- 系统监控进程 (SMON)
- 进程监控进程 (PMON)
- 恢复器进程 (RECO)
- 归档进程 (ARCn)
- Oracle 数据库由数据库数据文件、控制文件、重做日志文件、归档日志文件和参数文件组成。这些文件可能位于本地文件系统、NFS 文件或 SAN 设备上。在后一种情况下,Oracle 使用 ASM(自动存储管理)来寻址数据。
- 要远程访问 Oracle 数据库,存在一个单独的进程,称为 Oracle 监听器。
- 在专用服务器配置(与共享服务器配置相反)中,每个已建立的数据库会话都在服务器上执行自己的进程。
为简单起见,与 Oracle 数据库的任何比较都将始终引用管理单个数据库的单个实例,不会提及 RAC 和 Data Guard。注意:PostgreSQL 也具有热备的概念(自 8.2 版起),以及归档日志的传输(在 8.0 版中引入)。
PostgreSQL
数据库服务器进程
数据库服务器程序 postgres 是所有服务器进程。与 Oracle 中的数据库环境中不同职责的单独命名进程不同。如果你查看进程列表(ps),进程的名称将是 postgres。但是,在大多数平台上,PostgreSQL 会修改其命令标题,以便可以轻松识别各个服务器进程。你可能需要调整用于 ps 和 top 等命令的参数,以显示这些更新的标题,而不是进程名称(“postgres”)。
在进程列表中看到的进程可能是以下一些
- 主进程 - 启动其他进程,包括后台进程和会话进程。
- 写入器进程 - 协调数据库写入、日志写入和检查点的后台进程。
- 统计收集器进程 - 收集有关服务器活动信息的后台进程。
- 用户会话进程。
服务器进程使用信号量和共享内存相互通信,以确保在并发数据访问期间的数据完整性。
PostgreSQL 数据库集群
在一个服务器内,可以构建一个或多个 Oracle 实例。数据库彼此独立,通常只共享 Oracle 监听器进程。PostgreSQL 具有“数据库集群”的概念。数据库集群是存储在公共文件系统位置(“数据区域”)中的数据库集合。只要它们使用不同的数据区域和不同的通信端口,就可以拥有多个数据库集群。
进程以及文件系统组件都在数据库集群内共享。数据库集群所需的所有数据都存储在集群的数据目录中,通常称为“PGDATA”(以用于定义它的环境变量的名称命名)。PGDATA 目录包含多个子目录和配置文件。
以下是一些集群配置文件
- postgresql.conf - 参数或主服务器配置文件。
- pg_hba.conf - 客户端身份验证配置文件。
- pg_ident.conf - 从操作系统帐户到 PostgreSQL 帐户文件的映射。
集群子目录
- base - 包含每个数据库子目录的子目录
- global - 包含集群范围表的子目录
- pg_auth - 授权文件,包含用户和角色定义。
- pg_control - 控制文件。
- pg_database - 集群内数据库的信息。
- pg_clog - 包含事务提交状态数据的子目录
- pg_multixact - 包含多事务状态数据的子目录(用于共享行锁)
- pg_subtrans - 包含子事务状态数据的子目录
- pg_tblspc - 包含指向表空间的符号链接的子目录
- pg_twophase - 包含已准备事务状态文件的子目录
- pg_xlog - 包含 WAL(预写日志)文件的子目录
默认情况下,对于集群中的每个数据库,PGDATA/base 内都有一个子目录,以数据库在 pg_database 中的 OID(对象标识符)命名。此子目录是数据库文件默认位置;特别是,它的系统目录存储在那里。每个表和索引都存储在单独的文件中,以表或索引的 filenode 编号命名,该编号可以在 pg_class.relfilenode 中找到。
Oracle DBA 通常等同于一个数据库的几个组件在 PostgreSQL 集群内的数据库之间共享,包括参数文件、控制文件、重做日志、表空间、帐户、角色和后台进程。
表空间和对象数据文件
PostgreSQL 在 8.0 版中引入了表空间管理。PostgreSQL 内表空间的物理表示非常简单:它是在文件系统上的目录,映射是通过符号链接完成的。
创建数据库时,默认表空间是默认存储所有数据库对象的位置。在 Oracle 中,这类似于 System、User 和 Temporary 表空间。如果在创建期间未定义默认表空间,则数据文件将进入 PGDATA/base 的子目录。最好将系统目录信息和应用程序数据结构的位置驻留在单独管理的表空间中。这是可用的。
与 Oracle 一样,PostgreSQL 表的定义决定了对象驻留在哪个表空间。但是,除了操作系统对设备施加的物理边界外,不存在大小限制。
每个表的单独数据都存储在表空间(或目录)中的文件中。如果表的数据超过 1 GB,数据库软件会将表拆分为多个数据文件。
自 8.1 版起,可以将表分区到单独的(或相同的)表空间。这是基于 PostgreSQL 的表继承功能,使用查询规划器的一种功能,称为约束排除。
不存在将特定列(如 LOB)分离到单独定义的表空间的能力。但是,除了表示表的数据文件(以 1 GB 的倍数)外,还为表中 TOAST 的列分离了数据文件。称为 TOAST(超大属性存储技术)的 PostgreSQL 存储系统会自动将大于单个数据库页的值存储到每个表的辅助存储区。TOAST 技术允许数据列的大小高达 1 GB。
与 Oracle 一样,索引的定义决定了它驻留在哪个表空间。因此,可以获得将表的數據磁盘与其索引所在的磁盘分离的性能优势,从而减轻数据操作期间的 I/O 争用。
在 Oracle 中,存在临时表空间,用于存储排序信息和用于 distinct 语句等评估所需的临时评估空间。PostgreSQL 没有这种临时表空间的概念;但是,它确实需要存储才能执行这些活动。在数据库的“默认”表空间(在创建数据库时定义)中,有一个名为 pgsql_tmp 的目录。此目录保存评估所需的临时存储。在目录中创建的文件只在 SQL 语句执行时才存在。它们增长非常快,而且最有可能不是为空间效率而设计,而是为速度而设计。请注意,磁盘碎片可能会由此产生,并且磁盘上需要有足够的空间来支持用户查询。随着 8.3 版的发布,可以使用参数“temp_tablespaces”定义临时表空间。
REDO 和归档
PostgreSQL 使用“预写日志”(WAL)作为其事务日志记录方法。WAL 的核心概念是,对数据文件(表和索引所在的位置)的更改只能在日志记录这些更改之后才能写入,也就是说,只有在描述更改的日志记录已刷新到永久存储器中时才能写入。如果我们遵循此过程,则不必在每次事务提交时将数据页刷新到磁盘,因为我们知道在发生崩溃的情况下,我们将能够使用日志恢复数据库:任何尚未应用于数据页的更改都可以从日志记录中重做。(这是前滚恢复,也称为 REDO。)
PostgreSQL 在集群数据目录的“pg_xlog”子目录中维护其(WAL)。
WAL 在 PostgreSQL 7.1 版中引入。为了在发生故障时维护数据库一致性,以前版本强制在每次事务提交之前将所有数据修改写入磁盘。使用 WAL,只需将一个日志文件刷新到磁盘,从而大大提高性能,同时添加了诸如时间点恢复和事务归档之类的功能。
理论上,PostgreSQL 系统会生成无限长的 WAL 记录序列。系统在物理上将此序列划分为 WAL 段文件,这些文件通常为 16 MB。系统通常会创建一些段文件,然后通过将不再需要的段文件重命名为更高的段编号来“回收”它们。如果你列出 pg_xlog 目录,就会发现总是有几个文件随着时间的推移不断更改名称。
要添加 WAL 文件的归档,在参数文件中存在一个参数,其中添加一个命令来执行归档过程。完成此操作后,甚至可以使用“pg_start_backup”和“pg_stop_backup”命令执行操作系统“在线”备份,这些命令会暂停和恢复对数据文件的写入,同时继续将事务写入 WAL 文件并执行归档过程。
在 8.0 版中添加了 WAL 归档和在线备份命令的包含。
回滚或撤销
磁盘空间的动态分配如何用于表中记录的存储和处理非常有趣。表示表的文件会随着表的增长而增长。它也会随着对表的执行的事务而增长。在 Oracle 中,存在回滚或撤销段的概念,用于保存回滚事务的信息。在 PostgreSQL 中,数据存储在表示表的文件中。因此,当对表执行删除和更新操作时,表示对象的将包含以前的数据。此空间将被重复使用,但要强制恢复已使用空间,必须执行称为“vacuum”的维护过程。
服务器日志文件
Oracle 有警报日志文件。PostgreSQL 有服务器日志文件。一个配置选项甚至可以让我们在 Oracle 的 listener.log 中看到的连接信息出现在 PostgreSQL 的服务器日志中。服务器配置文件 (postgresql.conf) 中的参数决定了日志文件的级别、位置和名称。
为了帮助维护服务器日志文件(它会快速增长),存在用于轮换服务器日志文件的功能。可以设置参数,根据文件的大小或年龄来确定何时轮换文件。然后,旧文件的管理留给管理员。
应用程序
initdb 命令创建新的 PostgreSQL 数据库集群。
psql 命令启动 PostgreSQL 或 SQL 命令提示符的基于终端的前端。查询和命令可以交互式地执行或通过文件执行。psql 命令提示符具有以下几个吸引人的功能。
- 对 psql 命令和 SQL 语法都有详尽的在线帮助。
- 命令历史记录和行编辑。
- SQL 命令可以存在于多行,并且仅在分号(;)后执行。
- 多条用分号分隔的 SQL 命令可以输入到单行。
- 灵活的输出格式。
- 多个优于 Oracle DESCRIBE 的对象描述命令。
根据环境的安全配置,可以通过 TCP/IP 在本地或远程建立连接。由于这些独立的安全连接,可能需要或不需要密码才能连接。
pg_ctl 命令是一个用于显示状态、启动、停止或重新启动 PostgreSQL 数据库服务器 (postgres) 的实用程序。虽然可以通过 postgres 可执行文件启动服务器,但 pg_ctl 封装了诸如重定向日志输出、从终端和进程组正确分离以及提供用于受控关闭的选项等任务。
pg_dump 和 pg_restore 命令是用于导出和导入 PostgreSQL 数据库内容的实用程序。转储可以以脚本或存档文件格式输出。脚本文件格式创建包含重建数据库所需的 SQL 命令的纯文本文件,使其处于生成时所处的状态。存档文件格式创建要与 pg_restore 一起使用的文件以重建数据库。
存档文件格式设计为跨架构可移植。从历史上看,对 PostgreSQL 软件的任何类型的升级都需要在升级之前对数据库进行 pg_dump。然后,升级后进行 pg_restore。现在,对于次要版本(即第三个小数位 - 8.2.x)升级可以在原位进行。但是,在第一或第二个小数位上更改版本仍然需要 pg_dump/pg_restore。
存在一个名为 pgAdmin III 的图形工具,它是单独开发的。它与 Linux 和 Windows 版本的 PostgreSQL 一起分发。可以远程连接到数据库服务器以执行管理任务。由于该工具旨在管理数据库环境的所有方面,因此必须通过超级用户帐户连接到数据库。
pgAdmin III 工具具有以下标准吸引人的功能。
- 直观的布局
- 用于创建和修改数据库对象的树形结构
- 在修改或创建对象时查看和保存 SQL