PostgreSQL教程FG223-PG WAL与事务:日志记录与恢复
本文档风哥主要介绍PostgreSQL数据库的WAL(预写式日志)与事务的关系,包括WAL的原理、配置、恢复等内容,风哥教程参考PostgreSQL官方文档WAL内容,适合数据库管理员和开发者在学习和测试中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 PostgreSQL WAL与事务概念
WAL(Write-Ahead Logging)是PostgreSQL用于确保数据一致性和可靠性的关键机制。它将所有对数据库的修改先记录到WAL日志中,然后再写入数据文件,确保在系统崩溃时能够恢复到一致状态。
- 预写式:先写日志,后写数据
- 持久性:确保修改不会丢失
- 一致性:确保数据库始终处于一致状态
- 可恢复性:系统崩溃后可以恢复
- 并发控制:支持多事务并发执行
1.2 PostgreSQL WAL与事务原理
PostgreSQL WAL与事务的工作原理:
- 事务开始:创建事务ID,开始事务
- WAL记录:将修改操作记录到WAL缓冲区
- WAL写入:事务提交时,将WAL缓冲区写入WAL文件
- 数据写入:后台进程将修改写入数据文件
- 事务结束:事务提交或回滚
1.3 PostgreSQL WAL与事务优势
PostgreSQL WAL与事务的优势:
- 数据一致性:确保数据库始终处于一致状态
- 崩溃恢复:系统崩溃后可以恢复到一致状态
- 性能优化:减少磁盘I/O,提高性能
- 复制支持:支持流复制和逻辑复制
- 归档支持:支持WAL归档,实现PITR
Part02-生产环境规划与建议
2.1 PostgreSQL WAL与事务配置
PostgreSQL WAL与事务配置建议:
# WAL级别
wal_level = replica # 可选值:minimal, replica, logical
# WAL缓冲区
wal_buffers = 16MB # WAL缓冲区大小
# 检查点
checkpoint_timeout = 5min # 检查点超时
max_wal_size = 1GB # 最大WAL大小
min_wal_size = 80MB # 最小WAL大小
checkpoint_completion_target = 0.9 # 检查点完成目标
# WAL写入
wal_writer_delay = 200ms # WAL写入器延迟
wal_writer_flush_after = 1MB # WAL写入器刷新阈值
# WAL归档
archive_mode = on # 启用归档
archive_command = ‘cp %p /archive/%f’ # 归档命令
archive_timeout = 60 # 归档超时
# 示例:修改WAL配置
ALTER SYSTEM SET wal_level = ‘logical’;
ALTER SYSTEM SET wal_buffers = ’32MB’;
ALTER SYSTEM SET max_wal_size = ‘2GB’;
SELECT pg_reload_conf();
2.2 PostgreSQL WAL与事务性能优化
PostgreSQL WAL与事务性能优化建议:
# WAL缓冲区优化
– 合理设置wal_buffers大小
– 避免WAL缓冲区过小导致频繁写入
# 检查点优化
– 调整checkpoint_timeout和max_wal_size
– 避免检查点过于频繁
# 存储优化
– 使用SSD存储WAL文件
– 分离WAL文件和数据文件到不同磁盘
# 写入优化
– 调整wal_writer_delay和wal_writer_flush_after
– 批量提交事务
# 示例:WAL性能优化
ALTER SYSTEM SET wal_buffers = ’64MB’;
ALTER SYSTEM SET checkpoint_timeout = ’10min’;
ALTER SYSTEM SET max_wal_size = ‘4GB’;
ALTER SYSTEM SET checkpoint_completion_target = ‘0.9’;
SELECT pg_reload_conf();
2.3 PostgreSQL WAL与事务监控
PostgreSQL WAL与事务监控建议:
- WAL使用情况:监控WAL文件的使用情况
- 检查点:监控检查点的执行情况
- 归档:监控WAL归档的执行情况
- 事务:监控事务的执行情况
- 恢复:监控恢复过程
Part03-生产环境项目实施方案
3.1 PostgreSQL WAL与事务实施
3.1.1 WAL配置实施
# 步骤1:修改WAL配置
ALTER SYSTEM SET wal_level = ‘replica’;
ALTER SYSTEM SET wal_buffers = ’16MB’;
ALTER SYSTEM SET checkpoint_timeout = ‘5min’;
ALTER SYSTEM SET max_wal_size = ‘1GB’;
ALTER SYSTEM SET min_wal_size = ’80MB’;
ALTER SYSTEM SET checkpoint_completion_target = ‘0.9’;
SELECT pg_reload_conf();
# 步骤2:启用WAL归档
ALTER SYSTEM SET archive_mode = ‘on’;
ALTER SYSTEM SET archive_command = ‘cp %p /archive/%f’;
ALTER SYSTEM SET archive_timeout = ’60’;
SELECT pg_reload_conf();
# 步骤3:验证WAL配置
SHOW wal_level;
SHOW wal_buffers;
SHOW checkpoint_timeout;
SHOW max_wal_size;
SHOW archive_mode;
# 结果示例
wal_level
———–
replica
wal_buffers
————
16MB
checkpoint_timeout
——————
5min
max_wal_size
————
1GB
archive_mode
————
on
3.1.2 事务配置实施
# 步骤1:修改事务配置
ALTER SYSTEM SET default_transaction_isolation = ‘read committed’;
ALTER SYSTEM SET default_transaction_read_only = ‘off’;
ALTER SYSTEM SET default_transaction_deferrable = ‘off’;
SELECT pg_reload_conf();
# 步骤2:验证事务配置
SHOW default_transaction_isolation;
SHOW default_transaction_read_only;
SHOW default_transaction_deferrable;
# 结果示例
default_transaction_isolation
——————————-
read committed
default_transaction_read_only
——————————
off
default_transaction_deferrable
——————————-
off
# 步骤3:测试事务
BEGIN;
INSERT INTO fgedu_fgedus (fgeduname, email) VALUES (‘fgedu1’, ‘fgedu1@fgedu.net.cn’);
COMMIT;
# 查看WAL记录
SELECT pg_wal_lsn();
3.2 PostgreSQL WAL与事务恢复
3.2.1 崩溃恢复
# 步骤1:模拟崩溃
# 强制关闭PostgreSQL
kill -9 $(pgrep postgres)
# 步骤2:启动PostgreSQL
pg_ctl start -D /postgresql/fgdata
# 步骤3:查看恢复日志
# 查看PostgreSQL日志
cat /postgresql/fgdata/log/postgresql-*.log
# 恢复日志示例
2024-01-01 12:00:00 UTC [1234]: LOG: fgedudb system was interrupted; last known up at 2024-01-01 11:59:00 UTC
2024-01-01 12:00:00 UTC [1234]: LOG: fgedudb system was not properly shut down; automatic recovery in progress
2024-01-01 12:00:00 UTC [1234]: LOG: redo starts at 0/12345678
2024-01-01 12:00:00 UTC [1234]: LOG: invalid record length at 0/12345678: wanted 24, got 0
2024-01-01 12:00:00 UTC [1234]: LOG: redo done at 0/12345678
2024-01-01 12:00:00 UTC [1234]: LOG: fgedudb system is ready to accept connections
3.2.2 点-in-时间恢复(PITR)
# 步骤1:准备基础备份
pg_basebackup -D /backup/base -F tar -z -P
# 步骤2:创建恢复配置文件
cat > /postgresql/fgdata/recovery.conf << EOF
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2024-01-01 12:00:00 UTC'
EOF
# 步骤3:启动恢复
pg_ctl start -D /postgresql/fgdata
# 步骤4:查看恢复日志
cat /postgresql/fgdata/log/postgresql-*.log
# 恢复日志示例
2024-01-01 12:00:00 UTC [1234]: LOG: fgedudb system was interrupted; last known up at 2024-01-01 11:59:00 UTC
2024-01-01 12:00:00 UTC [1234]: LOG: starting point-in-time recovery to 2024-01-01 12:00:00 UTC
2024-01-01 12:00:00 UTC [1234]: LOG: redo starts at 0/12345678
2024-01-01 12:00:00 UTC [1234]: LOG: recovery stopping before commit of transaction 1234, time 2024-01-01 12:00:00 UTC
2024-01-01 12:00:00 UTC [1234]: LOG: recovery has paused
2024-01-01 12:00:00 UTC [1234]: HINT: Execute pg_wal_replay_resume() to continue.
3.3 PostgreSQL WAL与事务归档
3.3.1 WAL归档配置
# 步骤1:创建归档目录
mkdir -p /archive
chown pgsql: pgsql /archive
# 步骤2:修改归档配置
ALTER SYSTEM SET archive_mode = ‘on’;
ALTER SYSTEM SET archive_command = ‘cp %p /archive/%f’;
ALTER SYSTEM SET archive_timeout = ’60’;
SELECT pg_reload_conf();
# 步骤3:验证归档配置
SHOW archive_mode;
SHOW archive_command;
SHOW archive_timeout;
# 结果示例
archive_mode
————
on
archive_command
—————
cp %p /archive/%f
archive_timeout
—————
60
# 步骤4:测试归档
# 强制生成WAL文件
SELECT pg_switch_wal();
# 查看归档文件
ls -l /archive/
# 结果示例
-rw-r–r– 1 pgsql pgsql 16777216 Jan 1 12:00 000000010000000000000001
-rw-r–r– 1 pgsql pgsql 16777216 Jan 1 12:01 000000010000000000000002
Part04-生产案例与实战讲解
4.1 PostgreSQL WAL与事务实战案例
4.1.1 WAL性能优化案例
# 场景:高并发写入场景
# 优化前
– WAL缓冲区:8MB
– 检查点超时:5min
– 最大WAL大小:1GB
– 写入性能:1000 TPS
# 优化后
– WAL缓冲区:64MB
– 检查点超时:10min
– 最大WAL大小:4GB
– 写入性能:2000 TPS
# 优化步骤
1. 增加WAL缓冲区大小
2. 延长检查点超时
3. 增加最大WAL大小
4. 使用SSD存储WAL文件
5. 分离WAL文件和数据文件
# 示例:WAL性能优化配置
ALTER SYSTEM SET wal_buffers = ’64MB’;
ALTER SYSTEM SET checkpoint_timeout = ’10min’;
ALTER SYSTEM SET max_wal_size = ‘4GB’;
ALTER SYSTEM SET checkpoint_completion_target = ‘0.9’;
SELECT pg_reload_conf();
# 测试写入性能
pgbench -i -s 10 fgedudb
pgbench -c 10 -j 2 -T 60 fgedudb
# 结果示例
transaction type:
scaling factor: 10
query mode: simple
number of clients: 10
number of threads: 2
duration: 60 s
number of transactions actually processed: 120000
transaction rate: 2000.00 TPS
4.2 PostgreSQL WAL与事务工具使用
4.2.1 使用pg_wal查看WAL信息
# 查看WAL目录
ls -l /postgresql/fgdata/pg_wal/
# 查看当前WAL位置
SELECT pg_wal_lsn();
# 查看WAL统计信息
SELECT * FROM pg_stat_wal;
# 结果示例
-[ RECORD 1 ]——–+————————
wal_records | 1000000
wal_fpi | 1000
wal_bytes | 1677721600
wal_buffers_full | 0
wal_write | 10000
wal_sync | 1000
wal_write_time | 1000.000 ms
wal_sync_time | 100.000 ms
# 查看检查点信息
SELECT * FROM pg_stat_checkpointer;
# 结果示例
-[ RECORD 1 ]———+————————
checkpoints_timed | 10
checkpoints_req | 2
checkpoint_write_time | 1000.000 ms
checkpoint_sync_time | 100.000 ms
buffers_checkpoint | 10000
buffers_clean | 5000
maxwritten_clean | 0
buffers_backend | 1000
buffers_backend_fsync | 0
buffers_alloc | 50000
4.3 PostgreSQL WAL与事务常见问题
PostgreSQL WAL与事务常见问题及解决方法:
# 症状:WAL文件占用过多磁盘空间
# 解决方法
– 调整max_wal_size参数
– 启用WAL归档
– 定期清理归档的WAL文件
– 检查是否有长事务
# 常见问题2:WAL写入性能差
# 症状:写入性能下降
# 解决方法
– 增加wal_buffers
– 使用SSD存储WAL文件
– 分离WAL文件和数据文件
– 调整检查点参数
# 常见问题3:归档失败
# 症状:WAL归档失败
# 解决方法
– 检查archive_command配置
– 确保归档目录存在且可写
– 检查磁盘空间
– 查看归档日志
# 常见问题4:恢复失败
# 症状:系统崩溃后恢复失败
# 解决方法
– 检查WAL文件完整性
– 确保归档文件可用
– 查看恢复日志
– 考虑使用基础备份恢复
# 常见问题5:WAL日志增长过快
# 症状:WAL文件增长过快
# 解决方法
– 检查是否有长事务
– 优化批量操作
– 调整WAL配置参数
– 启用WAL归档
Part05-风哥经验总结与分享
5.1 PostgreSQL WAL与事务最佳实践
PostgreSQL WAL与事务最佳实践:
- 合理配置WAL参数:根据硬件资源和业务需求调整WAL参数
- 启用WAL归档:实现PITR,提高数据安全性
- 使用SSD存储:提高WAL写入性能
- 分离WAL文件:将WAL文件和数据文件分离到不同磁盘
- 监控WAL使用:定期监控WAL使用情况
- 优化检查点:调整检查点参数,避免性能波动
- 批量提交事务:减少WAL写入次数
- 定期清理归档:避免归档文件占用过多空间
5.2 PostgreSQL WAL与事务检查清单
– [ ] WAL级别是否合理
– [ ] WAL缓冲区是否足够
– [ ] 检查点参数是否优化
– [ ] WAL归档是否启用
– [ ] 归档目录是否可用
– [ ] WAL存储是否使用SSD
– [ ] WAL文件和数据文件是否分离
– [ ] WAL使用情况是否监控
– [ ] 长事务是否存在
– [ ] 归档文件是否定期清理
# WAL与事务维护清单
– [ ] 每日:监控WAL使用情况
– [ ] 每周:检查归档文件
– [ ] 每月:优化WAL配置
– [ ] 每季度:测试恢复流程
– [ ] 每年:评估WAL管理策略
– [ ] 定期:备份WAL归档
5.3 PostgreSQL WAL与事务工具推荐
PostgreSQL WAL与事务工具推荐:
- pg_basebackup:基础备份工具
- pg_waldump:WAL日志分析工具
- pg_archivecleanup:归档清理工具
- pg_receivewal:WAL接收工具
- pg_switch_wal:切换WAL文件
- pg_wal_replay_resume:恢复WAL回放
- pg_stat_wal:WAL统计信息
- pg_stat_checkpointer:检查点统计信息
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
