PostgreSQL数据库学习知识点大全(三)

简介: 教程来源 https://app-acda5zfcddz5.appmiaoda.com 系统介绍PostgreSQL核心运维技术:事务与并发控制(ACID、隔离级别、锁机制)、备份恢复(逻辑/物理备份、PITR)、高可用复制(流复制、逻辑复制)及安全管理(角色权限、RLS、SSL加密),覆盖生产环境关键实践。

七、事务与并发控制

7.1 事务管理

-- 显式事务
BEGIN;
-- 或
START TRANSACTION;

-- 事务操作
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;

-- 保存点
SAVEPOINT before_check;

-- 检查余额
SELECT balance FROM accounts WHERE account_id = 1;

-- 回滚到保存点
ROLLBACK TO SAVEPOINT before_check;

-- 提交
COMMIT;

-- 回滚
ROLLBACK;

-- 设置事务特性
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY;

-- 设置事务超时
SET statement_timeout = '5s';

-- 设置空闲事务超时
SET idle_in_transaction_session_timeout = '10s';

7.2 隔离级别

-- 查看当前隔离级别
SHOW transaction_isolation;

-- 设置隔离级别
-- READ UNCOMMITTED(实际为READ COMMITTED)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- READ COMMITTED(默认)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

-- 演示可重复读
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM employees WHERE employee_id = 1;
-- 其他会话修改数据
SELECT * FROM employees WHERE employee_id = 1;  -- 返回相同结果
COMMIT;

-- 演示序列化异常
BEGIN ISOLATION LEVEL SERIALIZABLE;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
-- 可能因序列化失败而回滚

7.3 锁机制

-- 行级锁(SELECT FOR UPDATE)
BEGIN;
SELECT * FROM employees WHERE employee_id = 1 FOR UPDATE;
-- 更新操作
UPDATE employees SET salary = 10000 WHERE employee_id = 1;
COMMIT;

-- 共享锁(FOR SHARE)
BEGIN;
SELECT * FROM employees WHERE department_id = 10 FOR SHARE;
-- 其他会话可以读但不能修改
COMMIT;

-- 带超时的锁
BEGIN;
SELECT * FROM employees WHERE employee_id = 1 FOR UPDATE NOWAIT;
SELECT * FROM employees WHERE employee_id = 2 FOR UPDATE WAIT 5;
COMMIT;

-- 跳过锁定的行
BEGIN;
SELECT * FROM employees WHERE is_active = true FOR UPDATE SKIP LOCKED;
COMMIT;

-- 表级锁
LOCK TABLE employees IN ACCESS SHARE MODE;
LOCK TABLE employees IN ROW SHARE MODE;
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
LOCK TABLE employees IN SHARE UPDATE EXCLUSIVE MODE;
LOCK TABLE employees IN SHARE MODE;
LOCK TABLE employees IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE employees IN EXCLUSIVE MODE;
LOCK TABLE employees IN ACCESS EXCLUSIVE MODE;

-- 查看锁信息
SELECT 
    locktype,
    relation::regclass,
    mode,
    granted,
    pid,
    query
FROM pg_locks
LEFT JOIN pg_stat_activity ON pg_locks.pid = pg_stat_activity.pid
WHERE locktype NOT IN ('virtualxid', 'transactionid');

-- 查看阻塞查询
SELECT 
    blocked.pid AS blocked_pid,
    blocked.query AS blocked_query,
    blocking.pid AS blocking_pid,
    blocking.query AS blocking_query
FROM pg_stat_activity blocked
JOIN pg_stat_activity blocking 
    ON blocked.wait_event_type = 'Lock' 
    AND blocking.pid = ANY(pg_blocking_pids(blocked.pid));

-- 终止会话
SELECT pg_terminate_backend(pid);

八、备份与恢复

8.1 逻辑备份

# pg_dump - 备份单个数据库
pg_dump -U postgres -d mydb > mydb_backup.sql

