0
点赞
收藏
分享

微信扫一扫

第十章postgresql日常维护

a.PostgreSQL 数据库的基本使用

配置文件位置

  • 主配置文件:/etc/postgresql/版本号/main/postgresql.conf
  • 访问控制文件:/etc/postgresql/版本号/main/pg_hba.conf

1)基本操作流程

1.切换用户连接数据库

su - postgres 
/usr/local/pgsql/bin/psql

2.创建新用户和数据库

-- 创建用户
CREATE USER myuser WITH PASSWORD 'mypassword';

-- 创建数据库
CREATE DATABASE mydb OWNER myuser;

-- 授予用户对数据库的所有权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

3.以新用户身份连接数据库

psql -U myuser -d mydb -h localhost -p 5432

2)数据库对象操作
1. 创建表

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    department VARCHAR(50),
    hire_date DATE DEFAULT CURRENT_DATE,
    salary NUMERIC(10, 2) CHECK (salary > 0)
);

2.查看表结构

\d employees

3.插入数据

INSERT INTO employees (name, email, department, salary)
VALUES 
('Alice Smith', 'alice@example.com', 'HR', 60000.00),
('Bob Johnson', 'bob@example.com', 'IT', 75000.00),
('Charlie Brown', 'charlie@example.com', 'Finance', 70000.00);

4.查询数据

-- 查询所有记录
SELECT * FROM employees;

-- 条件查询
SELECT name, salary FROM employees WHERE department = 'IT';

-- 排序查询
SELECT * FROM employees ORDER BY salary DESC;

-- 聚合查询
SELECT department, COUNT(*), AVG(salary) FROM employees GROUP BY department;

5.更新数据

UPDATE employees SET salary = salary * 1.05 WHERE department = 'IT';

6.删除数据

DELETE FROM employees WHERE name = 'Charlie Brown';

3)模式操作命令

基本操作

1.创建模式

CREATE SCHEMA my_schema;

2. 查看所有模式

\dn  -- 查看当前数据库的所有模式

3. 查看模式下的对象

\dt my_schema.*  -- 查看模式下的所有表
\dv my_schema.*  -- 查看模式下的所有视图

4. 删除模式

DROP SCHEMA my_schema;  -- 删除空模式
DROP SCHEMA my_schema CASCADE;  -- 删除包含对象的模式(谨慎使用)

用户与模式权限

1. 指定用户创建模式

CREATE SCHEMA author_schema AUTHORIZATION author_user;

2. 授予模式使用权限

GRANT USAGE ON SCHEMA my_schema TO app_user;

3. 授予模式下所有表的权限

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_schema TO app_user;

4. 设置默认模式

ALTER USER app_user SET search_path TO my_schema, public;

模式下的对象操作

1. 在指定模式创建表

CREATE TABLE my_schema.employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

2. 从模式导入表

ALTER TABLE public.old_table SET SCHEMA my_schema;

3. 创建跨模式视图

CREATE VIEW my_schema.employee_stats AS
SELECT e.id, e.name, d.dept_name
FROM public.departments d
JOIN my_schema.employees e ON d.id = e.dept_id;

模式搜索路径

1. 查看当前搜索路径

SHOW search_path;

2. 临时修改搜索路径

SET search_path TO my_schema, public;

3. 永久修改搜索路径(用户级别)

ALTER USER app_user SET search_path TO my_schema, public;

系统模式

1. 查看系统模式

\dn  -- 系统模式通常以 "pg_" 开头

2. 系统模式示例
  • pg_catalog:存储系统表和内置函数
  • information_schema:存储元数据信息

常见错误处理

1. 找不到表错误

ERROR:  relation "employees" does not exist

  • 解决方法:检查搜索路径或使用完整限定名(如 my_schema.employees
2. 权限不足错误

ERROR:  permission denied for schema my_schema

  • 解决方法:使用 GRANT USAGE ON SCHEMA 授予权限

b.postgresql的备份与恢复

1)SQL基本转储命令

