PostgreSQL运维全攻略:从基础操作到远程配置

技能目标

  • 掌握 PostgreSQL(psql)的基础操作与元命令使用
  • 精通数据库、表、模式(Schema)的创建、管理与权限隔离
  • 熟练完成 PostgreSQL 的备份恢复、密码重置与远程连接配置
  • 构建 PostgreSQL 日常运维的完整技能体系

前言

PostgreSQL(简称 pgsql)是一款功能强大的开源关系型数据库,以其对 SQL 标准的严格遵循、高扩展性和稳定性,广泛应用于企业级开发、数据分析等场景。本课件围绕 PostgreSQL 的日常运维展开,从基础登录、库表操作,到模式设计、权限管理、备份恢复与远程连接,通过模块化学习,帮助学习者掌握 PostgreSQL 的核心运维技能,为高效管理和开发数据库奠定坚实基础。


一、基础使用

1.1 登录数据库

PostgreSQL 默认使用postgres超级用户登录,登录后命令提示符为postgres=#

bash

运行

复制代码
# 切换到postgres用户
[root@localhost ~]# su - postgres
# 启动psql客户端
[postgres@localhost ~]$ /usr/local/pgsql/bin/psql
psql (16.3)
Type "help" for help.

postgres=#

1.2 数据库操作

1.2.1 列出所有数据库

PostgreSQL 提供三种常用方法:

  • 方法一:元命令\l (快速查看)

    sql

    复制代码
    postgres=# \l
  • 方法二:元命令\l+ (扩展输出,含大小、表空间等详细信息)

    sql

    复制代码
    postgres=# \l+
  • 方法三:SQL 查询系统表pg_database

    sql

    复制代码
    postgres=# SELECT datname FROM pg_database;

    pg_database是系统表,存储所有数据库元信息,始终可见,无需指定模式。

1.2.2 创建数据库

sql

复制代码
postgres=# CREATE DATABASE mydb;
CREATE DATABASE
1.2.3 删除数据库

sql

复制代码
postgres=# DROP DATABASE mydb;
DROP DATABASE
1.2.4 切换数据库

sql

复制代码
postgres=# \c mydb
You are now connected to database "mydb" as user "postgres".
mydb=#
1.2.5 查看数据库大小
  • 以字节为单位

    sql

    复制代码
    mydb=# SELECT pg_database_size('mydb');
     pg_database_size
    ------------------
              7594499
    (1 行记录)
  • 以可读格式显示

    sql

    复制代码
    mydb=# SELECT pg_size_pretty(pg_database_size('mydb'));
     pg_size_pretty
    ----------------
     7417 kB
    (1 行记录)

1.3 数据表操作

1.3.1 列出表
  • 列出当前库中search_path内的表(默认public模式)

    sql

    复制代码
    mydb=# \dt;
  • 列出表、视图和序列

    sql

    复制代码
    mydb=# \d
  • 列出指定模式下的表

    sql

    复制代码
    mydb=# \dt hr.*
  • SQL 方式列出public模式下的表

    sql

    复制代码
    mydb=# SELECT * FROM pg_tables WHERE schemaname = 'public';
1.3.2 创建表

PostgreSQL 支持标准 SQL 类型与自定义类型,示例:

sql

复制代码
postgres=# CREATE TABLE test(id int, name char(10), age int);
CREATE TABLE
1.3.3 复制表

复制表结构与数据:

sql

复制代码
postgres=# CREATE TABLE test2 AS TABLE test;
SELECT 0
1.3.4 删除表

sql

复制代码
postgres=# DROP TABLE test2;
DROP TABLE
1.3.5 查看表结构

sql

复制代码
postgres=# \d test;

1.4 模式(Schema)操作

模式是 PostgreSQL 的逻辑容器,用于组织数据库对象,避免命名冲突,实现权限隔离。

1.4.1 创建模式

sql

复制代码
postgres=# CREATE SCHEMA hr;
CREATE SCHEMA
1.4.2 默认模式

每个数据库默认有public模式,未指定模式时,对象默认创建在public中。通过search_path设置模式搜索优先级(类似 PATH 环境变量):

sql

复制代码
postgres=# SHOW search_path;
   search_path
----------------
 "$user", public
(1 行记录)

表示优先查找当前用户同名模式,再查找public模式。

1.4.3 删除模式
  • 删除空模式

    sql

    复制代码
    postgres=# DROP SCHEMA hr;
    DROP SCHEMA
  • 强制删除模式及所有对象

    sql

    复制代码
    postgres=# DROP SCHEMA hr CASCADE;
    DROP SCHEMA
1.4.4 查看所有模式
  • 元命令

    sql

    复制代码
    postgres=# \dn
  • SQL 查询

    sql

    复制代码
    postgres=# SELECT schema_name FROM information_schema.schemata;
1.4.5 在指定模式中创建表

sql

复制代码
postgres=# CREATE TABLE hr.employees (id SERIAL PRIMARY KEY, name TEXT);
CREATE TABLE
1.4.6 切换当前模式

调整search_path的搜索范围:

  • 切换到单个模式

    sql

    复制代码
    SET search_path TO new_schema;
  • 切换到多个模式(按优先级)

    sql

    复制代码
    SET search_path TO hr, public;
1.4.7 查看当前所在模式

sql

复制代码
postgres=# SELECT current_schema();
 current_schema
----------------
 hr
(1 行记录)
1.4.8 模式隔离性演示

