GaussDB数据库备份详解(三)

举报
Sailing_Crey 发表于 2025/10/15 17:42:06 2025/10/15
【摘要】 GaussDB数据库备份详解(三)本文将全面介绍GaussDB数据库的备份与恢复技术,帮助您制定合理的数据保护策略,确保业务数据安全可靠。 1 GaussDB备份恢复概述数据是企业的核心资产,定期备份是数据库管理的基础工作。GaussDB提供了多种备份恢复方案,涵盖逻辑备份与物理备份两大类,可满足不同业务场景下的数据保护需求。通过合理的备份策略,企业能够有效预防数据丢失、人为误操作、系统故...

GaussDB数据库备份详解(三)

本文将全面介绍GaussDB数据库的备份与恢复技术,帮助您制定合理的数据保护策略,确保业务数据安全可靠。

1 GaussDB备份恢复概述

数据是企业的核心资产,定期备份是数据库管理的基础工作。GaussDB提供了多种备份恢复方案,涵盖逻辑备份与物理备份两大类,可满足不同业务场景下的数据保护需求。通过合理的备份策略,企业能够有效预防数据丢失、人为误操作、系统故障等数据风险,确保业务连续性。

2 逻辑备份与恢复

逻辑备份是指将数据库中的逻辑数据(如表、视图等)导出为特定格式的文件,适用于数据迁移跨版本恢复部分数据恢复场景。

2.1 使用gs_dump进行备份

gs_dump是GaussDB提供的逻辑备份工具,可以对单个database进行备份,支持备份不同的schema结构或数据。

基本语法:

bash

gs_dump --file=备份文件路径 --schema=模式名 --no-privileges --no-owner --username=用户名 数据库名

示例演示:

bash

# 创建备份
gs_dump --file=mes_way1.sql --schema=public --no-privileges --no-owner --username=omm mes

# 文本格式备份(方便查看和修改)
gs_dump --file=mes_way1.sql --schema=public --no-privileges --no-owner --username=omm mes

# 二进制备份(效率更高)
gs_dump --file=mes_way3.dmp --format=c --schema=mes --no-subscriptions --username=mes mes2

section子项备份:
为了更精细地控制备份过程,可以使用section参数将备份分为三个阶段:

bash

# 1. 数据备份前结构预处理
gs_dump --file=mes_way2_pre.sql --section=pre-data --schema=mes --no-subscriptions --username=mes mes2

# 2. 数据备份
gs_dump --file=mes_way2_data.sql --section=data --schema=mes --no-subscriptions --username=mes mes2

# 3. 数据备份后逻辑处理
gs_dump --file=mes_way2_post.sql --section=post-data --schema=mes --no-subscriptions --username=mes mes2

2.2 使用gs_dump进行恢复

文本格式恢复:

bash

gsql --file=mes_way1.sql --username=omm mes2

二进制格式恢复:

bash

gs_restore --username=mes -d mes3 mes_way3.dmp

section子项恢复:

bash

# 按顺序执行三个阶段的恢复
gsql --file=mes_way2_pre.sql --username=mes mes3
gsql --file=mes_way2_data.sql --username=mes mes3
gsql --file=mes_way2_post.sql --username=mes mes3

3 物理备份与恢复

物理备份直接拷贝数据库文件,恢复时更快速,适用于大数据量场景。

1、数据库对象管理及SQL应用1

-- 基于以下学生成绩表,完成以下实验要求。
-- 创建表
create table su(id int primary key not null,firstname varchar(50) not null,familyname varchar(50) not null,shorterform varchar(50) not null,mask char(1) not null,score int not null)distribute by replication;
-- 导入数据
insert into su values(1,'secebbie','peter','peter','S',86),(2,'tom','jerry','tom','H',63),(3,'amanda','lee','lee','H',67),(4,'homas','brooke','homas','H',67),(5,'elizabeth','katharine','elizabeth','H',67);

(1)请查询姓名和姓氏,以姓名·姓氏的格式输出,要求首字母大写,姓名和姓氏直接使用”·”拼接

select initcap(firstnaem||'·'||familyname) from su;
-- 或
select initcap(concat(firstname, '·',familyname)) from su;

(2)插入一条新数据(1,‘tom’,‘jerry’,‘tom’,‘H’,63),当出现主键冲突时,将mask改为’F’

insert into su values(1,’tom’,’jerry’,’tom’,’H’,63) on duplicate key update mask='F';

