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

openGauss之逻辑备份与恢复

原创 周波 云和恩墨 2022-06-30
1612

一、逻辑备份介绍

  通过逻辑导出对数据进行备份,逻辑备份只能基于备份时刻进行数据转储,所以恢复时也只能恢复到备份时保存的数据。对于故障点和备份点之间的数据,逻辑备份无能为力,逻辑备份适合备份那些很少变化的数据,当这些数据因误操作被损坏时,可以通过逻辑备份进行快速恢复。如果通过逻辑备份进行全库恢复,通常需要重建数据库,导入备份数据来完成,对于可用性要求很高的数据库,这种恢复时间太长,通常不被采用。由于逻辑备份具有平台无关性,所以更为常见的是,逻辑备份被作为一个数据迁移及移动的主要手段

二、备份与恢复功工具能简单介绍

  gs_dump:导出格式支持纯文本格式、自定义归档格式、目录归档格式、tar归档格式。支持导出指定数据库下指定的模式、表以及表上面的依赖对象等。

  gs_dumpall:导出penGauss数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据以及openGauss所有数据库公共的全局对象,仅支持纯文本格式,所以只能使用gsql进行恢复。

  gs_restore:gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可由gs_dump生成的非纯文本格式的导出文件进行导入。

三、实践操作

注意:openGauss拒接删除默认数据库postgres,无法删除当前连接的数据库,需要连接到其他数据库。

(0)环境准备:

[omm@OG1 ~]$ gsql -p 15400 -d postgres -r  #连接时加入-r选项,可以在gsql工具中上下翻命令和补全
#创建测试用的数据库
openGauss=# create database test with template template0;
CREATE DATABASE
#切换到test数据库
openGauss=# \c test
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "test" as user "omm".
#创建表并插入数据
test=# create table test_1(id int);
CREATE TABLE
test=# insert into test_1 values(1);
INSERT 0 1
test=# select * from test_1;
 id 
----
  1
(1 row)

(1)以纯文本格式备份导出test数据库全量信息

a,备份数据

查看了一下导出的数据文件,可以发现,在恢复时,如果待恢复的数据库对象在原库中存在,那么执行删除操作,然后重新创建。

[omm@OG1 ~]$ gs_dump -p 15400 -U jack -W Test@123 test -F plain -f /backup/test_bak.sql
gs_dump[port='15400'][test][2022-02-28 18:06:38]: The total objects number is 390.
gs_dump[port='15400'][test][2022-02-28 18:06:38]: [100.00%] 390 objects have been dumped.
gs_dump[port='15400'][test][2022-02-28 18:06:38]: dump database test successfully
gs_dump[port='15400'][test][2022-02-28 18:06:38]: total time: 1534  ms
[omm@OG1 ~]$ du -sh /backup/test_bak.sql
4.0K	/backup/test_bak.sql
# 导出文件大小为4k,内容是一序列的sql语句及注释
b,删除表

注意不能删除数据库,因为备份纯文本的sql脚本中并没有对数据库进行定义,所以无法通过备份的纯文本格式进行数据库的恢复,当然删除了也没事,在恢复之前重新创建数据库就可以了。

[omm@OG1 ~]$ gsql -p 15400 -d postgres -r
openGauss=# \c test;
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "test" as user "omm".
test=# drop table test_1;
DROP TABLE
c,通过gsql恢复数据

使用工具gsql进行恢复,也就是执行test_bak.sql这个脚本文件,使表恢复:

[omm@OG1 ~]$ gsql -d test -p 15400 -f /backup/test_bak.sql
SET
SET
SET
SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
REVOKE
REVOKE
GRANT
GRANT
total time: 10  ms
d,连接验证
[omm@OG1 ~]$ gsql -d test -p 15400 -r
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.

test=# \dt
                         List of relations
 Schema |  Name  | Type  | Owner |             Storage              
--------+--------+-------+-------+----------------------------------
 public | test_1 | table | omm   | {orientation=row,compression=no}
(1 row)

test=# select * from test_1;
 id 
----
  1
(1 row)
#可以发现删除的表test_1已经恢复到数据库test中

(2)以tar归档格式进行数据导出

