1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG223-PG WAL与事务:日志记录与恢复

本文档风哥主要介绍PostgreSQL数据库的WAL(预写式日志)与事务的关系,包括WAL的原理、配置、恢复等内容,风哥教程参考PostgreSQL官方文档WAL内容,适合数据库管理员和开发者在学习和测试中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 PostgreSQL WAL与事务概念

WAL(Write-Ahead Logging)是PostgreSQL用于确保数据一致性和可靠性的关键机制。它将所有对数据库的修改先记录到WAL日志中,然后再写入数据文件,确保在系统崩溃时能够恢复到一致状态。

PostgreSQL WAL与事务的特点:

  • 预写式:先写日志,后写数据
  • 持久性:确保修改不会丢失
  • 一致性:确保数据库始终处于一致状态
  • 可恢复性:系统崩溃后可以恢复
  • 并发控制:支持多事务并发执行

1.2 PostgreSQL WAL与事务原理

PostgreSQL WAL与事务的工作原理:

  • 事务开始:创建事务ID,开始事务
  • WAL记录:将修改操作记录到WAL缓冲区
  • WAL写入:事务提交时,将WAL缓冲区写入WAL文件
  • 数据写入:后台进程将修改写入数据文件
  • 事务结束:事务提交或回滚

1.3 PostgreSQL WAL与事务优势

PostgreSQL WAL与事务的优势:

  • 数据一致性:确保数据库始终处于一致状态
  • 崩溃恢复:系统崩溃后可以恢复到一致状态
  • 性能优化:减少磁盘I/O,提高性能
  • 复制支持:支持流复制和逻辑复制
  • 归档支持:支持WAL归档,实现PITR
风哥提示:了解PostgreSQL的WAL与事务机制,有助于理解数据库的可靠性和一致性保障,为系统运维和故障恢复提供基础。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 PostgreSQL WAL与事务配置

PostgreSQL WAL与事务配置建议:

# 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缓冲区优化
– 合理设置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归档的执行情况
  • 事务:监控事务的执行情况
  • 恢复:监控恢复过程
风哥教程针对风哥教程针对风哥教程针对生产环境建议:建立完善的WAL与事务监控体系,及时发现和解决问题。定期分析WAL使用情况,优化WAL配置。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 PostgreSQL WAL与事务实施

3.1.1 WAL配置实施

# 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)

# 点-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归档配置

# 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

风哥提示:WAL归档是实现PITR(点-in-时间恢复)的关键,通过配置WAL归档,可以在数据库发生故障时恢复到任意时间点。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 PostgreSQL WAL与事务实战案例

4.1.1 WAL性能优化案例

# 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信息

# 使用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与事务常见问题及解决方法:

# 常见问题1: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归档

风哥教程针对风哥教程针对风哥教程针对生产环境建议:定期监控WAL使用情况,及时发现和解决WAL相关问题。建立WAL管理预案,确保系统的稳定运行。from PostgreSQL视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 PostgreSQL WAL与事务最佳实践

PostgreSQL WAL与事务最佳实践:

  • 合理配置WAL参数:根据硬件资源和业务需求调整WAL参数
  • 启用WAL归档:实现PITR,提高数据安全性
  • 使用SSD存储:提高WAL写入性能
  • 分离WAL文件:将WAL文件和数据文件分离到不同磁盘
  • 监控WAL使用:定期监控WAL使用情况
  • 优化检查点:调整检查点参数,避免性能波动
  • 批量提交事务:减少WAL写入次数
  • 定期清理归档:避免归档文件占用过多空间
风哥提示:WAL是PostgreSQL确保数据一致性和可靠性的关键机制,合理配置和管理WAL,可以提高系统性能和数据安全性。建议根据实际需求,制定适合的WAL管理策略。

5.2 PostgreSQL WAL与事务检查清单

# 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:检查点统计信息
持续改进:WAL与事务管理是一个持续优化的过程,建议定期评估WAL使用情况,根据业务需求和系统负载,不断调整和优化WAL配置。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息