(3)查询表,检查姓名是否是sec开通,展示姓名,判断结果result

select firstname,(case when firstname like 'sec%' then 'T' else 'F' end) as result from su;

(4)查询表中所有列的数据,按照成绩进行排序,并显示名次(position),名次为连续的。要求展示所有字段,名字字段为position

select * ,dense_rank() over (order by score desc) as postition from su;

2、数据库对象管理及SQL应用2

-- 基于以下学生成绩事实表和维度表,完成以下实验要求。
-- 创建表
create table student (student_id int,math int,phy int,art int,m2 int);
create table weight(weight_no int,math numeric,phy numeric,art numeric,m2 numeric);
-- 导入数据
insert into student values(1,80,70,87,90);
insert into student values(2,80,70,87,90);
insert into student values(3,81,80,69,96);
insert into student values(4,89,86,89,93);
insert into student values(5,84,87,97,90);
insert into student values(6,89,79,88,91);
insert into student values(7,83,78,84,92);
insert into student values(8,84,79,89,93);
insert into student values(9,85,76,87,91);
insert into student values(10,90,90,84,93);
insert into weight values(1,0.4,0.3,0.2,0.1);
insert into weight values(2,0.1,0.2,0.3,0.4);

(1)求math、phy总成绩以及art、m2的总成绩

select student_id,math+phy as sum_m_p,art+m2 as sum_a_m from student;

(2)根据维度表、安装两种加权算法算出每个学生的加权成绩,展示包含student_id,weitht_sum,单个学生加权成绩可以两行输出

select s.student_id,(s.math*w.math + s.phy*w.phy + s.art*w.art + s.m2*w.m2)as weight_sum from student s,weight w;

--------------------------------------------有歧义(产生笛卡尔积)----------------------------------------------

(3)根据维度表,安装两种加权算法技术出每个学生的加权成绩,展示包含student_id,weight_sum,单个学生加权成绩要求一行输出

select s.student_id,w1.weight1_sum,w2.weight2_sum from 
student s join 
(select s.student_id,s.math*w.math+s.phy*w.phy+s.art*w.art+s.m2+w.m2 as weight1_sum from student s,weight w where w.weight_no=1) w1 on s.student_id=w1.student_id
 join 
(select s.student_id,s.math*w.math+s.phy*w.phy+s.art*w.art+s.m2+w.m2 as weight2_sum from student s,weight w where w.weight_no=2) w2 on s.student_id=w2.student_id;
--------------------------------------------有歧义(产生笛卡尔积)----------------------------------------------

(4)对两种加权总成绩进行排序。要求输出格式student_id,weight_sum、rank1、weight2_sum、rank2

--将第三题作为查询表进行分组排序
select student_id,weight1_sum,dense_rank() over (partition by 1 order by weight1_sum desc)as rank1,weight2_sum,dense_rank() over (partition by 1 order by weight2_sum desc)as rank2 from 
(select s.student_id,w1.weight1_sum,w2.weight2_sum from student s 
join 
(select s.student_id,s.math*w.math+s.phy*w.phy+s.art*w.art+s.m2*w.m2 as weight1_sum from student s,weight w where w.weight_no=1) w1 on s.student_id=w1.student_id 
join 
(select s.student_id,s.math*w.math+s.phy*w.phy+s.art*w.art+s.m2*w.m2 as weight2_sum from student s,weight w where w.weight_no=2) w2 on s.student_id=w2.student_id);

--------------------------------------------有歧义(产生笛卡尔积)----------------------------------------------

3、账本数据库

-- 准备工作
-- 开启
show enable_ledger;
-- 查看
gs_guc reload -Z coordinator -Z datanode -N all -I all -c "enable_ledger=on";

(1)创建防篡改模式ledgernsp

create schema ledgernsp with blockchain;

(2)创建防篡改用户表usertable

create table ledgernsp.usertable(id int,name text);

(3)校验指定防篡改用户表的表级数据hash值与其对应历史表hash一致性

select ledger_hist_check('ledgernsp','usertable');
-- 二选一
SELECT pg_catalog.ledger_hist_check('ledgernsp','usertable');

(4)校验指定防篡改用户表对应的历史表hash与全局历史表对应的relhash一致性

select ledger_gchain_check('ledgernsp','usertable');
-- 二选一
SELECT pg_catalog.ledger_gchain_check('ledgernsp', 'usertable');

4、安全审计