a,备份
[omm@OG1 ~]$ gs_dump -p 15400 -f /backup/test_bak.tar test -F t
gs_dump[port='15400'][test][2022-03-01 18:07:02]: The total objects number is 390.
gs_dump[port='15400'][test][2022-03-01 18:07:02]: [100.00%] 390 objects have been dumped.
gs_dump[port='15400'][test][2022-03-01 18:07:02]: dump database test successfully
gs_dump[port='15400'][test][2022-03-01 18:07:02]: total time: 1175  ms
[omm@OG1 ~]$ ll -h /backup/test_bak.tar
-rw------- 1 omm dbgrp 6.5K Mar  1 18:07 /backup/test_bak.tar
b,删除数据
[omm@OG1 ~]$ gsql -d test -p 15400 -r 
test=# drop table test_1;
DROP TABLE
c,通过gsql恢复数据

尝试使用gsql恢复,执行的是tar包中的restore.sql脚本文件:

#使用vim查看tar文件,可以发现tar包里面有三个文件
[omm@OG1 ~]$ vim /backup/test_bak.tar 
" tar.vim version v29
" Browsing tarfile /backup/test_bak.tar
" Select a file with cursor and press ENTER

toc.dat
4568.dat
restore.sql
[omm@OG1 ~]$ tar -tf /backup/test_bak.tar   #当然使用这个命令也可以不解包查看
toc.dat
4568.dat
restore.sql
[omm@OG1 ~]$ gsql -d test -p 15400 -f /backup/test_bak.tar
[omm@OG1 ~]$ tar -xf /backup/test_bak.tar   #解包
[omm@OG1 ~]$ ll
total 12
-rw------- 1 omm dbgrp    8 Mar  1 18:07 4568.dat
-rw------- 1 omm dbgrp 1429 Mar  1 18:07 restore.sql
-rw------- 1 omm dbgrp 1639 Mar  1 18:07 toc.dat

执行如下命令进行恢复:
[omm@OG1 ~]$ gsql -d test -p 15400 -f restore.sql

在恢复的过程中会报错,登录验证可以发现表的定义已经恢复,但是数据切没有恢复。
这是因为,恢复时报如下错,无法加载某个数据文件:
gsql:/backup/test_bak.tar:71: ERROR:  could not open file "$$PATH$$/4568.dat" for reading: No such file or directory
查看了一下,4568.dat文件的内容,以及restore.sql中的部分内容:
#restore.sql中加载4568.tar数据文件的内容信息如下:
COPY test_1 (id) FROM stdin;
\.
COPY test_1 (id) FROM '$$PATH$$/4568.dat';

#4568.tar的内容如下
[omm@OG1 ~]$ cat 4568.dat 
1
\.
;

所以可能是因为使用gsql执行restore.sql文件时,无法正确的找到$$PATH$$/4568.dat的位置而无法进行数据的恢复,但是表定义是可以恢复的。
如果需要恢复数据,可以适当的修改一下restore.sql和4568.dat这两个文件:
#修改restore.sql文件,也就是将4568.dat文件改为绝对路径
vim restore.sql
 COPY test_1 (id) FROM stdin;
 62 \.
 63 COPY test_1 (id) FROM '/home/omm/4568.dat';
#修改4568.dat,文件,删除掉最后两行(也就是\.和;这两行),会影响到数据的插入
#注意该文件末尾不要有空行,否则会报错,且数据恢复失败

然后再次执行:gsql -d test -p 15400 -f restore.sql,就可以成功恢复。
d,通过gs_restore恢复数据
这时我们改用gs_restore进行tar归档格式的数据恢复:
[omm@OG1 ~]$ gs_restore /backup/test_bak.tar -p 15400 -d test
start restore operation ...
table test_1 complete data imported !
Finish reading 4 SQL statements!
end restore operation ...
restore operation successful
total time: 34  ms
#连接验证
test=> select * from test_1;
 id 
----
  1
   
(2 rows)
#很明显,针对tar归档格式的备份虽然可以使用gsql进行恢复,
但是使用gs_restore恢复更方便。

(3)以自定义归档格式导出数据(c|custom),导出test库下的test_1表

