全局变量持久化
在PostgreSQL中,全局变量(也称为配置参数)控制着数据库服务器的各种行为和特性。这些参数可以在不同级别进行设置,包括服务器级别、数据库级别、用户级别和会话级别。理解如何正确设置和管理这些全局变量对于优化PostgreSQL性能和满足特定业务需求至关重要。本章将详细介绍PostgreSQL全局变量的设置和持久化方法。
PostgreSQL配置参数概述
PostgreSQL提供了大量的配置参数来控制数据库服务器的行为。这些参数可以分为以下几类:
- 连接和认证参数:控制客户端连接和认证行为
- 资源消耗参数:控制内存、磁盘和其他资源的使用
- 查询规划参数:影响查询优化器的行为
- 错误报告和日志参数:控制错误报告和日志记录行为
- 运行时统计参数:控制统计信息的收集
- 自动清理参数:控制自动清理进程的行为
- 客户端连接默认参数:设置客户端连接的默认值
- 锁管理参数:控制锁管理行为
- 版本和平台兼容性参数:控制与其他数据库系统的兼容性
查看当前配置参数
-- 查看所有配置参数
SHOW ALL;
-- 查看特定配置参数
SHOW shared_buffers;
SHOW work_mem;
SHOW maintenance_work_mem;
-- 使用SQL查询查看配置参数
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN ('shared_buffers', 'work_mem', 'maintenance_work_mem');
-- 查看配置参数的详细信息
SELECT
name,
setting,
unit,
category,
short_desc,
extra_desc,
context, -- 参数生效的上下文
vartype, -- 参数类型
source -- 参数来源
FROM pg_settings
WHERE name = 'shared_buffers';
配置参数的设置级别
PostgreSQL中的配置参数可以在不同级别进行设置,每个级别有不同的持久化特性和作用范围。
会话级别设置
-- 在当前会话中设置参数(临时生效)
SET work_mem = '256MB';
SET enable_seqscan = off;
SET log_statement = 'all';
-- 使用SET LOCAL在当前事务中设置参数
BEGIN;
SET LOCAL work_mem = '512MB';
-- 执行一些查询
SELECT * FROM large_table WHERE condition = 'value';
COMMIT;
-- 事务结束后,work_mem恢复为会话级别或全局级别设置
会话级别设置的特点:
- 只在当前数据库会话中生效
- 会话结束后自动恢复为默认值
- 不会影响其他会话
- 适合临时调整参数进行特定操作
用户级别设置
-- 为特定用户设置默认参数
ALTER USER username SET work_mem = '128MB';
ALTER USER username SET search_path = '"$user", public, schema1';
-- 为所有用户设置默认参数
ALTER DATABASE database_name SET work_mem = '64MB';
-- 查看用户的参数设置
SELECT usename, useconfig FROM pg_user WHERE usename = 'username';
-- 重置用户的参数设置
ALTER USER username RESET work_mem;
全局级别参数设置
全局级别的参数设置影响整个PostgreSQL服务器实例,需要通过配置文件或管理命令进行设置。
通过postgresql.conf文件设置
# postgresql.conf文件示例
# 内存相关参数
shared_buffers = 256MB
work_mem = 4MB
maintenance_work_mem = 64MB
effective_cache_size = 1GB
# 连接相关参数
max_connections = 100
superuser_reserved_connections = 3
# WAL相关参数
wal_level = replica
max_wal_size = 1GB
min_wal_size = 80MB
# 查询优化器参数
random_page_cost = 1.1
seq_page_cost = 1.0
effective_io_concurrency = 200
# 自动清理参数
autovacuum = on
log_autovacuum_min_duration = 0
# 日志相关参数
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'error'
log_min_duration_statement = 1000
修改postgresql.conf文件后需要重启PostgreSQL服务才能生效:
# 在Linux系统中重启PostgreSQL
sudo systemctl restart postgresql
# 或者使用pg_ctl命令
pg_ctl restart -D /path/to/data/directory
# 在Windows系统中重启PostgreSQL服务
net stop postgresql-x64-13
net start postgresql-x64-13
使用ALTER SYSTEM命令设置
-- 使用ALTER SYSTEM设置全局参数(PostgreSQL 9.4+)
ALTER SYSTEM SET shared_buffers = '512MB';
ALTER SYSTEM SET work_mem = '8MB';
ALTER SYSTEM SET max_connections = 200;
-- 查看通过ALTER SYSTEM设置的参数
SELECT name, setting FROM pg_file_settings WHERE name IN ('shared_buffers', 'work_mem');
-- 重新加载配置(无需重启服务器)
SELECT pg_reload_conf();
-- 或者在psql中使用命令
-- SELECT pg_reload_conf();
-- \! pg_ctl reload -D /path/to/data/directory
-- 重置参数为默认值
ALTER SYSTEM RESET work_mem;
ALTER SYSTEM RESET ALL; -- 重置所有通过ALTER SYSTEM设置的参数
ALTER SYSTEM命令的特点:
- 将参数设置保存到postgresql.auto.conf文件中
- 不需要直接编辑配置文件
- 可以通过pg_reload_conf()函数重新加载配置,无需重启服务器
- 具有比postgresql.conf更高的优先级
配置参数的优先级
PostgreSQL中配置参数的优先级从高到低如下:
参数优先级顺序
-- 优先级顺序(从高到低):
-- 1. 会话级别设置(SET命令)
-- 2. 用户级别设置(ALTER USER ... SET)
-- 3. 数据库级别设置(ALTER DATABASE ... SET)
-- 4. ALTER SYSTEM设置(postgresql.auto.conf)
-- 5. 命令行启动选项(-c参数)
-- 6. postgresql.conf文件
-- 7. 默认值
-- 查看参数的实际值和来源
SELECT
name,
setting,
source,
sourcefile,
sourceline
FROM pg_settings
WHERE name = 'work_mem';
示例说明不同优先级的效果:
-- 假设postgresql.conf中设置:work_mem = '4MB'
-- 假设ALTER SYSTEM设置:work_mem = '8MB'
-- 假设为用户test_user设置:work_mem = '16MB'
-- 以test_user身份连接数据库
-- 查看当前work_mem值
SHOW work_mem; -- 结果:16MB(用户级别设置优先)
-- 在会话中临时修改
SET work_mem = '32MB';
SHOW work_mem; -- 结果:32MB(会话级别设置优先)
-- 重置会话级别设置
RESET work_mem;
SHOW work_mem; -- 结果:16MB(恢复为用户级别设置)
重要配置参数详解
以下是一些对PostgreSQL性能和功能至关重要的配置参数。
内存相关参数
-- shared_buffers
-- 设置PostgreSQL使用的共享内存缓冲区大小
-- 建议设置为系统内存的25%
ALTER SYSTEM SET shared_buffers = '256MB';
-- work_mem
-- 设置每个查询操作(如排序、哈希表)可以使用的内存量
-- 根据并发查询数量和系统内存合理设置
ALTER SYSTEM SET work_mem = '4MB';
-- maintenance_work_mem
-- 设置维护操作(如VACUUM、CREATE INDEX)可以使用的内存量
ALTER SYSTEM SET maintenance_work_mem = '64MB';
-- effective_cache_size
-- 告诉查询优化器操作系统和其他进程可用的缓存大小
ALTER SYSTEM SET effective_cache_size = '1GB';
WAL(Write-Ahead Logging)相关参数
-- wal_level
-- 设置WAL日志的详细程度(minimal, replica, logical)
ALTER SYSTEM SET wal_level = 'replica';
-- max_wal_size和min_wal_size
-- 控制WAL日志文件的最大和最小大小
ALTER SYSTEM SET max_wal_size = '1GB';
ALTER SYSTEM SET min_wal_size = '80MB';
-- checkpoint_completion_target
-- 设置检查点完成目标(0.0-1.0)
ALTER SYSTEM SET checkpoint_completion_target = '0.7';
-- wal_buffers
-- 设置WAL缓冲区大小
ALTER SYSTEM SET wal_buffers = '16MB';
连接和并发相关参数
-- max_connections
-- 设置最大并发连接数
ALTER SYSTEM SET max_connections = 100;
-- superuser_reserved_connections
-- 为超级用户保留的连接数
ALTER SYSTEM SET superuser_reserved_connections = 3;
-- max_prepared_transactions
-- 设置最大预处理事务数(用于两阶段提交)
ALTER SYSTEM SET max_prepared_transactions = 0; -- 0表示禁用
查询优化相关参数
-- random_page_cost和seq_page_cost
-- 设置随机页面访问和顺序页面访问的成本
-- 对于SSD,建议random_page_cost = 1.1
ALTER SYSTEM SET random_page_cost = '1.1';
ALTER SYSTEM SET seq_page_cost = '1.0';
-- effective_io_concurrency
-- 设置并发I/O操作的数量(适用于SSD)
ALTER SYSTEM SET effective_io_concurrency = 200;
-- default_statistics_target
-- 设置默认统计信息收集目标
ALTER SYSTEM SET default_statistics_target = 100;
配置参数的最佳实践
正确设置和管理PostgreSQL配置参数需要遵循一些最佳实践。
性能调优建议
-- 1. 根据系统资源合理设置内存参数
-- 对于8GB内存的系统示例配置:
ALTER SYSTEM SET shared_buffers = '2GB'; -- 25%系统内存
ALTER SYSTEM SET effective_cache_size = '6GB'; -- 75%系统内存
ALTER SYSTEM SET work_mem = '32MB'; -- 根据并发查询调整
ALTER SYSTEM SET maintenance_work_mem = '512MB'; -- 维护操作内存
-- 2. 根据存储类型调整I/O参数
-- 对于SSD存储:
ALTER SYSTEM SET random_page_cost = '1.1';
ALTER SYSTEM SET effective_io_concurrency = 200;
-- 3. 启用自动清理
ALTER SYSTEM SET autovacuum = 'on';
ALTER SYSTEM SET log_autovacuum_min_duration = '0';
-- 4. 配置适当的日志记录
ALTER SYSTEM SET log_destination = 'stderr';
ALTER SYSTEM SET logging_collector = 'on';
ALTER SYSTEM SET log_directory = 'log';
ALTER SYSTEM SET log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log';
ALTER SYSTEM SET log_statement = 'error';
ALTER SYSTEM SET log_min_duration_statement = '1000'; -- 记录超过1秒的查询
监控和调整参数
-- 监控当前参数设置
SELECT
name,
setting,
unit,
short_desc
FROM pg_settings
WHERE name IN (
'shared_buffers',
'work_mem',
'maintenance_work_mem',
'effective_cache_size',
'max_connections',
'autovacuum'
)
ORDER BY name;
-- 检查参数是否需要调整
-- 1. 检查共享内存使用情况
SELECT
buffers_clean,
maxwritten_clean,
buffers_backend_fsync
FROM pg_stat_bgwriter;
-- 2. 检查连接使用情况
SELECT
max_conn,
used,
res_for_super,
max_conn - used - res_for_super AS res_for_normal
FROM (
SELECT
setting::int AS max_conn,
(SELECT count(*) FROM pg_stat_activity) AS used,
(SELECT setting::int FROM pg_settings WHERE name = 'superuser_reserved_connections') AS res_for_super
FROM pg_settings
WHERE name = 'max_connections'
) t;
-- 3. 检查WAL日志使用情况
SELECT
wal_records,
wal_fpi,
wal_bytes,
wal_buffers_full,
wal_write
FROM pg_stat_wal;
全局变量持久化最佳实践:
- 合理规划内存参数:根据系统总内存合理分配shared_buffers、work_mem等参数
- 使用ALTER SYSTEM:优先使用ALTER SYSTEM命令而不是直接编辑配置文件
- 定期重新加载配置:使用pg_reload_conf()函数重新加载配置,避免频繁重启服务器
- 监控参数效果:定期检查参数设置的效果,根据实际使用情况进行调整
- 备份配置文件:在修改配置文件前备份原始文件,便于恢复
- 测试环境验证:在生产环境修改重要参数前,先在测试环境中验证效果
- 文档化变更:记录所有重要的参数变更及其原因,便于后续维护