(1)用SQL查看审计是否打开

show audit_enabled;
--也可以基于gs_setting系统视图查看
select name,setting from pg_settings where name='audit_enabled';

(2)用SQL查看日志存储最大空间

select name ,setting from pg_settings where name='audit_space_limit';

(3)查看过去一天所有产生审计日志的总数,当前时间要求使用now()

select count(*) from pg_query_audit(now()-1,now());

(4)查看过去一天user1这个用户登录postgres数据库,当前是要要求使用now()

select * from pg_query_audit(now()-1,now()) where type='login_success' and username = 'user1' and database='postgres';

(5)删除’2020-09-20 00:00:00’到’2020-09-21 23:59:59’时间段的审计记录

select pg_delete_audit('2020-09-20 00:00:00','2020-09-21 23:59:59');

(6)删除数据库DB2:级联删除用户user1

drop database db2;
drop user user1 cascade;

5、存储过程

基于以下信息表,完成以下实验要求。
--创建表
create table aps_student(logid serial,starttime timestamp(0) not null,primary key (logid));

(1)编写存储过程,生成记录,传入学生个数,学生LOGID从1000000开始,starttime为当前时间

create procedure create_student_informantion(num int) as 
declare id int;
i int;
begin
	id := 1000000;
	for i in 1..num loop
		insert into aps_student values(id,now());
		id := id+1;
		dbe_output.print_line('id='||id);
		end loop;
end;
/

(2)用上一操作初始化90000学生

call create_student_informantion(90000);

(3)查出aps_student表中初始化学生个数

select count(*) from aps_student;

6、触发器

当前有两张表一张学生表student(id、name)、score(id,math,XX,xx);

(1)创建触发器,删除学生表中记录时,同步删除score中学生的记录

-- 创建触发器函数
create or replace function tri_delete_func() returns trigger as
$$
declare
begin
	delete from score where id=old.id;
	return old;
end;
$$ language plpgsql;

-- 创建触发器
create trigger delete_trigger before delete on student for each row execute procedure tri_delete_func();

7、性能优化

当前有一张test(id、kemu、classID、grade),里面有8万条数据

(1)查202202班级里面语文最低分是多少,要保障走索引

-- 创建索引
create index index_kemu on test(kemu);
create index index_classid on test(classid);

-- 查询202202班级里面语文最低分
select min(grade) from test where kemu='yuwen' and classid=202202;

(2)查询202202班级同一科目成绩比202201班级最高分高的同学,根据一下SQL优化重写

SQLselect * from test t1 where t1.classid=202202 and grade > (select max(grade) from test t2 where t2.classid=202201);


select * from test t1 join (select min(grade) as min_grade from test t2 where t2.classid=202201) t3 on t1.grade<t3.min_grade where t1.classid=202202;
--原SQL中存在子查询,每扫描异常t1表,会遍历子查询结果,性能较差,改成join方式,消除子查询,性能有xxxms提升至xxms。


------------------------------------------------我的---------------------------------------------------------
select * from test2 t1 where t1.classid=202202 and grade >(select max(grade) from test2 t2 where t2.classid=202201) and t1.pro = (select pro from test2 where classid=202201 order by grade desc limit 1);

3.1 使用gs_probackup进行物理备份

gs_probackup是一个用于管理openGauss数据库备份和恢复的工具。它具有以下特点:

  • 可用于备份单机数据库或者主节点数据库,为物理备份
  • 可备份外部目录的内容,如脚本文件、配置文件、日志文件等
  • 支持增量备份定期备份远程备份
  • 可设置备份的留存策略

使用流程:

  1. 初始化备份目录:

    bash

    gs_probackup init -B backup-path
    
  2. 添加备份实例:

    bash

    gs_probackup add-instance -B backup-path -D pgdata-path --instance=instance_name
    
  3. 执行备份:

    bash

    gs_probackup backup -B backup-path --instance=instance_name -b backup-mode
    
  4. 验证备份:

    bash

    gs_probackup validate -B backup-path --instance=instance_name
    

3.2 使用gs_probackup进行恢复

当数据库出现故障时,可以使用以下命令进行恢复:

bash

gs_probackup restore -B backup-path --instance=instance_name -D pgdata-path

重要提示: 使用restore子命令前,应先停止gaussdb进程。

3.3 使用gs_backup进行系统级备份

gs_backup工具可帮助openGauss备份、恢复重要数据。

备份数据库主机:

