首页 > 其他分享 >openGauss 之 PITR 恢复

openGauss 之 PITR 恢复

时间:2023-04-13 20:32:24浏览次数:36  
标签:recovery 恢复 PITR omm pg test openGauss data target

openGauss 之 PITR 恢复

本文出处:https://www.modb.pro/db/426464

一、PITR 介绍

PITR(point-in-time recovery)及时恢复,是基于全量的物理备份数据文件和已归档的 wal 日志进行数据恢复,可以将数据恢复到备份归档之后的任意时间点。    仅支持恢复到物理备份数据之后的某一时间点,仅主节点可以进行 PITR,备机需要全量 build 达成与主机数据同步

二、PITR 恢复流程介绍

0)进行物理全备 1)将原来的 wal 日志做备份 2)将物理备份的文件替换目标数据库目录 3)在数据库数据目录下创建恢复命令文件 recovery.conf,指定数据库恢复的程度 4)启动数据库 5)连接数据库,查看是否恢复到预期的状态 6)若已经恢复到预期的状态,使用指令 pg_xlog_replay_resume()使主节点向外提供服务.

recovery.conf 文件中相关恢复参数说明: restore_command = ‘cp /mnt/server/archivedir/%f %p’ 这个 SHELL 命令是获取 WAL 文件系列中已归档的 WAL 文件。字符串中的任何一个%f 是用归档检索中的文件名替换, 并且%p 是用服务器上的复制目的地的路径名替换。

archive_cleanup_command = ‘pg_archivecleanup /mnt/server/archivedir %r’ 在每次重启时会执行这个 shell 命令。 archive_cleanup_command 为清理备库不需要的归档 WAL 文件提供一个机制。 任何一个%r 由包含最新可用重启点的文件名代替。这是最早的文件,因此必须保留以允许恢复能够重新启动,因此所有早于%r 的文件可以安全的移除。

recovery_target_name = ‘restore_point_1’ 此参数声明还原到一个使用 pg_create_restore_point()创建的还原点

recovery_target_time = ‘2020-01-01 12:00:00’ 此参数声明还原到一个指定时间戳。

recovery_target_xid = ‘3000’ 这个参数声明还原到一个事务 ID。

recovery_target_lsn = ‘0/0FFFFFF’ 这个参数声明还原到日志的指定 LSN 点。

recovery_target_inclusive = true 声明是否在指定恢复目标(true)之后停止,或在这(false)之前停止。改声明仅支持恢复目标为 recovery_target_time、recovery_target_xid 和 recovery_target_lsn 的配置。

三、实践操作

1.环境介绍:

集群为一主一备,PITR 恢复操作我只在主节点上进行,此时主备都还在运行。 主库基本信息: 数据目录:/data/og1 系统日志:/var/log/omm/omm/pg_log/dn_6001/ xlog 备份目录:/backup_xlog 物理备份目录:/backup IP:10.0.0.100(外网),192.168.1.100(内网)

2.操作流程:

(1)使用 gs_basebackup 进行物理全备
[omm@OG1 ~]$ gs_basebackup -D /backup/ -p 15400 -X stream -F plain
(2)登录数据库进行如下一系列操作操作:
[omm@OG1 ~]$ gsql -d test -p 15400 -r
#test_2最开始的信息
test=# select * from test_2;
 id |  name
----+--------
  1 | XXX
  2 | XXX
  3 | haha
  4 | Zhang
  5 | Hua
  6 | AAA
  7 | heihei
  8 | Get
(8 rows)
#插入数据之后创建还原点restore_point_0,(测试参数recovery_target_name)
test=# insert into test_2 values(9,'BBB');
INSERT 0 1
test=# select pg_create_restore_point('restore_point_0');
 pg_create_restore_point
-------------------------
 0/52000410
(1 row)

#操作完之后记得切换到下一个事务日志
test=# select pg_switch_xlog();
 pg_switch_xlog
----------------
 0/52000940
(1 row)

#再次插入数据,记录插入之后的xid,(测试参数:recovery_target_xid)
test=# insert into test_2 values(10,'CCC');
INSERT 0 1
test=# select pg_switch_xlog();
 pg_switch_xlog
----------------
 0/530003C0
(1 row)