1.备份基本用法

pg_dump dbname > dumpfile

2.从转储中恢复

psql dbname < dumpfile

2)核心概念

概念

说明

SQL 转储

将数据库对象(表、函数、数据等)转换为 SQL 脚本或二进制格式的过程。

物理备份

直接复制数据库文件(如 pg_basebackup),速度快但恢复灵活性低。

逻辑备份

通过 SQL 语句导出数据(如 pg_dump),兼容性强但速度较慢。

全量备份

备份整个数据库(包括所有表、数据、结构)。

增量备份

仅备份自上次备份以来变化的数据(需结合 WAL 日志)。

pg_dump 常用参数

参数

作用

示例

-U username

指定连接数据库的用户名。

pg_dump -U postgres -d mydb > backup.sql

-d dbname

指定要备份的数据库名。

pg_dump -d production_db -f prod_backup.sql

-f filename

指定输出文件路径。

pg_dump -f /data/backup/dump.sql

-F format

指定输出格式:

- p:纯文本 SQL(默认)

- c:自定义格式(压缩)

- d:目录格式(并行)

pg_dump -F c -f backup.dump

-t table_name

指定要备份的表(可多次使用)。

pg_dump -t users -t orders -f tables_backup.sql

--exclude-table table

排除指定表(支持通配符)。

pg_dump --exclude-table='log_*' -f filtered_backup.sql

-n schema_name

指定要备份的模式(Schema)。

pg_dump -n public -n audit -f schema_backup.sql

-s, --schema-only

仅备份表结构(不包含数据)。

pg_dump -s -f structure.sql

-a, --data-only

仅备份数据(不包含表结构)。

pg_dump -a -f data_only.sql

-j, --jobs

并行备份的进程数(仅适用于 -Fd 格式)。

pg_dump -Fd -j 4 -f /path/to/directory_backup

--compress

压缩级别(0-9,仅适用于 -Fc 格式)。

pg_dump -Fc --compress=6 -f backup.dump

恢复命令

备份格式

恢复命令

特点

SQL 脚本

psql -U user -d target_db -f backup.sql

适用于所有版本,可选择性执行 SQL 语句。

自定义格式

pg_restore -U user -d target_db -v backup.dump

支持并行恢复,可指定恢复特定对象(如表、模式)。

目录格式

pg_restore -U user -d target_db -j 8 -v /path/to/dir_backup

并行恢复速度最快,需 -j 参数指定线程数。

常见问题

问题

解决方案

备份速度慢

1. 使用 -j 并行备份

2. 增大 maintenance_work_mem3. 使用 SSD 存储。

备份文件过大

1. 使用 -Fc 格式并启用压缩

2. 排除不必要的表(如日志表)。

恢复时提示表已存在

使用 --clean 参数在恢复前删除现有对象:pg_restore --clean -d target_db

3)使用pg_dumpall

备份操作

1. 备份整个集群(含所有数据库和角色)

pg_dumpall -U postgres > all_databases.backup

  • 关键参数
  • -U username:指定连接用户名(通常为 postgres
  • -h host:指定数据库主机(默认 localhost
  • -p port:指定端口(默认 5432
  • -f filename:输出文件路径(推荐使用 .sql.backup 后缀)
2. 仅备份角色和全局对象

pg_dumpall -U postgres --globals-only > roles_and_globals.backup

  • 包含内容
  • 用户角色、密码和权限
  • 表空间定义
  • 全局配置参数
3. 仅备份数据库(不含角色)

pg_dumpall -U postgres --database-only > databases_only.backup

恢复操作

1. 恢复整个集群

psql -U postgres -f all_databases.backup

  • 注意事项
  • 恢复前需确保目标集群为空或已删除所有冲突对象
  • 若恢复到不同版本的 PostgreSQL,需验证兼容性
2. 选择性恢复

# 仅恢复角色
psql -U postgres -f roles_and_globals.backup

# 仅恢复特定数据库
psql -U postgres -d target_db -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
psql -U postgres -d target_db -f database_only.backup

4)pg_dumpall与 pg_dump 的对比

特性

pg_dump

pg_dumpall

备份范围

单个数据库

整个集群(所有数据库+角色)

是否包含角色

是否支持并行

支持(-j 参数)

不支持(需脚本实现)

输出格式

支持 plain、custom、directory

仅支持 plain SQL

恢复灵活性

高(可选择性恢复)

低(通常恢复整个集群)

4)常见选项

选项

作用

-U

指定用户名

-d

指定数据库名

-f

指定输出文件

-F

输出格式(p=plain, c=custom)

-j

并行处理数

-n

指定模式

-t

指定表

-s

仅备份结构

-a

仅备份数据

--verbose

显示详细进度

d.远程连接

1)服务端配置

