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 脚本或二进制格式的过程。 |
物理备份 | 直接复制数据库文件(如 |
逻辑备份 | 通过 SQL 语句导出数据(如 |
全量备份 | 备份整个数据库(包括所有表、数据、结构)。 |
增量备份 | 仅备份自上次备份以来变化的数据(需结合 WAL 日志)。 |
pg_dump
常用参数
参数 | 作用 | 示例 |
| 指定连接数据库的用户名。 |
|
| 指定要备份的数据库名。 |
|
| 指定输出文件路径。 |
|
| 指定输出格式: - - - |
|
| 指定要备份的表(可多次使用)。 |
|
| 排除指定表(支持通配符)。 |
|
| 指定要备份的模式(Schema)。 |
|
| 仅备份表结构(不包含数据)。 |
|
| 仅备份数据(不包含表结构)。 |
|
| 并行备份的进程数(仅适用于 |
|
| 压缩级别(0-9,仅适用于 |
|
恢复命令
备份格式 | 恢复命令 | 特点 |
SQL 脚本 |
| 适用于所有版本,可选择性执行 SQL 语句。 |
自定义格式 |
| 支持并行恢复,可指定恢复特定对象(如表、模式)。 |
目录格式 |
| 并行恢复速度最快,需 |
常见问题
问题 | 解决方案 |
备份速度慢 | 1. 使用 2. 增大 |
备份文件过大 | 1. 使用 2. 排除不必要的表(如日志表)。 |
恢复时提示表已存在 | 使用 |
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
的对比
特性 |
|
|
备份范围 | 单个数据库 | 整个集群(所有数据库+角色) |
是否包含角色 | 否 | 是 |
是否支持并行 | 支持(-j 参数) | 不支持(需脚本实现) |
输出格式 | 支持 plain、custom、directory | 仅支持 plain SQL |
恢复灵活性 | 高(可选择性恢复) | 低(通常恢复整个集群) |
4)常见选项
选项 | 作用 |
| 指定用户名 |
| 指定数据库名 |
| 指定输出文件 |
| 输出格式(p=plain, c=custom) |
| 并行处理数 |
| 指定模式 |
| 指定表 |
| 仅备份结构 |
| 仅备份数据 |
| 显示详细进度 |
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)安全优化
- 限制IP访问
在
pg_hba.conf
中精准控制来源:
hostssl all all 192.168.10.102/24 MD5
2.禁用弱密码认证
删除 pg_hba.conf
中的 trust
、ident
等不安全认证方式。
4)重置密码
修改认证配置文件(pg_hba.conf)
1.用文本编辑器打开该文件,找到本地连接的认证规则(通常是 host all all 127.0.0.1/32
或 host 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 配置并重启服务
- 将
pg_hba.conf
中的认证方式改回md5
(或原来的值)。 - 重启 PostgreSQL 服务:
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile restart
注意事项
- 安全风险:
trust
认证方式会绕过密码验证,修改后需及时恢复配置,避免未授权访问。 - 用户权限:确保你拥有操作系统层面的管理员权限(如
sudo
)或数据库超级用户权限。 - 默认用户:PostgreSQL 默认超级用户名为
postgres
,若你创建了其他管理员用户,需使用对应的用户名登录。
5)常见问题排查
- 连接被拒绝
- 检查
postgresql.conf
的listen_addresses
是否正确。 - 验证防火墙/安全组是否开放5432端口。
- 确认
pg_hba.conf
规则顺序是否正确。
- 认证失败
- 确保用户名/密码正确,且用户拥有目标数据库权限。
- 检查
pg_hba.conf
中的认证方式。