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

opengauss数据库-PITR表空间级别恢复

原创 周琦放 2022-01-12
1711


当数据库崩溃或希望回退到数据库之前的某一状态时,openGauss的即时恢复功能(Point-In-Time Recovery,简称PITR)可以支持恢复到备份归档数据之后的任意时间点。常规恢复为全实例恢复,但是有时仅需要表空间级别的恢复,本案例演示表空间恢复方法。

 

前提条件

全库备份文件:base.tar.gz,16725.tar.gz,16726.tar.gz;

归档的wal日志文件,归档备份目录/ogarchive

新搭建的单机实例

全量数据准备

创建用户

create user zone identified by 'zhou0815FANG';

创建表空间

CREATE TABLESPACE tb1  LOCATION '/home/omm/og_tb1';

CREATE TABLESPACE tb3  LOCATION '/home/omm/og_tb3';

 

创建数据库

 

create database db1 owner zone tablespace tb1;

create database db3 owner zone tablespace tb3;

 

连接db1 创建schema,表和数据

gsql -d db1 -p 26000 -Uzone

create schema sch1 ;

create table sch1.test1(id int);

insert into sch1.test1  select generate_series(1,500000);  

db1=> insert into sch1.test1  select generate_series(1,500000);  

INSERT 0 500000

db1=> insert into sch1.test1  select generate_series(1,500000);  

INSERT 0 500000

db1=> insert into sch1.test1  select generate_series(1,500000);  

INSERT 0 500000

db1=> insert into sch1.test1  select generate_series(1,500000);  

INSERT 0 500000

select count(*) from sch1.test1;     

db1=> select count(*) from sch1.test1;     

 count  

--------

 2000000

(1 row)

连接db3创建schema,表和数据

gsql -d db3 -p 26000 -Uzone

create schema sch3 ;

 

create table sch3.test3(id int);

insert into sch3.test3  select generate_series(1,500000);  

db3=> insert into sch3.test3  select generate_series(1,500000);  

INSERT 0 500000

select count(*) from sch3.test3;  

db3=> select count(*) from sch3.test3;   

 count  

--------

 500000

(1 row)

创建备份

[omm@ogpri ~]$ ./backup.sh

2022-01-11 11:37:17 LOG: Backup starting ###############################################

ALTER SYSTEM SET

2022-01-11 11:37:17 LOG: gs_basebackup starting(/home/omm/ogbackup/20220111)

INFO:  The starting position of the xlog copy of the full build is: 0/F56FAD8. The slot minimum LSN is: 0/F56FAD8.

[2022-01-11 11:37:18]:transaction log start point: 0/F56FAD8

[2022-01-11 11:37:18]:begin build tablespace list

[2022-01-11 11:37:18]:finish build tablespace list

495086/495086 kB (100%), 3/3 tablespaces                                    

[2022-01-11 11:37:40]:transaction log end point: 0/10000178

[2022-01-11 11:37:40]:gs_basebackup: fetching MOT checkpoint

gs_basebackup: no mot checkpoint exists

[2022-01-11 11:37:41]:gs_basebackup: base backup completed

[2022-01-11 11:37:41]:gs_basebackup: base backup successfully

2022-01-11 11:37:41 LOG: gs_basebackup completed

增量数据准备

再次插入数据,模拟备份完成以后,插入的数据是否能够恢复

[omm@ogsta ~]$ gsql -d db1 -p 26000 -Uzone

Password for user zone:

gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2021-09-30 14:29:04 commit 0 last mr  )

Non-SSL connection (SSL connection is recommended when requiring high-security)

Type "help" for help.

 

db1=> insert into sch1.test1  select generate_series(1,500000);  

INSERT 0 500000

db1=# select count(*) from sch1.test1;

  count  

---------

 2500000

(1 row)

 

db1=# \q

 

关闭数据库

openGauss=# checkpoint;    

CHECKPOINT

openGauss=# select pg_switch_xlog();

 

 pg_switch_xlog

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

 0/21644620

(1 row)

 

gs_ctl -D /opt/huawei/install/data/dn stop

恢复准备

以下操作均在新的实例中操作,操作用户为omm

 

在进行异机恢复时,需要创建一个新的单实例,把归档文件和数据备份文件都传送到新的实例下相同的目录中,如果目录不存在需要手动创建。本案例中把源端的归档文件放入到实例的/ogarchive目录中,数据备份文件放在/home/omm/recovery_base目录中

删除数据文件目录并新建

