加载笔记内容...
加载笔记内容...
本文所述升级方案适用于主版本升级(如14→15),其核心思路采用逻辑备份恢复策略。但需注意以下关键点:
SELECT * FROM pg_available_extensions;
检查已安装扩展的版本兼容性优化后的升级流程:
1# 停止写入并创建备份
2docker-compose stop yourService
3docker-compose exec -T yourService pg_dumpall -U postgres | gzip > pg_backup_$(date +%Y-%m-%d).sql.gz
4
5# 清理旧版本数据卷(危险操作!)
6docker-compose down -v
7
8# 升级镜像版本并启动
9sed -i 's/image: postgres:14/image: postgres:15/' docker-compose.yml
10docker-compose up -d
争议点:直接使用pg_dumpall
进行跨大版本升级可能存在数据类型兼容性问题。替代方案建议:
pg_upgrade
工具进行二进制升级最佳实践案例: 某金融系统从PG12升级到PG15时,采用以下方案:
(图片来源:PostgreSQL官方)
特性 | JSON | JSONB |
---|---|---|
存储格式 | 原始文本 | 解析后的二进制 |
索引支持 | 仅表达式索引 | GIN/BTree索引 |
写入性能 | O(1) | O(n) |
查询性能 | O(n) | O(log n) |
磁盘占用 | 原始大小 | 增加约20% |
底层原理:JSONB采用类似BSON的二进制格式存储,通过将JSON文档转换为抽象语法树(AST)实现快速查询。其存储结构包含:
对于包含JSONB字段的查询,推荐创建GIN索引:
1CREATE INDEX idx_gin_info ON name_age USING GIN (info);
复合索引优化示例:
1-- 支持 @> 操作符查询
2CREATE INDEX idx_info_id ON name_age USING BTREE ((info->>'id'));
PostgreSQL 16新增特性:
JSON_TABLE
:将JSON转换为关系表格式JSON_OBJECTAGG
:聚合函数生成JSON对象某电商平台分页查询出现重复商品:
1-- 错误写法
2SELECT * FROM products LIMIT 10 OFFSET 10;
问题分析:当底层发生AutoVacuum或HOT更新时,堆表物理存储顺序改变导致分页异常
解决方案:
1SELECT * FROM products
2ORDER BY created_at, id
3LIMIT 10 OFFSET 10;
1EXPLAIN ANALYZE
2SELECT * FROM orders
3ORDER BY order_date DESC, total_amount DESC
4LIMIT 100;
索引优化方案:
1CREATE INDEX idx_orders_sort ON orders(order_date DESC, total_amount DESC);
执行计划对比:
Sort (cost=10234.56..10245.67 rows=4400 width=96)
Index Scan Backward using idx_orders_sort
1-- 创建只读用户
2CREATE ROLE analyst WITH LOGIN PASSWORD 'securePW';
3GRANT CONNECT ON DATABASE prod_db TO analyst;
4GRANT USAGE ON SCHEMA public TO analyst;
5
6-- 行级安全策略
7CREATE POLICY read_only_policy ON sensitive_data
8FOR SELECT TO analyst USING (department = current_user);
在postgresql.conf
中启用:
1log_statement = 'all'
2log_directory = '/var/log/postgresql'
3log_filename = 'audit_%Y-%m-%d.log'
1version: '3.8'
2services:
3 postgres:
4 image: postgres:15
5 volumes:
6 - pgdata:/var/lib/postgresql/data
7volumes:
8 pgdata:
9 driver_opts:
10 type: nfs
11 o: addr=192.168.1.100,rw
12 device: ":/path/to/nfs/share"
1healthcheck:
2 test: ["CMD-SHELL", "pg_isready -U postgres"]
3 interval: 10s
4 timeout: 5s
5 retries: 3
症状:FATAL: remaining connection slots are reserved for non-replication superuser connections
解决方案:
1-- 查看当前连接数
2SELECT sum(numbackends) FROM pg_stat_database;
3
4-- 修改连接配置
5ALTER SYSTEM SET max_connections = 200;
1-- 查看膨胀率
2SELECT
3 nspname,
4 relname,
5 pg_size_pretty(pg_relation_size(relid)) AS size,
6 pg_size_pretty(pg_relation_size(relid) - pg_indexes_size(relid)) AS waste
7FROM pg_catalog.pg_statio_user_tables;
重建索引:
1REINDEX INDEX CONCURRENTLY idx_large_table;
建议定期查阅PostgreSQL官方Wiki获取最新动态,在容器化部署场景下,可考虑使用Crunchy Data或AWS RDS等托管服务降低运维复杂度。