# pg_dump - 备份特定表
pg_dump -U postgres -d mydb -t employees -t departments > tables_backup.sql

# pg_dump - 只备份结构
pg_dump -U postgres -d mydb --schema-only > schema_backup.sql

# pg_dump - 只备份数据
pg_dump -U postgres -d mydb --data-only > data_backup.sql

# pg_dump - 使用压缩
pg_dump -U postgres -d mydb | gzip > mydb_backup.sql.gz

# pg_dumpall - 备份所有数据库
pg_dumpall -U postgres > all_dbs_backup.sql

# 恢复
psql -U postgres -d mydb < mydb_backup.sql

# 从压缩文件恢复
gunzip -c mydb_backup.sql.gz | psql -U postgres -d mydb

# 恢复所有数据库
psql -U postgres -f all_dbs_backup.sql postgres

8.2 物理备份

# 基础备份
# 开启归档
# postgresql.conf
archive_mode = on
archive_command = 'cp %p /archive/%f'

# 执行基础备份
psql -c "SELECT pg_start_backup('backup_label');"
tar -czf /backup/base_backup.tar.gz /var/lib/postgresql/16/main
psql -c "SELECT pg_stop_backup();"

# 恢复
# 停止服务
# 清理数据目录
# 恢复基础备份
tar -xzf /backup/base_backup.tar.gz -C /var/lib/postgresql/16/main
# 创建 recovery.signal 文件
touch /var/lib/postgresql/16/main/recovery.signal
# 配置恢复
# 启动服务

# 使用 pg_basebackup
pg_basebackup -U postgres -D /backup/base_backup -Fp -Xs -P -R

# 使用 Barman 备份
barman backup main
barman list-backup main
barman recover main latest /recovery/directory

8.3 PITR(时间点恢复)

-- 开启 WAL 归档
ALTER SYSTEM SET archive_mode = 'on';
ALTER SYSTEM SET archive_command = 'cp %p /archive/%f';
SELECT pg_reload_conf();

-- 执行基础备份
SELECT pg_start_backup('pitr_backup');
-- 复制数据目录
SELECT pg_stop_backup();

-- 配置恢复
-- 创建 recovery.conf(PostgreSQL 12之前)
-- 或创建 recovery.signal(PostgreSQL 12+)

-- recovery.conf 示例
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2024-01-01 12:00:00'
recovery_target_timeline = 'latest'

-- 启动恢复
-- 查看恢复状态
SELECT pg_is_in_recovery();

-- 完成恢复后,数据库自动打开
-- 取消恢复
SELECT pg_wal_replay_resume();

九、复制与高可用

9.1 流复制

# 主库配置(postgresql.conf)
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
hot_standby = on

# 主库配置(pg_hba.conf)
host replication replicator 192.168.1.0/24 md5

# 创建复制用户
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'password';

# 备库配置
# 停止备库
pg_ctl stop

# 从主库备份
pg_basebackup -h master_ip -U replicator -D /var/lib/postgresql/16/main -Fp -Xs -P -R

# 备库配置(postgresql.conf)
hot_standby = on
primary_conninfo = 'host=master_ip port=5432 user=replicator password=password'

# 启动备库
pg_ctl start

# 查看复制状态
SELECT * FROM pg_stat_replication;
SELECT pg_is_in_recovery();

# 查看 WAL 发送位置
SELECT application_name, state, sync_state, write_lag, flush_lag, replay_lag
FROM pg_stat_replication;

9.2 逻辑复制

-- 发布端配置
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10

-- 创建发布
CREATE PUBLICATION my_publication FOR TABLE employees, departments;
CREATE PUBLICATION all_tables FOR ALL TABLES;
CREATE PUBLICATION filter_pub FOR TABLE employees WHERE department_id = 10;

-- 查看发布
SELECT * FROM pg_publication;
SELECT * FROM pg_publication_tables;

-- 订阅端配置
max_replication_slots = 10
max_logical_replication_workers = 10