[omm@ogpri data]$ rm -rf dn

[omm@ogpri data]$ mkdir dn

[omm@ogpri data]$ ll

total 0

drwx------ 2 omm dbgrp 6 Jan 11 13:44 dn

[omm@ogpri data]$

基础备份恢复

[omm@ogpri ]$ cd /home/omm/recovery_base/

[omm@ogsta ]$ gunzip base.tar.gz

[omm@ogsta ]$ gs_tar -D /opt/huawei/install/data/dn  -F base.tar

表空间恢复

查看表空间映射。我们的目的是只恢复 og_tb1 表空间,og_tb3 表空间不管,因此需要对表空间所在的数据文件目录进行特殊处理。

[omm@ogpri dn]$  more /opt/huawei/install/data/dn/tablespace_map

16725 /home/omm/og_tb1

16726 /home/omm/og_tb3

删除表空间目录,并新建

[omm@ogpri ~]$ rm -rf og_tb1

[omm@ogpri ~]$ rm -rf og_tb3

[omm@ogpri ~]$ mkdir og_tb1

[omm@ogpri ~]$ mkdir og_tb3

 

清空数据文件目录中的pg_xlog pg_tblspc

[omm@ogpri ~]$ cd /opt/huawei/install/data/dn/

[omm@ogpri dn]$ rm -rf pg_xlog/

[omm@ogpri dn]$ rm -rf pg_tblspc/

[omm@ogpri dn]$ mkdir pg_xlog

[omm@ogpri dn]$ mkdir pg_tblspc

 

设置软连接,该软连接只针对需要恢复的表空间 即16725

[omm@ogpri dn]$ cd  pg_tblspc/

[omm@ogpri pg_tblspc]$ ln -s /home/omm/og_tb1 16725

 

解压表空间数据压缩文件,由于只恢复og_tb1,因此可以直接从备份目录16725.tar 文件进行恢复

[omm@ogpri ~]$ cd /home/omm/ogbackup/20220111/

[omm@ogpri 20220111]$ ls

16725.tar.gz  16726.tar.gz  backup.done  base.tar

[omm@ogpri 20220111]$ gunzip 16725.tar.gz

[omm@ogpri 20220111]$  gs_tar -D /home/omm/og_tb1 -F 16725.tar

 

复制pg_wal日志

[omm@ogsta pg_xlog]$ cp /ogarchive/*  /opt/huawei/install/data/dn/pg_xlog/

[omm@ogsta pg_xlog]$

 

修改配置文件

 

[omm@ogsta dn]$ vi recovery.conf

 

restore_command = 'cp /ogarchive/%f %p'

数据库启动

gs_ctl -D /opt/huawei/install/data/dn start

查看启动日志

该启动日志是由于数据备份的源段为集群,因此集群中存在主从节点的信息。在把数据恢复到单节点是,需要修改postgresql.conf 配置文件中的replconninfo1信息

2022-01-12 10:25:08.448 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  The heartbeat server has not been started.

2022-01-12 10:25:08.448 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  heartbeat thread shut down

2022-01-12 10:25:08.451 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  heartbeat thread started

2022-01-12 10:25:08.451 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  could not bind IPv4 socket: Is another instance already running on port 26005? If not, wait a few seconds and retry.

2022-01-12 10:25:08.451 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  could not create Ha listen socket for ReplConnInfoArr[1]"192.168.56.227:26005"

2022-01-12 10:25:08.451 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  The heartbeat server has not been started.

2022-01-12 10:25:08.451 [unknown] [unknown] localhost 139657809295104 0[0:0#0] 0 [BACKEND] LOG:  heartbeat thread shut down

 

数据验证

db1 数据恢复成功

[omm@ogtest dn]$ gsql -d postgres -p 26000

gsql ((openGauss 2.1.0 build 590b0f8e) compiled at 2021-09-30 14:29:04 commit 0 last mr  )

Non-SSL connection (SSL connection is recommended when requiring high-security)

Type "help" for help.

 

openGauss=# \c db1

Non-SSL connection (SSL connection is recommended when requiring high-security)

You are now connected to database "db1" as user "omm".

db1=# select count(*) from sch1.test1;

  count  

---------

 2500000

(1 row)

 

db1=# \c db3

FATAL:  database "db3" does not exist

DETAIL:  The database subdirectory "pg_tblspc/16726/PG_9.2_201611171_dn_6001_6002/16728" is missing.

Previous connection kept

db1=# \q

 

 

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

评论