PostgreSQL事务日志的核心作用
- 数据恢复:在系统崩溃、硬件故障或其他意外情况发生后,PostgreSQL可以利用事务日志(Write - Ahead Log,WAL)将数据库恢复到故障发生前的状态。通过重放日志记录,数据库能重建故障时未完成的事务,确保数据一致性。
- 崩溃恢复:当数据库服务器崩溃后重新启动时,它会扫描事务日志,回滚未提交的事务,并重新应用已提交但尚未完全写入数据文件的事务,保证数据库处于一致状态。
- 流复制:事务日志是实现PostgreSQL流复制的关键。主服务器将事务日志发送给从服务器,从服务器通过应用这些日志来保持与主服务器数据的同步,从而实现数据的高可用性和灾难恢复。
事务日志备份的常用方法
- pg_basebackup:
- 功能:这是一个用于创建数据库基础备份的工具,同时它能捕获备份期间生成的事务日志,生成一个可以用于恢复的完整备份集。
- 示例:
pg_basebackup -h <主机名> -p <端口号> -U <用户名> -D <备份目录> -Ft -P
,其中-Ft
表示以tar格式输出,-P
表示显示进度。
- pg_start_backup() 和 pg_stop_backup():
- 功能:在开始备份时,调用
pg_start_backup()
函数,该函数会将当前的事务日志位置记录下来,并允许备份工具安全地复制数据文件。备份完成后,调用pg_stop_backup()
函数,它会生成一个归档点,确保备份的事务日志是完整的。
- 示例:
-- 开始备份
SELECT pg_start_backup('备份描述');
-- 执行数据文件备份
-- 结束备份
SELECT pg_stop_backup();
- 使用pg_dump和pg_restore:
- 功能:
pg_dump
可以用于导出数据库对象和数据,它不会直接处理事务日志,但结合事务日志备份,可以用于恢复数据库到某个时间点。pg_restore
用于将pg_dump
生成的备份文件恢复到数据库中。
- 示例:
pg_dump -h <主机名> -p <端口号> -U <用户名> -Fp <数据库名> > backup.sql
(导出),pg_restore -h <主机名> -p <端口号> -U <用户名> -d <数据库名> backup.sql
(恢复) 。同时,还需要结合事务日志备份来实现更精确的恢复。
- 基于文件系统快照:
- 功能:一些存储系统提供创建文件系统快照的功能。在创建快照前,通过调用
pg_start_backup()
函数准备数据库。创建快照后,调用pg_stop_backup()
函数。之后可以从快照恢复数据,并使用事务日志将数据库恢复到最新状态。
- 示例:在支持快照的文件系统(如ZFS)上,先执行
pg_start_backup()
,然后创建ZFS快照(如zfs snapshot tank/pgdata@snapshot1
),最后执行pg_stop_backup()
。