-- 创建订阅
CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=master_ip port=5432 dbname=mydb user=replicator password=password'
PUBLICATION my_publication;

-- 查看订阅
SELECT * FROM pg_subscription;
SELECT * FROM pg_stat_subscription;

-- 刷新订阅
ALTER SUBSCRIPTION my_subscription REFRESH PUBLICATION;

-- 禁用/启用订阅
ALTER SUBSCRIPTION my_subscription DISABLE;
ALTER SUBSCRIPTION my_subscription ENABLE;

十、安全管理

10.1 用户与角色

-- 创建角色
CREATE ROLE app_user WITH LOGIN PASSWORD 'password';
CREATE ROLE readonly;
CREATE ROLE readwrite;

-- 创建用户(等同 CREATE ROLE + LOGIN)
CREATE USER app_user WITH PASSWORD 'password';

-- 授予角色权限
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO readwrite;

-- 创建超级用户
CREATE ROLE admin WITH SUPERUSER LOGIN;

-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO readonly;

-- 查看角色
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole 
FROM pg_roles;

-- 删除角色
DROP ROLE app_user;

-- 修改角色属性
ALTER ROLE app_user WITH SUPERUSER;
ALTER ROLE app_user WITH NOSUPERUSER;
ALTER ROLE app_user VALID UNTIL '2024-12-31';
ALTER ROLE app_user SET statement_timeout = '5min';

10.2 权限管理

-- 数据库权限
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT CREATE, TEMP ON DATABASE mydb TO app_user;

-- 模式权限
GRANT USAGE ON SCHEMA public TO app_user;
GRANT CREATE ON SCHEMA public TO app_user;

-- 表权限
GRANT SELECT, INSERT, UPDATE, DELETE ON employees TO app_user;
GRANT ALL PRIVILEGES ON employees TO admin;

-- 列权限
GRANT SELECT (employee_id, first_name, last_name) ON employees TO app_user;

-- 序列权限
GRANT USAGE ON SEQUENCE employees_employee_id_seq TO app_user;

-- 函数权限
GRANT EXECUTE ON FUNCTION get_employee_salary(INTEGER) TO app_user;

-- 查看权限
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'app_user';

-- 撤销权限
REVOKE DELETE ON employees FROM app_user;

-- 行级安全策略(RLS)
ALTER TABLE employees ENABLE ROW LEVEL SECURITY;

CREATE POLICY employee_policy ON employees
    USING (department_id = current_setting('app.current_department')::INTEGER);

CREATE POLICY employee_select_policy ON employees
    FOR SELECT
    USING (is_active = true);

10.3 SSL/TLS加密

# 生成SSL证书
openssl req -new -text -nodes -subj '/CN=localhost' -out server.req
openssl rsa -in privkey.pem -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt

# 配置postgresql.conf
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'

# 配置pg_hba.conf
hostssl all all 0.0.0.0/0 md5

# 强制SSL连接
ALTER ROLE app_user SET ssl = 'on';

来源:
https://app-acda5zfcddz5.appmiaoda.com