test=# \x
Expanded display is on.
test=# select * from pg_get_variable_info();
-[ RECORD 1 ]------------+-------------
node_name                | dn_6001_6002
next_oid                 | 33082
next_xid                 | 216185
oldest_xid               | 13006
xid_vac_limit            | 4000013006
oldest_xid_db            | 15354
last_extend_csn_logpage  | 223
start_extend_csn_logpage | 0
next_commit_seqno        | 2310
latest_completed_xid     | 216184
startup_max_xid          | 216182

test=# \x
Expanded display is off.

#再次插入数据,并记录插入数据之后的lsn,(测试参数recovery_target_lsn)
test=# insert into test_2 values (11,'DDD');
INSERT 0 1
test=# select pg_current_xlog_location();
 pg_current_xlog_location
--------------------------
 0/540004C0
(1 row)
(3)关闭数据库
[omm@OG1 ~]$ gs_om -t stop  #随便把备库也给关掉
(4)开始 PITR 恢复:
a,通过 recovery_target_name 参数恢复数据
#先备份xlog日志
[omm@OG1 ~]$ cp -a /data/og1/pg_xlog/* /backup_xlog/
#清空数据目录中的内容
[omm@OG1 ~]$ rm -rf /data/og1/*
#拷贝物理全备的文件到数据目录中
[omm@OG1 ~]$ cp -a /backup/* /data/og1/
[omm@OG1 ~]$ cd /data/og1
[omm@OG1 /data/og1]$ vim recovery.conf
#归档恢复设置
restore_command='cp /backup_xlog/%f %p'

#恢复目标设置
recovery_target_name='restore_point_0'
recovery_target_inclusive=true

#启动数据库检验:
[omm@OG1 /data/og1]$ gs_ctl start -D /data/og1
[omm@OG1 /data/og1]$ gsql -d test -p 15400 -r
test=# select * from test_2;
 id |  name
----+--------
  1 | XXX
  2 | XXX
  3 | haha
  4 | Zhang
  5 | Hua
  6 | AAA
  7 | heihei
  8 | Get
  9 | BBB
(9 rows)

test=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)
#可以发现数据已经恢复到restore_point_0这个还原点,此时插入了数据'BBB',
#查看日志发现,还原点确实应用到了。
[omm@OG1 /data/og1]$ grep -C 3 restore_point_0 /var/log/omm/omm/pg_log/dn_6001/postg
resql-2022-03-04_102311.log
2022-03-04 10:23:11.977 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 DB010  0 [BACKEND] LOG:  StartupXLOG: biggest_lsn_in_page is set to FFFFFFFF/FFFFFFFF, enable_update_max_page_flush_lsn:0
2022-03-04 10:23:11.977 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [BACKEND] LOG:  database system timeline: 33
2022-03-04 10:23:11.977 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [BACKEND] LOG:  database system was interrupted; last known up at 2022-03-02 18:43:46 CST
2022-03-04 10:23:11.979 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [BACKEND] LOG:  starting point-in-time recovery to "restore_point_0"
2022-03-04 10:23:11.980 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [BACKEND] LOG:  request archive recovery due to backup label file
2022-03-04 10:23:12.008 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [BACKEND] LOG:  restored log file "000000010000000000000051" from archive
2022-03-04 10:23:12.023 6221780f.6125 [unknown] 140043955402496 dn_6001 0 dn_6001_6002 00000  0 [DBL_WRT] LOG:  Double write initializing after build

#查看数据目录,会发现在数据目录下生成一个文件recovery.done
b,使用 recovery_target_xid 进行恢复
关闭数据库后
[omm@OG1 ~]$ vim /data/og1/recovery.conf
#归档恢复设置
restore_command='cp /backup_xlog/%f %p'

#恢复目标设置
recovery_target_xid = '216184'
recovery_target_inclusive=true

#启动数据库检验:
[omm@OG1 ~]$ gsql -d test -p 15400 -r
test=# select * from test_2;
 id |  name
----+--------
  1 | XXX
  2 | XXX
  3 | haha
  4 | Zhang
  5 | Hua
  6 | AAA
  7 | heihei
  8 | Get
  9 | BBB
 10 | CCC
(10 rows)

test=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)
c,使用 recovery_target_lsn 进行恢复
关闭数据库之后
[omm@OG1 ~]$ vim /data/og1/recovery.conf
#归档恢复设置
restore_command='cp /backup_xlog/%f %p'

#恢复目标设置
recovery_target_lsn = '0/540004C0'
recovery_target_inclusive=true
[omm@OG1 ~]$ gs_ctl start -D /data/og1
[omm@OG1 ~]$ gsql -d test -p 15400 -r
test=# select * from test_2;
 id |  name
----+--------
  1 | XXX
  2 | XXX
  3 | haha
  4 | Zhang
  5 | Hua
  6 | AAA
  7 | heihei
  8 | Get
  9 | BBB
 10 | CCC
 11 | DDD
(11 rows)

test=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 f
(1 row)
(5)恢复完成之后,使主节点向外提供服务
#发现数据恢复到了最新之后,数据库就不会处于恢复状态,可以进行正常的读写
#如果数据库处于恢复状态,想让它向外提供服务的话,可以执行如下命令
test=# select pg_xlog_replay_resume();
ERROR:  recovery is not in progress
HINT:  Recovery control functions can only be executed during recovery.
CONTEXT:  referenced column: pg_xlog_replay_resume
#因为当前不处于恢复状态,所以报错

恢复完成之后:数据目录中的recovery.conf文件就会被自动删除,只剩下recovery.done:
[omm@OG1 /data/og1]$ cat recovery.done
#归档恢复设置
restore_command='cp /backup_xlog/%f %p'

#恢复目标设置
recovery_target_lsn = '0/540004C0'
recovery_target_inclusive=true
(6)恢复备库
方法一:

1)备份备库相关配置文件:

[omm@OG2 ~]$ mkdir OG2_conf
[omm@OG2 ~]$ cp -a /data/og2/*.conf OG2_conf/
[omm@OG2 ~]$ ll OG2_conf/
total 64
-rw------- 1 omm dbgrp 20218 Mar  2 18:44 mot.conf
-rw------- 1 omm dbgrp  4824 Mar  2 18:44 pg_hba.conf
-rw------- 1 omm dbgrp  1636 Mar  2 18:44 pg_ident.conf
-rw------- 1 omm dbgrp 31999 Mar  2 18:44 postgresql.conf

2)清空 OG2 数据目录,然后将 OG1 数据目录中的内容拷贝过来:

[omm@OG2 ~]$ rm -rf /data/og2/* [omm@OG2 ~]$ rsync -avz 10.0.0.100:/data/og1/* /data/og2

3)将备份的配置文件覆盖掉拷贝过来的配置文件

[omm@OG2 ~]$ cp OG2_conf/* /data/og2/

4)启动主备集群,检查主备状态

[omm@OG2 ~]$ gs_om -t start
[omm@OG2 ~]$ gs_om -t status --detail
[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
current_az      : AZ_ALL

[  Datanode State   ]

    nodenode_ip         port      instance          state
------------------------------------------------------------------------
1  OG1 192.168.1.100   15400      6001 /data/og1   P Primary Normal
2  OG2 192.168.1.101   15400      6002 /data/og2   S Standby Normal
#主备正常,连接数据库之后,查看数据也是正常的。
方法二:

(1)启动主库

gs_ctl start -D /data/og1 -M primary

(2)在备库主机上执行命令,全量 build 主备关系

gs_ctl build -D /data/og2 -b full -M standby

(3)查看主备状态

OG1: gs_ctl query -D /data/og1 OG2: gs_ctl query -D /data/og2 #经查看可以发现,主备关系恢复正常。

恢复操作到此结束。

附:

openGauss 提供了很多系统函数供我们使用,方便我们管理和查看数据库相关信息,单这些函数名又有些长,记住这些函数名,显然是一个难题,但是如果我们记得函数名中的几个关键字,这里以 pg_xlog_replay_resume 为例,假如我模糊记得这个函数中有个 resume 关键字,那么我们可以通过如下方法找出我们想要的函数:

方法一:通过系统表pg_proc进行查找
openGauss=# select proname from pg_proc where proname like '%resume%';
        proname
-----------------------
 pg_resume_bkp_flag
 pg_xlog_replay_resume
(2 rows)

方法二:通过gsql提供的元命令进行查找
openGauss=# \dfS *resume*
                                                                                                       List of functions
   Schema   |         Name          | Result data type |                                                    Argument data types
                                          |  Type  | fencedmode | propackage | prokind
------------+-----------------------+------------------+---------------------------------------------------------------------------------
------------------------------------------+--------+------------+------------+---------
 pg_catalog | pg_resume_bkp_flag    | record           | slot_name name, OUT start_backup_flag boolean, OUT to_delay boolean, OUT ddl_del
ay_recycle_ptr text, OUT rewind_time text | normal | f          | f          | f
 pg_catalog | pg_xlog_replay_resume | void             |
                                          | normal | f          | f          | f
(2 rows)

标签:recovery,恢复,PITR,omm,pg,test,openGauss,data,target
From: https://blog.51cto.com/u_16039328/6188362

相关文章

  • 手工安装部署 openGauss3.0 一主一备(非 om 工具安装)
    手工安装部署openGauss3.0一主一备(非om工具安装)本文出处:https://www.modb.pro/db/425385一、操作系统配置(centos7.6)1.关闭防火墙systemctlstopfirewalldsystemctldisablefirewalld2.关闭selinux服务setenforce0vim/etc/selinux/configSELINUX=disabled3.关闭透明......
  • pdb做不完全恢复
    1.数据库全备份run{allocatechannelch1devicetypedisk;allocatechannelch2devicetypedisk;allocatechannelch3devicetypedisk;backupascompressedbackupsetfullfilesperset10databaseformat'/u01/rmanbak/fullbk_%d_%s_%u_%T.bak';sql&#......
  • mysql主从故障恢复
    之前遇到过一次Slave_SQL_Running:no的情况,解决方法请参考:https://www.cnblogs.com/sxFu/p/16022876.html而这次遇到的故障为:Slave_IO_Running:no一方面原因是因为网络通信的问题也有可能是日志读取错误的问题 再看错误信息可以判断为日志读取错误的问题 解决办法1、......
  • git如何恢复已删除存储库中的文件
    果您在Git存储库中意外地删除了某个文件,可以使用Git来恢复已删除的文件。以下是使用Git恢复已删除文件的步骤:使用gitlog命令查看Git存储库的提交历史记录,找到包含要恢复的文件的提交。可以使用以下命令查看某个文件的历史记录:gitlog--<file-path>其中......
  • openGauss Datakit安装部署
    一、问题描述:目前找不到任何关于opengauussDatakit安装部署的文档,自己来尝试踩坑。DataKit是一个以资源(物理机,数据库)为底座的开发运维工具,将上层的开发运维工具插件化,各插件之间相互独立,方便用户按需引入。各插件围绕DataKit的资源中心进行扩展开,完成数据库的运维,监控,迁移,开发,建......
  • pdb备份和恢复
     1.备份单个pdbrun{allocatechannelch1devicetypedisk;allocatechannelch2devicetypedisk;allocatechannelch3devicetypedisk;backupascompressedbackupsetfullfilesperset10pluggabledatabasepdb1format'/u01/rmanbak/pdbbak/pdb1_fullbk......
  • 【服务器数据恢复】 重装系统导致EMC存储xfs文件系统分区丢失的数据恢复案例
    服务器数据恢复环境:EMC某型号存储,20块磁盘组建raid5磁盘阵列,划分2个lun。服务器故障:管理员执行重装系统操作后发现分区发生改变,原先的sdc3分区丢失,该分区采用xfs文件系统,存储了公司重要业务信息,急需恢复该分区数据。服务器数据恢复过程:1、将故障存储中所有磁盘编号后取出,将所......
  • opengauss
    环境运行centos7,dockerdocker好久没用了,在操作边学习的道路上,docker大致思路,就是人家开发人员应对版本问题,比如有些要在win7下面的环境,而现在普遍win10/11,不可能环境都能一样,所以由此开发docker容器技术,当然如果硬件不在考虑的范畴centos为什么大多数都是在linux环境下运......
  • 基于FastICA算法的混合信号解混合信号恢复仿真
    1.算法描述       独立成分分析(IndependentComponentAnalysis,ICA)是近年来提出的非常有效的数据分析工具,它主要用来从混合数据中提取出原始的独立信号。它作为信号分离的一种有效方法而受到广泛的关注。近几年出现了一种快速ICA算法(FastICA),该算法是基于定点递推算法......
  • openGauss索引优化以及虚拟索引
    一、索引推荐1、测试数据导入gsql-ddatabase_test-p26000-Ujoe-WMysql@123456-rCREATETABLEtab_ysl_1(col1int,col2int,col3text);INSERTINTOtab_ysl_1VALUES(generate_series(1,3000),generate_series(1,3000),repeat(chr(int4(random()*26)+65),4));AN......