Postgresql 基于时间点恢复

linux服务器时间改为24小时制

 vi /etc/profile
在最后一行加上:export LC_TIME=POSIX
source /etc/profile
执行date,此时变为了24小时制,断开终端重新连接,依然为24小时制
 

编辑修改postgresql.conf

#日志级别
wal_level = replica

1.简谈PostgreSQL的wal_level=logic
https://blog.csdn.net/Auspicious_air/article/details/134776155

2.postgresql中wal_level的三个参数用法说明
https://www.jb51.net/article/203220.htm

#归档模式
archive_mode = on

archive_mode参数有3种模式:
off:关闭归档
on:开启归档,但不允许在recovery模式下进行归档
always:开启归档,且允许在recovery模式下进行归档

#归档wal命令
archive_command = 'cp %p /postgres_archive_data/archive_data/%f && echo %p >> /postgres_archive_data/archive_log/archive.list && echo %f >> /postgres_archive_data/archive_log/archive.list'

pg会启动一个辅助进程,作用是实时监控事务日志,发现能归档的日志则会通过用户设置的archive_command参数中的命令进行归档。归档命令可以很自由地被指定,一般是cp或者加上压缩命令,如果设置该参数,或者命令有错误,则无法真正归档。

%p:源文件路径
%f:源文件名
 

archive_timeout参数
       如果只在日志切换时归档,假如在日志段未满时宕机,则归档日志会缺失一部分,可能造成数据丢失。另外,如果业务写请求较少,日志可能长期不归档。此时,可以通过archive_timeout参数设置超时强制归档,提高归档频率。

       取值范围 0 到 1073741823

       注意,每次日志切换时,即使未写满日志大小依然是16M,因此该参数如果设置太小,可能导致归档过于频繁并且大量浪费空间。
理解:归档文件最小值就是16M,不设置archive_timeout参数,写满16M以上时,才会生成归档文件,如果数据操作少的话,设置了此参数,就会在超过这个时间就生成归档文件,并且归档文件最小是16M.

一文总结postgresql wal日志参数、归档、清理及常用命令 - 墨天轮

#WAL日志占用空间大小

#PostgreSQL13版本后,wal_keep_segments参数废弃了,由wal_keep_size替代此参数

wal_keep_segments
查看pg_wal目录下所能保留的过去日志文件段的最小数目,建议设置大于等于4096,防止全量备份完成之后由于源实例wal日志被移除导致需要重新备份。

说明

适用于PostgreSQL 10、11、12。
SHOW wal_keep_segments;

wal_keep_size

查看pg_wal目录下所能保留的过去日志文件段的最小大小,建议设置大于等于64 GB,防止全量备份完成之后由于源实例wal日志被移除导致需要重新备份。

说明
适用于PostgreSQL 13、14和15。
SHOW wal_keep_size;

wal_keep_size = 2048

重启postgresql

查看归档目录
ls /postgres_archive_data/archive_data/

如果目录中没有文件,执行以下sql后再查看

-- 手动切WAL日志
SELECT pg_switch_wal();
 

-----------------------------------------------------------

http://www.postgres.cn/docs/12/app-pgbasebackup.html

进行数据库备份.

pg_basebackup -Ft -Pv -Xs -z -D <backupdir> -Z5 -h '<hostname>' -p <port> -U <username> -W

backupdir

导出的备份文件路径。系统会自动创建目录,但是如果该目录已经存在且不为空,则会报错。

hostname

RDS PostgreSQL实例连接地址。

如果相同账号内的ECS实例和RDS实例处于相同地域,且网络类型相同(都为VPC时则必须处于同一个VPC),建议使用内网连接地址。

其他情形建议使用外网连接地址。

说明
通过外网连接地址访问RDS实例,需要实例已申请外网连接地址。详情请参见申请或释放外网地址。

port

RDS PostgreSQL实例端口。

username

RDS PostgreSQL实例账号名称。
 

-------------------------------------------------

数据恢复

停止当前数据库

sudo systemctl stop postgresql@16-main.service

备份就数据库目录

sudo su - postgres

mv /var/lib/postgresql/16/main /var/lib/postgresql/16/main_orig

mkdir -m 700 /var/lib/postgresql/16/main

cd /var/lib/postgresql/16/main

tar zxvf /postgres_archive/backup_20240123_150500/base.tar.gz

cd pg_wal

tar zxvf /postgres_archive/backup_20240123_150500/pg_wal.tar.gz

修改postgresql.conf

restore_command = 'if [ ! -f /postgres_archive/data/%f ]; then cp /var/lib/postgresql/16/main_orig/pg_wal/%f %p; else cp /postgres_archive/data/%f %p; fi'

恢复数据库到指定时间点:

修改postgresql.conf

recovery_target_time = '2024-04-23 15:30:00'

在/var/lib/postgresql/16/main 生成recovery.signal文件

touch recovery.signal

---------------------------

启动数据库

exit

sudo systemctl start postgresql@16-main.service

完整恢复,不设置时间的话,正常启动后,查看/var/lib/postgresql/16/main下没有recovery.signal文件了。

判断是否是只读

SELECT pg_is_in_recovery();

恢复后,如果数据库是只读库,执行以下sql

select pg_wal_replay_resume();

---------------------------------------------

https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%BA%8C%E5%8D%81%E5%85%AD%E7%AB%A0

sudo su - postgres

cd 16/main

touch recovery.signal

重启数据库

-----------------------

postgres实现任意时间点恢复(使用pg_basebackup) - 简书

sudo /usr/lib/postgresql/16/bin/pg_controldata /var/lib/postgresql/16/main |grep TimeLineID

PostgreSQL日志中的SQL记录时机 —— log_statement 和 log_min_duration_statement-CSDN博客

PostgreSQL 的审计日志_pgsql开启审计日志-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值