暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql log

原创 Oracle 2022-12-25
516

log
WAL: write ahead log: 预写式日志,也被称为xlog
作用: 在修改数据前把修改操作记录到磁盘中,后续实际更新数据时不需要实时地把数据持久化到文件中了(可以在内存buffer里),这样如果突然down机,内存buffer里的还没刷新到磁盘中的实际数据就丢失了,重启后通过读取WAL日志重新执行一遍就好了,具体的还要看刷WAL有没有参数控制,如果WAL的刷盘也有缓冲区,那WAL也是有可能丢失的
WalWriter进程专门负责写WAL日志,保存在pg_xlog中,每个文件默认16M
会被循环使用,较早时间的WAL日志会被覆盖,所以PgArch(归档)进程会法则把WAL日志备份出来,增量备份就是备份的WAL日志
只有在启动数据库时,机器实时检查点(check_point)时才会清理log
启动startup进程时,自动清理当前时间线以前的XLOG文件,因为数据库启动需要recovery的数据是最后一次检查点之后的数据,之前的数据就认为没用了,所以可以清理(这是在不考虑归档和流复制的情况下)
数据库CRASH后,是从最后一次完成的检查点(不是时间线)开始恢复的,所以只需要那次检查点开始之后的XLOG即可
检查点的值可以通过pg_controldata $PGDATA 查到
Latest checkpoint location: 1/E000028
Prior checkpoint location: 1/D18C068
Latest checkpoint's REDO location: 1/E000028
Latest checkpoint's REDO WAL file: 00000001000000010000000E

表示00000001000000010000000E之前的xlog文件可以删除

数据的最大log量就是 max_wal_size/16MB + wal_keep_segments
log大于max_wal_size后会强行进行check_point,进行check_point时候会调用清理log进程
当日志量在[min_wal_size, max_wal_size] 时候check_point时间完全是checkpoint_timeout 时间确定 也叫 lazy check_point
日志不会少于min_wal_size 最少会保留这些循环使用
select * from pg_ls_waldir() order by name; 类似于 show binary logs
归档 archive_status目录下会有一个跟pg_wal目录里相同名字当时后缀是.ready或者.done的文件 这个文件称为归档日志
archive_mode=on 归档开关 archive_command=xxx 归档命令
比如你配置了archive_mode=on,但是没有配置archive_command,那么xlog文件会一直堆积(xlog写完后,会写.ready,但是由于没有配置archive_command,也就是说不会触发归档命令,所以一直都不会写.done) 这就是为什么日志备份需要备份后把文件改为.done
手动清理wal 要注意,检查是否有 select * from pg_replication_slots 消费log的地方,检查是否备份
pg_controldata $PGDATA 找到那个file之前的可以清理
pg_archivecleanup -d $PGDATA/pg_xlog 00000001000000010000000E 清理掉指定文件之前的log
pg_receivewal -h%s -p%s -U%s -D%s 从一个库向另一个库拉wal log
export PGPASSWORD=jFDx86dX;/u01/pgsql/bin/pg_receivewal -h192.168.4.155 -p5432 -Ureplicator -D /u01/pg5432 &
clog: commit log, 在pg_clog子目录中, 记录事务状态的log
事务状态
TRANSACTION_STATUS_IN_PROGRESS=0X00: 表示事务正在进行中
TRANSACTION_STATUS_COMMITTED=0X01: 表示事务已提交
TRANSACTION_STATUS_ABORTED=0X02: 表示事务已回滚
TRANSACTION_STATUS_SUB_COMMITTED=0X03: 表示子事务已提交
事务ID: xid,32位数字,从3开始,到最大后再从3循环
pg_receivewal
pg_receivexlog会扫描整个-D选项指定的目录,将扫描到的每个文件名,去掉其timeline部分,转换为64为整数。选取其中对应整数最大的文件,按如下方式选择开始下载的文件:如果这个文件是以.partial为后缀的,则重新下载此文件和后续文件;如果该文件不带.partial后缀,是一个完整的日志文件,则从此文件的下一个文件(文件名加1)开始下载
pg_receivexlog已经下载了我们需要的文件后,并不会自动停止,我们也没有办法指定它下载到哪个文件结束。唯一的办法是通过Ctl-C命令向它发送SIGINT信号来结束它。类似的,可以直接向它的进程发生kill命令
注意,pg_receivexlog只在成功传输完一个xlog文件后,才检查是否收到了SIGINT信号,因此你只可能在一个文件接收完成后正常结束pg_receivexlog运行。其实更暴力的办法是直接kill -9 也是可以的

原文链接:https://blog.csdn.net/zhangjikuan/article/details/88670871

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论