返回顶部

PostgreSQL 中的“postgres”数据库是做什么的?系统表、全局配置都存在哪里?

在使用 PostgreSQL 的过程中,会注意到数据库中存在 postgres 默认数据库,也有一些“奇怪”的表,比如、pg_* 开头的系统表,它们的作用是什么?全局配置、元数据到底存储在哪?

一、postgres 数据库是做什么的?

postgres 数据库是 PostgreSQL 安装后默认创建的一个数据库,它的名字来源于 PostgreSQL 的历史(PostgreSQL 原本叫 Postgres)。

在安装 PostgreSQL 后,系统默认会创建三个数据库:

  • postgres: 用作默认数据库,常用于测试连接或基本操作。

  • template0: 系统模板数据库,不能修改,通常用于创建新数据库时的只读模板。

  • template1: 系统模板数据库,用户创建新数据库时默认复制此模板。

其中postgres数据库可以作为一个入口,供管理员连接到数据库集群以执行管理任务,例如创建其他数据库、用户或角色。

二、PostgreSQL 的系统表存储了什么?

PostgreSQL 使用一组内置的“系统表”来管理数据库自身的元数据。这些表都以 pg_ 开头,位于 pg_catalog 模式(schema)下,他不属于任何一个数据库,可以通过如下命令查看

SELECT schemaname, tablename
FROM pg_tables
WHERE tableowner = 'postgres' AND tablespace = 'pg_global';

下面是一些常见系统表的作用:

pg_database	存储所有数据库的信息
pg_user / pg_roles	存储用户和角色的定义
pg_tables	所有用户表的列表(视图)
pg_class	所有表、索引、序列等对象的元信息
pg_attribute	存储每个表的字段信息
pg_proc	存储函数(procedure/function)的定义
pg_settings	当前数据库运行的参数配置(即 postgresql.conf 内容)
pg_stat_activity	当前连接和活动会话的信息

三、全局配置存储在哪?

PostgreSQL 的参数配置大致分三类:

静态配置文件(无法通过 SQL 修改)

  • postgresql.conf:大多数运行参数,例如内存、日志等级等

  • pg_hba.conf:连接权限控制

  • pg_ident.conf:用户映射

动态运行参数(可以用 SQL 修改)

可以通过 SQL 语句 SHOW 查看、SET 修改

全部参数都可以通过 pg_settings 表来查看:

SELECT name, setting, unit, vartype, context, source FROM pg_settings;

修改参数方式(会话级):

SET work_mem = '64MB';

修改全局参数(永久生效):

ALTER SYSTEM SET work_mem = '64MB';
SELECT pg_reload_conf(); -- 使其生效

修改后会写入 $PGDATA/postgresql.auto.conf 文件。

四、如何查看这些系统表?

通过 SQL 查询系统表:

-- 查看所有数据库
SELECT * FROM pg_database;

-- 查看当前数据库中的表
SELECT * FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema');

-- 查看所有配置参数
SELECT * FROM pg_settings;

-- 当前连接会话信息
SELECT * FROM pg_stat_activity;

使用 psql 命令行工具中的元命令:

\l      -- 列出所有数据库
\d      -- 列出当前数据库中的表
\du     -- 列出所有用户
\conninfo  -- 查看当前连接信息

五、系统表是否可以修改?

一般来说,PostgreSQL 的系统表不建议直接修改,因为它们承载了数据库的结构定义,直接 UPDATE 或 DELETE 系统表可能会导致数据库崩溃或无法启动,但可以读取、查询这些表,深入理解数据库的运行机制。

注意:

在 PostgreSQL 中,可以在postgres 默认数据库中创建别的数据库,但不能直接在 postgres 默认数据库中创建其他数据库的表,因为 PostgreSQL 的架构将每个数据库的表和数据严格隔离。每个数据库有自己的系统 каталоги(如 pg_class、pg_attribute)和数据文件,存储在各自的表空间中(通常是 PGDATA/base/<数据库OID>/)。因此,表只能在当前连接的数据库中创建,而无法直接为另一个数据库(如 glacier_meta)创建表。

posted @ 2025-04-18 14:19  十方央丶  阅读(477)  评论(0)    收藏  举报