是的,频繁读写的 PostgreSQL 数据库绝对需要定期维护。这是保证数据库长期稳定运行、维持高性能和避免数据损坏的关键措施。
-- 常规VACUUM(推荐每日执行)
VACUUM ANALYZE;
-- 针对特定表的VACUUM
VACUUM ANALYZE your_busiest_table;
-- 彻底的VACUUM(建议每周或每月)
VACUUM FULL VERBOSE;
-- 更新统计信息(查询优化器需要)
ANALYZE VERBOSE;
-- 针对特定表
ANALYZE VERBOSE your_busiest_table;
-- 重建碎片化严重的索引
REINDEX INDEX your_index_name;
REINDEX TABLE your_table_name;
-- 并发重建(PostgreSQL 12+)
REINDEX INDEX CONCURRENTLY your_index_name;
# 自动VACUUM通常足够,但可以补充
VACUUM ANALYZE;
# 更彻底的维护
VACUUM FULL ANALYZE;
CHECKPOINT;
# 全面维护
REINDEX DATABASE your_database;
VACUUM FULL VERBOSE;
ANALYZE VERBOSE;
# 针对频繁读写数据库的优化设置
autovacuum = on
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.05
autovacuum_vacuum_cost_delay = 10ms
autovacuum_vacuum_cost_limit = 1000
-- 安装pg_cron
CREATE EXTENSION pg_cron;
-- 每天凌晨3点执行VACUUM
SELECT cron.schedule('0 3 * * *', 'VACUUM ANALYZE');
-- 每周日凌晨2点执行维护
SELECT cron.schedule('0 2 * * 0', 'VACUUM FULL ANALYZE');
# 每天执行维护
0 2 * * * psql -d your_db -c "VACUUM ANALYZE"
# 每周执行全面维护
0 3 * * 0 psql -d your_db -c "VACUUM FULL ANALYZE; REINDEX DATABASE your_db"
-- 检查表膨胀情况
SELECT schemaname, tablename,
n_dead_tup, n_live_tup,
round(n_dead_tup::numeric/n_live_tup::numeric*100, 2) as dead_ratio
FROM pg_stat_user_tables
ORDER BY dead_ratio DESC;
-- 检查索引状态
SELECT schemaname, tablename, indexname,
idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes;
-- 查看autovacuum统计信息
SELECT relname, last_vacuum, last_autovacuum,
last_analyze, last_autoanalyze
FROM pg_stat_user_tables;
VERBOSE
选项查看详细情况-- 针对热点表增加维护频率
ALTER TABLE your_busy_table SET (
autovacuum_vacuum_scale_factor = 0.05,
autovacuum_analyze_scale_factor = 0.02
);
-- 监控长事务和锁
SELECT * FROM pg_locks WHERE granted = false;
SELECT * FROM pg_stat_activity WHERE state <> 'idle';
总结:对于频繁读写的 PostgreSQL 数据库,定期维护不是可选项,而是必需品。通过合理的维护计划,可以确保数据库的性能稳定性和数据完整性。
$ yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
# 安装服务端包
$ yum install postgresql10-server postgresql10
# 初始化数据库,设置自启动
$ /usr/pgsql-10/bin/postgresql-10-setup initdb
$ systemctl enable postgresql-10
$ systemctl start postgresql-10
# 设置防火墙规则
$ iptables -A INPUT -p tcp -m tcp --dport 5432 -j ACCEPT #开放Postgresql 5432端口
$ service iptables save # 保存防火墙规则
# 切换至用户
$ su - postgres
; ./10/data/postgres.conf
- #listen_address
+ listen_address
; ./10/data/pg_hba.conf
; 允许所有IPv4地址
+ host all all 0.0.0.0/0 scram-sha-256
$ psql -U postgres
-- 设置数据运行参数
ALTER SYSTEM SET listen_addresses = '*';
ALTER SYSTEM SET port = 5432;
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
-- 修改默认用户密码
ALTER USER postgres with encrypted password '你的密码';
-- 退出数据库
\q
-- 退出用户
exit
systemctl restart postgresql-10