PostgreSQL 支持同库同表名,通过模式隔离:

  1. 创建数据库mydb

    sql

    复制代码
    CREATE DATABASE mydb;
    \c mydb
  2. 创建两个模式schem1schema2

    sql

    复制代码
    CREATE SCHEMA schema1;
    CREATE SCHEMA schema2;
  3. 在两个模式中创建同名users表并插入数据

    sql

    复制代码
    CREATE TABLE schema1.users (id int);
    INSERT INTO schema1.users VALUES(1);
    
    CREATE TABLE schema2.users (id int);
    INSERT INTO schema2.users VALUES(2);
  4. 跨模式查询

    sql

    复制代码
    -- 需显式指定模式名
    SELECT * FROM schema1.users;
    SELECT * FROM schema2.users;
    
    -- 设置默认模式后可省略
    SET search_path TO schema1;
    SELECT * FROM users; -- 访问schema1.users

1.5 数据增删改查

1.5.1 插入数据

sql

复制代码
postgres=# INSERT INTO test VALUES(1,'zhangsan',18);
INSERT 0 1
1.5.2 查询数据

sql

复制代码
postgres=# SELECT * FROM test;
 id |   name   | age
----+----------+-----
  1 | zhangsan |  18
(1 行记录)
1.5.3 修改数据

sql

复制代码
postgres=# UPDATE test SET age=20 WHERE id=1;
UPDATE 1
1.5.4 删除数据

sql

复制代码
postgres=# DELETE FROM test WHERE id=1;
DELETE 1

二、备份与恢复

PostgreSQL 提供三种备份方式:SQL 转储、文件系统级备份、连续归档,本章以 **SQL 转储(pg_dump)** 为主。

2.1 SQL 转储(pg_dump)

pg_dump将数据库导出为 SQL 脚本,用于重建数据:

bash

运行

复制代码
# 备份单个数据库
pg_dump dbname > dumpfile
  • 支持跨平台迁移(32 位→64 位),备份一致性基于template0
  • 普通用户可使用-n schema/-t table备份有权限的对象。

2.2 从转储中恢复

bash

运行

复制代码
# 恢复数据库
psql dbname < dumpfile
  • 若需创建数据库,需先执行createdb dbname

  • 错误处理:添加--set ON_ERROR_STOP=on遇到错误终止:

    bash

    运行

    复制代码
    psql --set ON_ERROR_STOP=on dbname < infile

2.3 全库备份(pg_dumpall)

备份整个集群的所有数据库、角色和表空间:

bash

运行

复制代码
pg_dumpall > dumpfile

恢复命令:

bash

运行

复制代码
psql -f dumpfile postgres

三、远程连接配置

3.1 修改监听地址

默认 PostgreSQL 仅监听127.0.0.1,需修改postgresql.conf

bash

运行

复制代码
# 编辑配置文件
[root@localhost ~]# vim /var/lib/pgsql/data/postgresql.conf
# 修改listen_addresses
listen_addresses = '*'
# 重启服务
[root@localhost ~]# systemctl restart postgresql

3.2 配置访问权限(pg_hba.conf)

编辑pg_hba.conf,添加远程访问规则:

ini

复制代码
# IPv4 local connections:
host    all             all             0.0.0.0/0            trust

trust表示无密码访问(仅测试环境使用),生产环境建议使用md5/scram-sha-256

3.3 重启服务与验证

bash

运行

复制代码
[root@localhost ~]# systemctl restart postgresql
# 远程连接测试
[postgres@localhost ~]$ psql -h 192.168.10.102

四、密码重置

4.1 备份配置文件

bash

运行

复制代码
[root@localhost ~]# cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bak

4.2 修改配置文件

pg_hba.conf中本地连接认证改为trust,免密登录:

ini

复制代码
host    all             all             127.0.0.1/32            trust

4.3 重启服务并修改密码

bash

运行

复制代码
[root@localhost ~]# systemctl restart postgresql
# 免密登录后修改密码
postgres=# ALTER USER postgres WITH PASSWORD 'new_password';
ALTER ROLE

4.4 恢复配置文件

将备份文件覆盖原pg_hba.conf,重启服务,使用新密码登录。


总结

本章系统梳理了 PostgreSQL 的日常运维全流程:从本地登录到远程访问权限配置,从库表的增删改查到模式的逻辑隔离,再到备份恢复与密码重置。PostgreSQL 的灵活性与严谨性使其既能支撑简单应用,也能应对复杂企业级需求。掌握这些核心技能后,可独立完成 PostgreSQL 的基础运维任务,为后续高级功能(如性能调优、高可用)的学习打下坚实基础。

相关推荐
独小乐2 小时前
009.中断实践之实现按键测试|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·arm
披着羊皮不是狼2 小时前
将Ubuntu从C盘移动到D盘
linux·运维·ubuntu
l2ohvef2 小时前
Windows 7 虚拟机 VMware Tools 安装失败:无法自动安装VSock 驱动程序
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志2 小时前
从零开始写Linux字符设备驱动:一个不操作硬件的Hello驱动
linux·运维·数据库
Benszen2 小时前
Ansible自动化运维实战
linux·运维·自动化·ansible
艾莉丝努力练剑3 小时前
C++ 核心编程练习:从基础语法到递归、重载与宏定义
linux·运维·服务器·c语言·c++·学习
Trouvaille ~3 小时前
【MySQL篇】从零开始:安装与基础概念
linux·数据库·mysql·ubuntu·c·教程·基础入门
Curtain_Gin3 小时前
windows vim 配置
linux·编辑器·vim
Dontla3 小时前
(龙虾)OpenClaw(原 Clawdbot / Moltbot)常见部署方式介绍(Linux部署、Windows桌面部署)
linux·运维·服务器