相关文章
|
4月前
|
人工智能 Linux API
OpenClaw 全平台部署与配置手册:阿里云轻量应用服务器+本地三系统+免费模型对接教程
OpenClaw(Clawdbot,业内常称龙虾)作为2026年主流开源AI代理工具,支持云端长期稳定运行与本地灵活部署两种模式。云端部署可实现7×24小时不间断工作、不占用本地设备、功耗更低、安全性更可控;本地部署则适合隐私敏感、离线使用、轻量化测试场景。本文基于2026年最新环境,完整提供阿里云轻量应用服务器一键部署、本地Windows11/MacOS/Linux手动部署、阿里云百炼Coding Plan免费大模型API配置、通讯工具集成方法以及全场景常见问题解决方案,全程无冗余步骤,可直接按流程执行。
700 0
|
4月前
|
SQL Oracle 关系型数据库
Oracle数据库学习知识点(一)
教程来源 https://app-ah8jla8z2m81.appmiaoda.com 系统梳理Oracle数据库核心知识,涵盖安装配置、体系结构、SQL基础、PL/SQL编程等关键内容,兼顾初学者入门与DBA/开发者进阶需求,助力构建完整技术体系。
|
4月前
|
人工智能 API 项目管理
从平台来源到生态布局:对 GitCode 的背景与能力做一次中立介绍
GitCode是由CSDN与华为云CodeArts联合打造的新一代开源开发者平台,融合社区生态与研发基建,支持代码托管、协同开发、CI/CD及开源运营,深度对接开放原子等本土生态,致力于构建“代码+社区+AI”一体化开源基础设施。(239字)
534 0
|
4月前
|
人工智能 自然语言处理 安全
保姆级零门槛|阿里云部署OpenClaw+智谱GLM-5大模型配置,新手10分钟上手(含避坑指南)
2026年,AI智能体技术迎来爆发式迭代,OpenClaw(曾用名Clawdbot、Moltbot)作为轻量化开源AI自动化助手,凭借“自然语言驱动、多工具协同、零编程门槛”的核心优势,成为个人与轻量团队解锁自动化办公、代码开发、多场景任务处理的首选工具。它无需复杂操作,仅需输入口语化指令,就能自动完成文档整理、网页抓取、代码生成、定时任务、跨平台同步等重复性工作,堪称“7×24小时不下线的私人AI助理”,彻底解放双手、提升效率。
2091 4
|
存储 监控 NoSQL
第4期 MongoDB配置用户名密码认证登录
MongoDB配置用户名密码认证登录
4139 0
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL数据库学习知识点大全(一)
教程来源 https://app-ad5sxofh8phd.appmiaoda.com PostgreSQL是全球领先的开源关系型数据库,以高可靠性、强扩展性、完整SQL标准兼容及丰富功能(JSON/XML/地理空间等)著称。本文系统梳理其核心知识:从安装配置、体系结构、SQL基础到高级查询与窗口函数,助力初学者构建完整知识体系,也为DBA和开发者提供深度技术参考。
|
4月前
|
SQL 存储 缓存
SQL Server数据库学习知识点大全(一)
教程来源 https://app-aes4wxahovsx.appmiaoda.com/ SQL Server核心知识,涵盖基础安装配置、体系结构、T-SQL语法(数据类型、查询、连接、子查询)、高级编程(存储过程、函数、触发器)及高可用特性,助力初学者构建完整知识体系,也为DBA与开发者提供实用技术参考。
|
4月前
|
SQL 存储 Oracle
Oracle数据库学习知识点(二)
教程来源 https://app-ah2affi0rlz5.appmiaoda.com 本节详解Oracle数据库高级编程:存储过程(含输入/输出参数、异常处理)、函数(支持默认值、自治事务)、包(规范与体分离、封装性)、各类触发器(DML/DDL/系统事件)及事务锁机制(隔离级别、行/表锁、死锁诊断),全面提升数据库逻辑控制与安全性。
|
4月前
|
安全 Linux Shell
Codex CLI 速查表
本文详解 OpenAI Codex CLI(cx)的安装、配置与实战技巧:涵盖 WSL2/Windows 双环境部署、沙盒安全机制、TOML 配置、AGENTS.md 项目约定、快捷键及斜杠命令,对比 cc 差异,附避坑指南与自动化最佳实践。
|
4月前
|
SQL 存储 运维
SQL Server数据库学习知识点大全(二)
教程来源 https://app-aemgc2le7pq9.appmiaoda.com 系统讲解SQL Server核心运维技术:索引设计与碎片整理、查询执行计划分析与提示优化、内存优化表与本地编译存储过程;事务控制、隔离级别(含快照隔离)、锁机制与死锁处理;以及完整/差异/日志备份策略与多种恢复场景(时间点、页面级等)。

热门文章

最新文章