参考网站:
postgres官网备份PITR文档
Postgresql 连续归档和时间点恢复(PITR)
1、在k8s创建postgres数据库
[用于创建postgres的yaml文件下载()
需要修改70-statefulsets-postgres.yaml文件中的数据持久化方式,即
storageClassName: 'nfs-client' #这里的nfs-client修改为自己k8s的持久化设备,这里使用的是已经搭建好的nfs服务
启动postgres数据库:
wget xxxxxxx.xxxxxx #下载postgres数据库启动需要的yaml文件
kubectl create namespace postgres #创建一个名叫postgres的namespace
kubens postgres #进入这个namespace,kubens工具的作用是切换namespace需要去gitghub搜索kubectx工具,二进制安装即可使用
kubectl apply -f postgres/*.yaml #启动postgres数据库,所有动作在postgres这个namespace完成
在postgres文件的配置文件中要打开的内容:
vim postgresql.conf
wal_level='hot_standby' #wal_level至少设置为replica
archive_mode='on'
archive_command='test ! -f /backup/archivedir/%f && cp %p /backup/archivedir/%f'
查看postgres数据库是否启动完成:
lopes-MacBook-Pro:postgres-demo_wal2json lope$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-0 1/1 Running 0 38m
postgres在k8s启动成功。
2、数据准备
进入postgres操作
kubens postgres #进入postgres所在的namespace
kubectl exec -it postgres-0 sh #进入postgres命令
备份基础数据库文件
pg_basebackup -D /backup/backup -h postgres-0 -Fp -R -Pv -l postgrebackup-20191112 #此文件为恢复的基础文件
创建postgres日志备份目录
mkdir /backup/archivedir #以后postgres的日志会自动导入这个目录,也是PITR的关键
创建测试用表
psql #进入postgres数据库
\c sso #选择sso数据库
\d #查看该数据库下没有表
create table test01(id int primary key,name varchar(20));
insert into test01 values(1,'a'),(2,'b'),(3,'c');
select current_timestamp; # 2019-11-12 06:04:50.71881+00
select pg_switch_wal(); # 0/A000158
删除测试用表
delete from test01;
select current_timestamp; # 2019-11-12 06:07:36.529161+00
select pg_switch_wal(); # 0/C000000
3、数据恢复演示
修改/backup/backup/recovery.done文件(若是recovery.conf,则该为recovery.done)
vim recovery.done
restore_command='cp /backup/archivedir/%f %p'
recovery_target_time='2019-11-12 06:04:50.71881+00' # 这里的时间修改为想要恢复的时间点
recovery_target_timeline='latest'
基础数据文件恢复
mv /pgdata/postgres-0 /pgdata/postgres-0_bak #破坏原数据文件
cp -r /backup/backup /pgdata/postgres-0 #将备份文件拷贝为数据库文件
cd postgres-0
rm -rf pg_wal/0 && rm -rf pg_wal/archive_status/ #删除老日志文件,以便PITR通过日志恢复
重启postgres,使之自动进入恢复模式
kubectl delete pods postgres-0
kubectl get pods
重启成功后,即可进入数据库检查是否已经恢复到预定的数据。
kubectl exec -it postgres-0 sh
psql
\c sso
\d
select * from test01;
如果出现操作失误,导致不能进入postgres的pod,可以将该pod的pvc删除后,重启pod即可重新操作。
kubectl scale sts postgres --replicas=0 #先要关闭postgres才能删除pvc
lopes-MacBook-Pro:postgres-demo_wal2json lope$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
backup-postgres-0 Bound pvc-1be89954-98f9-4f9d-a15a-780d5432d38a 30Gi RWO nfs-client 122m
pgdata-postgres-0 Bound pvc-6f25fd78-282c-4604-a2f6-e9a8c767e002 30Gi RWO nfs-client 71m
lopes-MacBook-Pro:postgres-demo_wal2json lope$ kubectl delete pvc pgdata-postgres-0 #删除pgdata,backup不删除