bash

gs_backup -t backup --backup-dir=BACKUPDIR -h HOSTNAME --parameter --binary --all

恢复数据库主机:

bash

gs_backup -t restore --backup-dir=BACKUPDIR -h HOSTNAME --parameter --binary --all

4 云数据库GaussDB备份恢复

对于云上的GaussDB实例,华为云提供了控制台操作方式进行备份恢复。

4.1 创建手动备份

  1. 登录管理控制台,进入GaussDB实例页面
  2. 在"实例管理"页面,选择指定的实例,在操作列选择"创建备份"
  3. 在创建备份弹出框中,命名该备份,选择备份方式,并添加描述
  4. 单击"确定",提交备份创建

手动备份特点:

  • 备份名称长度在4~64个字符之间,必须以字母开头
  • 手动备份会一直保存,直到用户手动删除
  • 备份方式支持物理备份快照备份一级备份

4.2 恢复实例数据

GaussDB支持多种恢复方式,满足不同业务需求:

  1. 恢复到新实例:创建一个和备份时间点数据相同的新实例,不影响原实例
  2. 恢复到当前实例:将当前实例上的数据全部覆盖,恢复过程中数据库不可用
  3. 恢复到已有实例:将备份数据恢复到已有实例,会覆盖目标实例的数据

操作步骤:

  1. 在"备份恢复管理"页面,选择需要恢复的备份,单击操作列的"恢复"
  2. 选择恢复方式(新实例、当前实例或已有实例)
  3. 根据提示完成参数配置
  4. 提交恢复任务并等待完成

4.3 下载备份文件

用户可以将GaussDB的备份文件下载到本地,用于本地存储归档

下载步骤:

  1. 在"备份恢复"页面,选择需要下载的可用备份,单击操作列的"下载"
  2. 下载方式选择"OBS Browser+下载",单击"确定"
  3. 使用OBS Browser+客户端下载备份文件

5 高级备份恢复场景

5.1 增量备份策略

Roach备份工具支持增量备份,可显著减少备份所需时间和存储空间。

增量备份示例:

bash

python GaussRoach.py -t backup --master-port 6000 --media-destination /backup/media --media-type Disk --metadata-destination /backup/media/metadata --parallel-process 3 --compression-level 6 --prior-backup-key 20200629_161652

5.2 账本数据库恢复

对于账本数据库,GaussDB提供了专门的修复函数:

sql

-- 对某个DN节点进行历史表修复操作
EXECUTE DIRECT ON (datanode1) 'select pg_catalog.ledger_hist_repair(''ledgernsp'', ''usertable'');';

-- 执行全局区块表修复操作
SELECT pg_catalog.ledger_gchain_repair('ledgernsp', 'usertable');

5.3 表级时间点恢复

GaussDB支持将数据库中的单个或者某些表恢复到指定时间点,这在误删除少量数据时非常有用,无需恢复整个实例。

6 备份恢复策略最佳实践

6.1 备份策略建议

  1. 定期自动备份:设置定期自动备份策略,确保数据安全
  2. 多地存储:将备份文件存储在不同地理位置,提高容灾能力
  3. 定期验证:定期验证备份文件的完整性和可恢复性
  4. 监控告警:设置备份失败告警,及时处理备份异常

6.2 恢复演练计划

  1. 定期演练:每季度至少进行一次恢复演练
  2. 文档记录:详细记录恢复步骤和注意事项
  3. 团队培训:确保多名管理员掌握备份恢复技能

6.3 性能优化建议

  1. 业务低峰期:在业务低峰期执行备份操作
  2. 增量备份:结合全量备份和增量备份,平衡效率与可靠性
  3. 并行处理:适当使用并行备份提高效率

7 常见问题与解决方案

问题1:自动备份失败怎么办?

可能原因和解决方案:

  • 网络环境稳定性不足:系统会自动重试,也可手动备份
  • 实例状态异常:等待实例恢复正常后再次执行备份
  • 参数修改异常:检查参数设置,恢复默认参数重启实例

问题2:如何找回误删除的数据?

  • 使用备份文件恢复:通过备份恢复误删除的数据
  • 表级时间点恢复:如果只是部分表数据丢失,可使用表级恢复

问题3:备份文件如何收费?

  • GaussDB提供了和实例磁盘大小相同的免费存储空间
  • 只有超过免费容量的存储空间才开始计费
  • 手动备份不会随实例删除而自动删除
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。