1. 开放网络监听

编辑 postgresql.conf(通常位于 /etc/postgresql/版本/main/):

listen_addresses = '*'  # 允许所有IP连接,生产环境建议指定具体IP
port = 5432             # 默认端口,如需修改需同步防火墙规则

2. 配置访问控制

编辑 pg_hba.conf,添加远程连接规则:

# 允许所有IP通过MD5认证访问(生产环境建议限制IP范围)
host  all  all  0.0.0.0/0  md5

# 或仅允许特定子网(如192.168.1.0/24)
host  all  all  192.168.1.0/24  scram-sha-256

  • 认证方式:推荐使用 scram-sha-256(更安全)替代 md5
  • 优先级:规则按从上到下顺序匹配,确保远程规则在本地规则之后。
3.关闭防火墙

systemctl stop firewalld

4. 重启服务使配置生效

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile restart

2)客户端连接配置

1. 安装客户端工具
  • 命令行:dnf -y install postgresql
2. 连接参数设置

psql 为例:

psql -h 服务器IP -p 5432

3)安全优化

  1. 限制IP访问pg_hba.conf 中精准控制来源:

hostssl  all  all  192.168.10.102/24  MD5

2.禁用弱密码认证

删除 pg_hba.conf 中的 trustident 等不安全认证方式。

4)重置密码

修改认证配置文件(pg_hba.conf)

1.用文本编辑器打开该文件,找到本地连接的认证规则(通常是 host all all 127.0.0.1/32host all all ::1/128),将认证方式从 md5 改为 trust(表示允许免密码登录):

- host all all 127.0.0.1/32 md5
+ host all all 127.0.0.1/32 trust

重置密码

psql 命令行中,执行以下 SQL 语句修改密码(将 new_password 替换为你的新密码):

-- 修改超级用户 postgres 的密码
ALTER USER postgres WITH PASSWORD 'new_password';

-- 若需修改其他用户密码(如 user1)
ALTER USER user1 WITH PASSWORD 'new_password';

恢复 pg_hba.conf 配置并重启服务
  1. pg_hba.conf 中的认证方式改回 md5(或原来的值)。
  2. 重启 PostgreSQL 服务:

/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile restart

注意事项

  • 安全风险trust 认证方式会绕过密码验证,修改后需及时恢复配置,避免未授权访问。
  • 用户权限:确保你拥有操作系统层面的管理员权限(如 sudo)或数据库超级用户权限。
  • 默认用户:PostgreSQL 默认超级用户名为 postgres,若你创建了其他管理员用户,需使用对应的用户名登录。

5)常见问题排查

  1. 连接被拒绝
  • 检查 postgresql.conflisten_addresses 是否正确。
  • 验证防火墙/安全组是否开放5432端口。
  • 确认 pg_hba.conf 规则顺序是否正确。
  1. 认证失败
  • 确保用户名/密码正确,且用户拥有目标数据库权限。
  • 检查 pg_hba.conf 中的认证方式。


举报

相关推荐

0 条评论