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)创建表。

浙公网安备 33010602011771号