[omm@OG1 ~]$ gs_dump -p 15400 test -t test_1 -f /backup/table_test_1.dump -F c
gs_dump[port='15400'][test][2022-03-02 14:03:14]: The total objects number is 381.
gs_dump[port='15400'][test][2022-03-02 14:03:14]: [100.00%] 381 objects have been dumped.
gs_dump[port='15400'][test][2022-03-02 14:03:14]: dump database test successfully
gs_dump[port='15400'][test][2022-03-02 14:03:14]: total time: 1308  ms
#然后连接数据库,删除表
test=# drop table test_1;
DROP TABLE

#使用gs_restore进行恢复,可以不用指定-F选项,gs_restore会自动判断备份文件的格式
[omm@OG1 ~]$ gs_restore -p 15400 -d test /backup/table_test_1.dump 
start restore operation ...
table test_1 complete data imported !
Finish reading 4 SQL statements!
end restore operation ...
restore operation successful
total time: 15  ms

(4)以目录归档格式导出数据(d|directory)

[omm@OG1 ~]$ gs_dump -p 15400 test -t test_1 -f /backup/table_test_1 -F d
gs_dump[port='15400'][test][2022-03-02 14:11:17]: The total objects number is 381.
gs_dump[port='15400'][test][2022-03-02 14:11:17]: [100.00%] 381 objects have been dumped.
gs_dump[port='15400'][test][2022-03-02 14:11:17]: dump database test successfully
gs_dump[port='15400'][test][2022-03-02 14:11:17]: total time: 1173  ms
#如果指定的目录不存在,会创建目录,然后在其下面生成如下文件
[omm@OG1 ~]$ ll /backup/table_test_1
total 8
-rw------- 1 omm dbgrp  31 Mar  2 14:11 3748.dat.gz
-rw------- 1 omm dbgrp   0 Mar  2 14:11 dir.lock
-rw------- 1 omm dbgrp 757 Mar  2 14:11 toc.dat

#连接数据库,删除表test_1
test=# drop table test_1;
DROP TABLE

#恢复删除的数据
[omm@OG1 ~]$ gs_restore -d test -p 15400 /backup/table_test_1
start restore operation ...
table test_1 complete data imported !
Finish reading 4 SQL statements!
end restore operation ...
restore operation successful
total time: 16  ms

#连接数据库验证数据是否已经恢复
test=# select * from test_1;
 id 
----
  1
   
(2 rows)

(5)执行gs_dump,仅导出依赖于指定表test_2的视图信息。然后创建新的test_2表,再恢复依赖其上的视图。

a,创建表test_2的视图:
test=# create view test_2_v as select * from test_2 where id < 4;
CREATE VIEW
test=# select * from test_2_v;
 id | name 
----+------
  1 | XXX
  2 | XXX
  3 | haha
(3 rows)


b,仅备份依赖于表test_2的视图
gs_dump -p 15400 test -t public.test_1 --include-depend-objs --exclude-self -f /backup/test_2_v.sql -F p
[omm@OG1 ~]$ gs_dump -p 15400 test -t public.test_1 --include-depend-objs --exclude-
self -f /backup/test_2_v.sql -F p
gs_dump[port='15400'][test][2022-03-02 14:28:11]: The total objects number is 381.
gs_dump[port='15400'][test][2022-03-02 14:28:11]: [100.00%] 381 objects have been dumped.
gs_dump[port='15400'][test][2022-03-02 14:28:11]: dump database test successfully
gs_dump[port='15400'][test][2022-03-02 14:28:11]: total time: 1391  ms


c,删除视图
test=# drop view test_2_v;
DROP VIEW

d,恢复视图
[omm@OG1 ~]$ gsql -d test -p 15400 -f /backup/test_2_v.sql 

e,连接数据库,验证:
test=# \d+ test_2_v 
                       View "public.test_2_v"
 Column |         Type          | Modifiers | Storage  | Description 
--------+-----------------------+-----------+----------+-------------
 id     | integer               |           | plain    | 
 name   | character varying(15) |           | extended | 
View definition:
 SELECT  *
   FROM test_2
  WHERE test_2.id < 4;

备份恢复操作到此为止!

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

评论