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




